当前位置:   article > 正文

Unity物体移动的几种方式_unity插值移动

unity插值移动

主要是Vector3的内置函数以及CharacterController的Move

还有一个固定的每帧进行移动的操作

  1. using UnityEngine;
  2. public class MoveTest : MonoBehaviour
  3. {
  4. //移动的目标
  5. private Transform _targetTrans = null;
  6. //移动的速度
  7. private float _moveSpeed = 0.1f;
  8. //移动到的目标位置
  9. private Vector3 _endPos = new Vector3(9, 0, 0);
  10. //是否移动结束
  11. private bool _isMoveEnd = false;
  12. private Vector3 _curSpeed;
  13. private CharacterController _ccCtrl = null;
  14. private Vector3 _updateMove = new Vector3(0.1f, 0, 0);
  15. //定义个结束的回调
  16. private delegate void MoveFinishedCallBack();
  17. private event MoveFinishedCallBack MoveFinishedEvent;
  18. void Start()
  19. {
  20. //查找出要移动的目标物体
  21. _targetTrans = transform.Find("Sphere");
  22. if (_targetTrans != null)
  23. {
  24. _ccCtrl = _targetTrans.GetComponent<CharacterController>();
  25. if (_ccCtrl == null)
  26. {
  27. _ccCtrl = _targetTrans.gameObject.AddComponent<CharacterController>();
  28. }
  29. }
  30. MoveFinishedEvent += OnMoveFinished;
  31. }
  32. void Update()
  33. {
  34. if (_targetTrans != null)
  35. {
  36. //1. 使用Translate进行移动
  37. //使用向量的长度来确定是否移动完成
  38. //if (_endPos.magnitude >= _targetTrans.position.magnitude && !_isMoveEnd)
  39. //{
  40. // //沿X轴正向进行移动
  41. // _targetTrans.Translate(Vector3.right * _moveSpeed);
  42. //}
  43. //2. 使用Lerp插值进行移动 [就是在两个位置之前,每次增加剩余距离的百分比]
  44. // 2.1 先快后慢的运动,因为每次插值之后,剩余的距离在变小
  45. //_targetTrans.position = Vector3.Lerp(_targetTrans.position, _endPos, 0.05f);
  46. // 2.2 匀速的移动 用移动的距离差来和时间相乘
  47. //float distance = 1 / ((_targetTrans.position - _endPos).magnitude);
  48. //_targetTrans.position = Vector3.Lerp(_targetTrans.position, _endPos, distance * 0.05f);
  49. //3. SmoothDamp平滑移动 [当前位置,目标位置,移动速度,移动时长] 有点类似于插值,但是是比较平滑的移动
  50. //_targetTrans.position = Vector3.SmoothDamp(_targetTrans.position, _endPos, ref _curSpeed, 1.0f);
  51. //4. 使用CharacterController进行移动 【参数就是每帧移动的距离】
  52. //_ccCtrl.Move(Vector3.right * 2 * Time.deltaTime);
  53. //5. 直接按每帧进行移动固定的位置
  54. if (_endPos.magnitude >= _targetTrans.position.magnitude && !_isMoveEnd)
  55. {
  56. _targetTrans.position += _updateMove;
  57. }
  58. //移动结束的判断
  59. if (!_isMoveEnd && _targetTrans.position.magnitude >= _endPos.magnitude)
  60. {
  61. _isMoveEnd = true;
  62. if (MoveFinishedEvent != null)
  63. {
  64. MoveFinishedEvent();
  65. }
  66. }
  67. }
  68. }
  69. private void OnMoveFinished()
  70. {
  71. Debug.Log("移动完成了,隐藏移动节点!");
  72. _targetTrans.gameObject.SetActive(false);
  73. }
  74. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/112653
推荐阅读
相关标签
  

闽ICP备14008679号