在Unity中对于物体移动有多种方法,这里根据b站up主【鼓励Jun】的视频整理了一些笔记
变量声明:
位移向量var dir=new Vector3(deltax.deltay,deltaz);
移动速度var speed=2;
ps:变量声明都在主要都在方法外,实际位移操作则在Update方法中。
获取位移
#键盘输入,这里举一个只x轴上移动的例子,y轴同理
var xmove=Input.GetAxis(“Horizontal”);
dir=new Vector3(xmove,0,0)
var是隐式声明,也可以根据实际的改为Vector3、int什么的。
1、 直接改变物体位置。
1.1 在update方法中transform.position+=dir;
1.2 在update中transform.Translate(dir);
以上两种方式本质是一样的,translate实现的就是transform.position+=dir;
以上两种办法要考虑帧数不定的问题,所以位移向量dir要乘以速度speed再乘以Time.deltaTime();即
transform.Translate(dir*speed*Time.deltaTime());
2、 移动到某个位置
2.1以某个速度到达某个位置
#需要一个目标位置
Vector3 targetPos;transform.position=Vector3.MoveTowards(transform.position,targetPos,speed*Time.deltaTime);
更平滑一点
#需要一个目标位置
Vector3 targetPos;
#一个平滑时间
var smoothTime;
#一个速度向量
Vector3 velocity=Vector3.zero;
然后
transform.position=Vector3.SmoothDamp(transform.position,targetPos,speed);
这里不需要乘以一个增量时间,因为这个方法的底层实现已经考虑到了。
2.2在时间t内到达某个位置
Transform.position=Vector3.Lerp(transform.position,targetPos,smooth);
#smooth是持续时间和运行时间的比值,一般小于1(传参的时候传个大于1的数也不会报错),持续时间是指从开始像位置移动到当前的时间,运行时间是你期望的到达所需时间。
以上方法缺点,在Unity中可能会出现抖动,或者会穿过刚体(Lerp会);
所以接下来还有刚体的移动方法。
3.加力。(即有加速度,速度会变化)
#获取刚体
Rigidbody2D rb=GetComponent();
#定义一个力
var force;
#定义力的方向
Vector3 dir;(dir可以根据输入赋值更改)
rb.AddForce(dir*force);
这个方法,速度会加快。碰到刚体不会抖动。
4.恒定速度
#将速度向量赋给物体速度,速度向量可以根据键盘输入获取
rb.velocity= new Vector3(deltax,deltay,deltaz);
以上是2d的移动(也适用相机)。