【精选】Unity学习01

您所在的位置:网站首页 unity中物体移动代码 【精选】Unity学习01

【精选】Unity学习01

#【精选】Unity学习01| 来源: 网络整理| 查看: 265

1. unity物体移动方式之坐标变换(可能会出现穿过刚体的情况,但是简单快捷) 1.1直接对物体坐标进行操作 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

1.2或者直接修改transform的position的值 transform.position += (target - gameObject.transform.position) * moveSpeed * Time.deltaTime; transform.position += (target - gameObject.transform.position).normalized * moveSpeed * Time.deltaTime;

Vector3.normalized就是把一个方向向量变成单位向量(平方和为一),忽略两个点之间的距离的影响,强调方向

不加这个归一化向量的话,当目标离我越远,我移动越快,越靠近目标就我的移动就越慢 加了归一化就我的坐标变化速度就主要受moveSpeed影响

1.3 通过一个函数得到下一帧物体要到达的位置再进行移动 1.3.1 以固定的速度移动到目标位置 public static Vector3 MoveTowards(Vector3 current, Vector3 target, float maxDistanceDelta) 将物体从current位置沿直线移动到target位置。maxDistanceDelta是每次调用移动的距离。返回值是current + maxDistanceDelta,如果这个值超过了target,返回值就是target。(就是说每次调用只往target方向移动 maxDistanceDelta 这么远)如果要实现匀速运动那就得多次调用(写在Updata或者FixeUpdata里) transform.position = Vector3.MoveTowards(transform.position, target.transform.position, Time.deltaTime * speed); 1.3.2 平滑一点到达目标位置 public static Vector3 SmoothDamp(Vector3 current, Vector3 target, ref Vector3 currentVelocity, float smoothTime, float maxSpeed) 将物体从current位置沿直线移动到target位置。currentVelocity 当前速度smoothTime 平滑时间maxSpeed 最大速度(不需要Time.deltaTime 底层实现已解决帧数问题)返回值是 transform.position = Vector3.SmoothDamp(transform.position, target.transform.position, ref velocity,smoothTime,speed); 1.3.3 在规定时间内到达地点 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 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); } 将物体从current位置沿直线移动到target位置。t 是一个百分比 详情看下面例子返回值是下一帧我应该在的位置 Vector3 target; float lerpDuration = 4; //完成运动所需时间 float _timeElapsed = 0; //记录运行时间 private void Update() { _timeElapsed += Time.deltaTime; //计算时间的比例 if (_timeElapsed var pos = dir * (speed * Time.fixedTime); //dir 目标方向 speed速度 gameObject.GetComponent().MovePosition(transform.position+ pos); }

详情: UnityAPI:velocity属性——刚体速度 Unity中的ForceMode——纠正《UnityAPI解析——陈泉宏》一书 关于ForceMode的注解 unity物体移动三种方式之——AddForceAtPosition(一) 物体移动——三种方法 Unity Movetowards方法 【Unity】如何优雅地移动物体?8种方式



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3