当前位置:   article > 正文

Unity中物体移动方法详解_unity中movetowards

unity中movetowards

一:Transform

——transform.Translate:不会考虑到碰撞
transform.Translate(Vector3 targetPos,指定参照坐标系(默认为Space.Self))


——transform.position:直接改变物体的坐标


二:刚体

——MovePosition


——velocity:使物体忽略静摩擦力,从静止状态快速进入运动状态


——AddForce:给物体添加一个方向力

FoeceMode:例如物理质量m为2,力f为(10,0,0),已知动量定理:F*t = m*v
——Force:添加一个可持续力到刚体,使用它的质量
10*0.02=2*v,速度为0.1m/s
——Acceleration:添加一个可持续加速度到刚体,忽略它的质量
忽略质量则质量m为默认1,10*0.02=1*v,速度为0.2m/s
——Impulse:添加一个瞬间冲击力到刚体 ,使用它的质量( 爆炸或碰撞力量 )
采用瞬间力,则不使用系统的时间间隔,默认t为1,10*1=2*v,速度为5m/s
——VelocityChange:添加一个瞬间速度变化给刚体,忽略它的质量
忽略质量则质量m为默认1,采用瞬间力,则不使用系统的时间间隔,默认t为1,10*1=1*v,速度为10m/s


三:角色控制器

——SimpleMove:模拟重力,返回值表示当前角色是否着地


——Move:不模拟重力,返回值表示角色于周围的碰撞信息


四:平滑

——Lerp:线性插值移动(先快后慢)

Lerp函数的计算公式:a+t(b-a)

假如从起始点a点到目标点b点,当前运动到的点为c点,需要求出已经运动的距离占总距离的多少,也就是a和c的距离占a和b的距离的比例
那么t=(c-a)/(b-a),解出tb-ta=c-a,所以t(b-a)=c-a,则c=t(b-a)+a
它是一种无限接近的移动,一般需要自己判断一下如果距离目标点小于某个值就直接设置成目标点

  1. using System;
  2. using UnityEngine;
  3. public class Test : MonoBehaviour
  4. {
  5. public GameObject go;
  6. public Transform targetTran;
  7. private float t = 0.01f;
  8. private void Update()
  9. {
  10. if (Vector2.Distance(go.transform.position, targetTran.position) <= 0.2f)
  11. {
  12. go.transform.position = targetTran.position;
  13. }
  14. go.transform.position = Vector3.Lerp(go.transform.position, targetTran.position, t);
  15. }
  16. }

两种方式使用Lerp实现匀速移动的指定时间到达目标点

  1. using System;
  2. using UnityEngine;
  3. public class Test : MonoBehaviour
  4. {
  5. public GameObject go;
  6. public Transform targetTran;
  7. private Vector3 startPos;
  8. private float totalTime = 5;
  9. Vector3 deltaPos;
  10. public void Start()
  11. {
  12. startPos = go.transform.position;
  13. deltaPos = Vector3.Lerp(startPos, targetTran.position, Time.fixedDeltaTime / totalTime) - startPos;
  14. }
  15. private void FixedUpdate()
  16. {
  17. if (Vector2.Distance(go.transform.position, targetTran.position) <= 0.2f)
  18. {
  19. go.transform.position = targetTran.position;
  20. }
  21. go.transform.position += deltaPos;
  22. }
  23. }
  1. using System;
  2. using UnityEngine;
  3. public class Test : MonoBehaviour
  4. {
  5. public GameObject go;
  6. public Transform targetTran;
  7. private Vector3 startPos;
  8. private float totalTime = 7;
  9. public void Start()
  10. {
  11. startPos = go.transform.position;
  12. }
  13. private void Update()
  14. {
  15. Vector3 targetPos = Vector3.Lerp(startPos, targetTran.position, (Time.time - 0) / totalTime);
  16. go.transform.position = targetPos;
  17. }
  18. }


——SmoothDamp:平滑阻尼移动,与Lerp效果类似(先快后慢),只不过效果更加平滑,常用于相机跟随操作
因为它不像Lerp那么简单它的内部参数经过了很多次的调整所以效果会更加平滑


——MoveTowards:匀速移动(其实向目标点的最后一次移动会有偏差)
maxDelta参数表示每次移动最大的距离,不会超过这个值


——Slerp:球形插值


五:特殊

——Mathf.PingPong:乒乓循环运动,返回一个[t,length)的值

  1. using UnityEngine;
  2. public class Test : MonoBehaviour
  3. {
  4. public GameObject go;
  5. private float moveDis = 3;
  6. private float totalTime = 5;
  7. private Vector3 startPos;
  8. private float v;
  9. public void Start()
  10. {
  11. startPos = go.transform.position;
  12. }
  13. private void Update()
  14. {
  15. v += Time.deltaTime * moveDis / totalTime;
  16. float x = Mathf.PingPong(v, moveDis);
  17. go.transform.position = startPos + new Vector3(x, 0, 0);
  18. }
  19. }

注意PingPang的内部实现中,length会作为分子出现,如果length为0时会报NaN(Not a Number)的错误。

Unity中关于NaN的问题:Unity中关于NaN的问题


——Math.Repeat:返回一个[t,length)的值

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号