赞
踩
Transform.Translate(Vector3 translation),Space relativeTo)
前一个变量是物体的移动速度,这里的速度是一个矢量,既包含大小写包含方向。
后一个变量是相对坐标系,这里的相对坐标系有两个值,一个是世界坐标,一个是自身坐标,如果第一个坐标不填写的话,默认为自身坐标系。
Transform.Translate()的内部实现其实也是 transform.position +=
这种方式
写在Update里面
transform.Translate(Vector3.up * Time.deltaTime, Space.Self);
transform.Translate(new Vector3 (1,1,1) * Time.deltaTime, Space.World);
Time.deltaTime代表后一帧时间减去前一帧时间,相当于每一帧时间的间隔,不加Time.deltaTime代表每帧的移动速度,加了就代表每秒的移动速度,可用于平衡不同电脑不同帧数导致的差异。
因为 Update 的帧间隔与电脑性能有关,而物体受力和帧间隔时间有关会导致物体受力不均匀从而导致物体异常抖动(不是很理解这句话)
可以写在 Fixupdate(固定物理帧) 中解决,因为 Update 帧间隔不固定,而 Fixupdate
固定0.02s Fixupdate里建议使用Time.fixedDeltaTime
transform.position += (target - gameObject.transform.position) * moveSpeed * Time.deltaTime;
transform.position += (target - gameObject.transform.position).normalized * moveSpeed * Time.deltaTime;
Vector3.normalized就是把一个方向向量变成单位向量(平方和为一),忽略两个点之间的距离的影响,强调方向
不加这个归一化向量的话,当目标离我越远,我移动越快,越靠近目标就我的移动就越慢
加了归一化就我的坐标变化速度就主要受moveSpeed影响
public static Vector3 MoveTowards(Vector3 current, Vector3 target, float maxDistanceDelta)
transform.position = Vector3.MoveTowards(transform.position, target.transform.position, Time.deltaTime * speed);
public static Vector3 SmoothDamp(Vector3 current, Vector3 target, ref Vector3 currentVelocity, float smoothTime, float maxSpeed)
transform.position = Vector3.SmoothDamp(transform.position, target.transform.position, ref velocity,smoothTime,speed);
public static float Lerp(float a, float b, float t) //每次走ab直接距离的t倍 { return a + (b - a) * Clamp01(t); } public static float Clamp01(float value) //限制是小数 { if (value < 0f) return 0f; if (value > 1f) return 1f; return value; } public static Vector3 Lerp(Vector3 a, Vector3 b, float t) { t = Mathf.Clamp01(t); return new Vector3(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t, a.z + (b.z - a.z) * t); }
Vector3 target;
float lerpDuration = 4; //完成运动所需时间
float _timeElapsed = 0; //记录运行时间
private void Update()
{
_timeElapsed += Time.deltaTime; //计算时间的比例
if (_timeElapsed < lerpDuration) //如果在规定时间内 第一次走距离的 1/4 第二次走剩下距离的 2/4
transform.position = Vector3.Lerp(transform.position, target, _timeElapsed / lerpDuration);
else //如果超出时间就直接到达 如果不这样写会永远到不了
transform.position = target;
}
在刚体上添加不同方向的力,从而实现物体的移动,还可以添加力的方式(移动速度与物理特性有关如质量、阻力和重力),但每执行一次只能添加一次力,要想持续运动还得持续调用该方法
public void AddForce(Vector3 force)
public void AddForceAtPosition(Vector3 force, Vector3 position,ForceMode mode);
关于作用力方式 ForceMode 的功能注解
ForceMode 为枚举类型,用来控制力的作用方式,有4个枚举成员
2D中ForceMode2D只有Force和Impulse
3D中有Force、Acceleration、Impulse和VelocityChange
gameObject.GetComponent<Rigidbody>().AddForce(fore);
功能说明: 此属性用于设置或返回刚体的速度值,其使用说明如下。
在脚本中无论是给刚体赋予一个Vector3类型的速度向量v,还是获取当前刚体的速度v,v的方向都是相对世界坐标系而言的。
velocity的单位是米每秒,而不是帧每秒,其中米是Unity默认的长度单位。
public Vector3 velocity{get;set;}
r1.velocity=new Vector3(0.0f,0.0f,-15.0f);
public void MovePosition(Vector2 position)
在Rigidbody2D的BodyType为Kinematic是不会受到重力和AddForece()等相关函数影响的 ,直接把物体移动到目标位置但是有物理效果
private void FixedUpdate()
{
var pos = dir * (speed * Time.fixedTime); //dir 目标方向 speed速度
gameObject.GetComponent<Rigidbody2D>().MovePosition(transform.position+ pos);
}
详情:
UnityAPI:velocity属性——刚体速度
Unity中的ForceMode——纠正《UnityAPI解析——陈泉宏》一书 关于ForceMode的注解
unity物体移动三种方式之——AddForceAtPosition(一)
物体移动——三种方法
Unity Movetowards方法
【Unity】如何优雅地移动物体?8种方式
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。