直接贴代码了

using UnityEngine;
using System;
using System.Collections;
using System;
using DataTable;public class ObjDropItem : ObjBase {//类型public override OBJ.TYPE GetObjType() { return OBJ.TYPE.DROPITEM; }public const float MAXSPEED = 20;enum State{Load,Delay,Droping,StayOnGround,Pickup,FlyToPlayer,Destory,}//外置表现参数[Tooltip("飞到玩家身上那个高度位置")]public float PlayerOffset = 1.4f;[Tooltip("开启安全模式(TotalLifeTime秒后强制删除)")]public bool SafeMode = true;[Tooltip("存在最长时间(秒)")]public float TotalLifeTime = 300;[Tooltip("掉落都地上高度")]public float DropHight = 0.5f;[Tooltip("掉落都地上用时")]public float DropTime = 0.3f;[Tooltip("多长时间后出现")]public float DelayTime = 0.5f;[Tooltip("自动拾取距离")]public float AutoPickUpDistance = 2.0f;[Tooltip("在地上呆的时间")]public float DropOverDelayTime = 0.2f;[Tooltip("物品速度")][Range(0, 15)]public float MoveSpeed = 10.0f;[Tooltip("距离多少是已经飞到玩家身上")]public float MaxDistance = 0.2f;[Tooltip("控制点离我的直线距离")]public float ControlPointOffsetDistance = 3.0f;[Tooltip("控制点高度")]public float ControlPointOffsetHeight = 2.0f;[Tooltip("控制点速度,必须要大于物品速度")][Range(15, 25)]public float ControlPointSpeed = 15.0f;[Tooltip("速度增量")][Range(0,2)]public float AccSpeed = 0.1f;DropItemController mController;//状态private State mState = State.Load;//生命时间private DateTime mLifeTime = DateTime.Now;//是否可以自动拾取private bool mCanAutoPickup = false;//拥有者idprivate bool mOwnerIsMe;//拥有者拾取保护时间private DateTime mOwnerPickUpProtectionTime;//飞往目标点(也就是服务端实际坐标)private Vector3 mTargetPos;//控制点private Vector3 mControlPoint;//控制点private bool mControlPointReached;//控制点速度private float mControlPointMoveSpeed;//移动速度private float mMoveSpeed;public virtual void Awake(){
#if !UNITY_EDITOR
try
{
#endifbase.Awake();#if !UNITY_EDITOR
}
catch (Exception ex)
{Logger.Error(ex.ToString());
}
#endif}//重置public override void Reset(){base.Reset();mState = State.Load;mLifeTime = DateTime.Now.AddSeconds(TotalLifeTime);mCanAutoPickup = false;mOwnerPickUpProtectionTime = DateTime.Now;}//初始化public override bool Init(InitBaseData initData, Action callback = null){base.Init(initData);Reset();InitDropItemData data = initData as InitDropItemData;mOwnerIsMe = false;mCanAutoPickup = false;var player = ObjManager.Instance.MyPlayer;if (player){if (player.GetObjId() == data.Owner){mOwnerIsMe = true;mCanAutoPickup = true;}}mOwnerPickUpProtectionTime = DateTime.Now.AddSeconds(data.RemianSeconds);mLifeTime = DateTime.Now.AddSeconds(TotalLifeTime);float height = GameLogic.Instance.Scene.GetTerrainHeight(data.TargetPos) + 0.1f;mTargetPos = new Vector3(data.TargetPos.x, height, data.TargetPos.y);LoadRes(() =>{if (true != data.PlayDrop){//需要播放掉落动画Position = mTargetPos;mState = State.StayOnGround;}else{//不需要播放掉落动画this.StartCoroutine(Delay());mState = State.Delay;}if (null != callback)callback();mController = mModel.GetComponent<DropItemController>();if (null != mController){mController.ShowModel(true);mController.ShowEffect(false);}});return true;}//是否可以被拾取public bool CanPickup(){if (State.StayOnGround != mState &&State.Pickup != mState){//只有停留在地上这种状态才能被拾取return false;}if (DateTime.Now<mOwnerPickUpProtectionTime){//当前时间在拥有者保护时间内return mOwnerIsMe;}else {//过了拥有者保护时间谁都可以拾取return true;}}void Update () {
#if !UNITY_EDITOR
try
{
#endifif (true==SafeMode){if (DateTime.Now > mLifeTime){//为了安全,怎么也该消失了Logger.Warn("Drop item[{0}] stays too long", mObjId);mState = State.Destory;if (ObjManager.Instance.FindObjById(mObjId).Equals(this)){ObjManager.Instance.RemoveObj(mObjId);}else{base.Destroy();}return;}}var player = ObjManager.Instance.MyPlayer;if (null == player)return;if (State.StayOnGround == mState){//停在地上if (CanPickup() && mCanAutoPickup){//可以自动拾取float distance = Vector2.Distance(player.Position.xz(), Position.xz());if (distance <= AutoPickUpDistance){//距离足够近var control = UIManager.Instance.GetController(UIConfig.SettingUI);if ((bool)control.CallFromOtherClass("CanPiackUpItem", new object[] { mDataId })){//是否可拾取这种类型物品Pickup();}mCanAutoPickup = false;}}}else if (State.FlyToPlayer == mState){//我拾取成功,物品正在往我身上飞var delta = Time.deltaTime;var temp = player.Position;temp.y += PlayerOffset;//控制点朝着主角飞if(!mControlPointReached){float distance = Vector2.Distance(temp, mControlPoint);if (distance <= MaxDistance){//当前已经飞到了mControlPointReached = true;}else{mControlPointMoveSpeed += delta * AccSpeed;mControlPointMoveSpeed = Math.Min(mControlPointMoveSpeed, MAXSPEED);float moveDis = mControlPointMoveSpeed * delta;if (moveDis >= distance){//这一步就飞到了mControlPointReached = true;}else{//继续移动var controlPointDir = (temp - mControlPoint).normalized;mControlPoint += controlPointDir * moveDis;}}}if (mControlPointReached){mControlPoint = temp;}{//自己朝着控制点飞float dis = Vector3.Distance(mControlPoint, Position);if (dis <= MaxDistance && mControlPointReached){mState = State.Destory;Destroy();return;}else{mMoveSpeed += AccSpeed * delta;mMoveSpeed = Math.Min(mMoveSpeed, MAXSPEED);float moveDis = mMoveSpeed * delta;if(moveDis>=dis){Position = mControlPoint;if (mControlPointReached){mState = State.Destory;Destroy();return;}}else{var dir = (mControlPoint - Position).normalized;Position = Position + dir * moveDis;}}}        }#if !UNITY_EDITOR
}
catch (Exception ex)
{Logger.Error(ex.ToString());
}
#endif
}//拾取public void Pickup(){if(CanPickup()){NetManager.Instance.SendPickUpItemRequest(GetObjId());mState = State.Pickup;}mCanAutoPickup = false;}protected virtual void LoadRes(Action callback = null){string prafabPath = "";var table = Table.GetItemBase(mDataId);if(null==table){Logger.Error("NULL==Table.GetItemBase({0})", mDataId);}else{var tableDrop = Table.GetDropModel(table.DropModel);if (null == tableDrop){Logger.Error("NULL==Table.GetDropModel({0})", table.DropModel);}else{prafabPath = tableDrop.ModelPath;}}if ("" == prafabPath){Logger.Error("null==prafabPath)");return;}UniqueResourceId = GetNextUniqueResourceId();var resId = UniqueResourceId;ComplexObjectPool.NewObject(prafabPath, model =>{if (resId != UniqueResourceId){return;}SetModel(model);//SetScale((float)tableDrop.aScale); 这个缩放放到prefab上if (null != callback){callback();}            });}void PlayDropSound(){var table = Table.GetItemBase(mDataId);if (null != table){var tableDrop = Table.GetDropModel(table.DropModel);if (null != tableDrop){SoundManager.Instance.PlaySoundEffect(tableDrop.SoundId);}}}IEnumerator Delay(){mState = State.Delay;var renderers = mModel.GetComponentsInChildren<Renderer>();foreach (var renderer in renderers){renderer.enabled = false;}yield return new WaitForSeconds(DelayTime);foreach (var renderer in renderers){renderer.enabled = true;}DropToTargetPos();}void DropToTargetPos(){mState = State.Droping;Vector3[] paths=new Vector3[3];paths[0] = Position;paths[1] = (mTargetPos+Position)/2;paths[1].y = Position.y + DropHight;paths[2] = mTargetPos;iTween.MoveTo(gameObject, iTween.Hash("path", paths, "movetopath", true, "orienttopath", false, "time", DropTime, "easetype", iTween.EaseType.linear, "oncomplete", "DropOver"));}void DropOver(){this.StartCoroutine(DropOverStay());}IEnumerator DropOverStay(){yield return new WaitForSeconds(DropOverDelayTime);mState = State.StayOnGround;PlayDropSound();}public override void Destroy(){if(State.FlyToPlayer==mState){return;}base.Destroy();}public void FlyToPlayer(){if (null != mController){mController.ShowModel(false);mController.ShowEffect(true);}var myPos = ObjManager.Instance.MyPlayer.Position;var dir = (Position-myPos).normalized;mControlPoint = Position + dir * ControlPointOffsetDistance;mControlPoint.y += ControlPointOffsetHeight;mControlPointMoveSpeed = ControlPointSpeed;mMoveSpeed = MoveSpeed;mControlPointReached = false;mState=State.FlyToPlayer;}}

  

转载于:https://www.cnblogs.com/mrblue/p/4916695.html

Unity3d 制作物品平滑运动相关推荐

  1. unity3d制作背包系统(3)--UI部分

    unity3d制作背包系统(3)–UI部分 UI这块比较大,花了挺长时间从项目中抠代码,也发现了原来项目中有这么多垃圾代码.这部分既要写代码,又要在unity3d中调整UI. 注:这篇文章下面的所有& ...

  2. 利用Unity3D制作简易2D计算器

    利用Unity3D制作简易2D计算器 标签(空格分隔): uiniy3D 1. 操作流程 在unity3DD中创建一个新项目 注意选择是2D的(因为默认3D) 在Assets框右键新建C#脚本 在新建 ...

  3. canvas 平滑运动_什么是电视上的运动平滑?人们为什么讨厌它?

    canvas 平滑运动 Willy Barton/Shutterstock.com威利·巴顿/Shutterstock.com If you've just bought a new TV, you ...

  4. ae制作小球轨迹运动_视频剪辑教程:AE动画教程,如何创建一个运动的小球

    本篇教程是通过AE制作一个弹跳运动的小球,整个教程比较简单,但是会带给你惊喜,教程主要分2个部分完成,感兴趣的同学们一起来学习一下AE动画教程吧. 教程分为两个部分: 一,怎么用AE做出这样的一个球. ...

  5. ae制作小球轨迹运动_AE教程AE特效:教你如何用AE创建一个弹跳运动的小球特效...

    这篇教程是通过AE制作一个弹跳运动的小球,整个教程比较简单,但是会带给你惊喜,教程主要分2个部分完成,感兴趣的同学们一起来学习一下吧. 操作步骤: 这个教程分为两个部分. 第一,怎么用AE做出这样的一 ...

  6. Unity3D制作3D虚拟漫游场景(二)

    传送门: Unity3D制作3D虚拟漫游场景(一) -------------------------------------------------------------------------- ...

  7. unity3d制作自己简单游戏场景

    下面演示一下如何用unity3d制作一个自己的游戏场景 1. 导入环境资源 Assets -> import packet -> environments 2. 新建terrain 3.在 ...

  8. BIGEMAP使用Unity3D制作真实地形的两种方法

    使用Unity3D制作真实地形的两种方法: 1.在SceneView中使用height tools直接绘制: 2.使用外部工具制作的heightmaps: 具体操作如下: 1.准备一块DEM数据,格式 ...

  9. Unity3D制作流动的水面

    这个游戏的画面效果在ipad上真的非常稀有,尤其是水面真的非常棒!水面的顶点位移是如何实现的呢?一波一波的,很逼真! 解答: Unity3D制作流动的水面,水流代码 : var scale = 10. ...

最新文章

  1. 全面综述:图像特征提取与匹配技术
  2. dubbo相关的知识点总结
  3. java 打印当月日历_Java打印日历表
  4. 45 | 打蛇打七寸:精准测试
  5. std::tie简单介绍
  6. 排序算法之选择排序(简单选择排序、堆排序)
  7. mysql ---事务
  8. lua mysql 字符串截取_Lua 截取字符串(截取utf-8格式字符串)
  9. 基于Elasticsearch 7.0 的从零开始构建知识图谱-win10测试
  10. Windows 10 超过Windows 7成为最受欢迎的操作系统
  11. air dots 配对_小米AirDots蓝牙耳机如何连接iPhone?小米Air连接苹果手机的方法
  12. 需求调第四篇--常用的调研工作方法
  13. 银联统一规范的收单业务消息域
  14. 传奇的缔造者——C语言之父访谈
  15. 盘点2020年受影响最大的十大行业和10大职业
  16. android viewpagerindicator tab,ViewPager系列之顶部滑动indicator+viewPager
  17. vscode超炫敲击特效嘎嘎帅!!!
  18. AMiner发布:2022年人工智能全球最具影响力学者榜单AI 2000
  19. gitlab运行后修改存储位置
  20. C#:图标生成小工具

热门文章

  1. 外卖CPS红包微信小程序源码免费分享
  2. Code for Rerun DropDownButtonFactory
  3. 《勇者斗恶龙 4 被引导的人们》再次突袭手游市场!
  4. 别输在不会表达上阅读笔记
  5. 扫雷TigerMinesweeper_01
  6. 【java】泛型方法的定义
  7. promise笔记(二)
  8. oppop r1c怎么设置语言中文,OPPO R1 用起来怎么样?我们的读者给出了答案
  9. python设置制表符的长度_Python展开制表符长度计算
  10. Vue引入第三方js库