今天面试时碰到了一道面试题,需要完成物体平移的功能。平常项目都是傻傻地直接用Animator实现需求,今天才发现想要实现这种简单地平移的效果,直接用代码就可以了(我真傻,真的(´;︵;`) )被自己蠢死了

1、Mathf.MoveTowards

Unity - Scripting API: Mathf.MoveTowards

public static float MoveTowards(float current, float target, float maxDelta); 

Mathf.MoveTowards方法的功能是返回一个浮点数,其值为current向target靠近的一个值。靠近多少呢?由maxDelta决定。

  • 若maxDelta < 0,则返回的浮点数将从current开始远离target;
  • 若maxDelta >= target,由于返回的浮点数最大只能为target,故返回的浮点数为target;

举个例子:

i = Mathf.MoveTowards(i, 10, 4);

若 i 的初值为0,运行一次 i 的值变为4,再运行一次变为8,再运行一次变为10

2、Vector3.MoveTowards

Unity - Scripting API: Vector3.MoveTowards

public static Vector3 MoveTowards(Vector3 current, Vector3 target, float maxDistanceDelta);

和Mathf.MoveTowards大同小异,返回的Vector3类型值取于current移向target直线距离的某处。
maxDistanceDelta就是移动的长度。

  • 若maxDistanceDelta< 0,则返回的Vector3将从current开始远离target;
  • 若maxDistanceDelta>= target,则返回最大值target;

3、与其他方法相结合

(1)与Update相结合

MoveTowards方法的精髓在于和Update结合使用。

public float yMax = 100;
public float speed = 2f;
void Update()
    Vector3 v = transform.localPosition;
    transform.localPosition = new Vector3(v.x, Mathf.MoveTowards(v.y, yMax, speed), v.z);

运行脚本,物体就会延着y轴平移,直到它在y轴方向的值达到yMax。speed越大,移动速度越快。

当然也可以speed * Time.deltaTime,可以无视帧率来决定移动速度。

Vector3.MoveTowards的写法也是大同小异:

public Vector3 vector3 = new Vector3(100, 100, 100);
public float speed = 2f;
void Update()
    transform.position = Vector3.MoveTowards(transform.position, vector3, speed);

运行脚本,物体平移至vector3位置

(2)与IEnumerator相结合

MoveTowards方法也可以和协程结合使用。

private IEnumerator IEMoveFillAmount(Image image, float speed)
    while (image.fillAmount < 1)
        image.fillAmount = Mathf.MoveTowards(image.fillAmount, 1, speed / 100);
        yield return new WaitForSeconds(0.01f);

上述代码的功能是使Image的fillAmount按每0.01秒增加speed / 100的速度增大,直到image.fillAmount大于等于1

4、Lerp方法

如果不想让物体做匀速运动,可以巧妙地运用Lerp方法,使物体做匀加速运动
Unity - Scripting API: Mathf.Lerp

public static float Lerp(float a, float b, float t); 

Unity - Scripting API: Vector3.Lerp

public static Vector3 Lerp(Vector3 a, Vector3 b, float t);

不过这就是其他的内容了,这里只给个思路

喜欢的话,可以点赞呦~

今天面试时碰到了一道面试题,需要完成物体平移的功能。平常项目都是傻傻地直接用Animator实现需求,今天才发现想要实现这种简单地平移的效果,直接用代码就可以了(我真傻,真的(´;︵;`) )被自己蠢死了1、Mathf.MoveTowardsUnity - Scripting API: Mathf.MoveTowardspublic static float MoveTowards(float current, float target, float maxDelta); Mathf.MoveTo
MoveTowards、Lerp、Slerp 这三个函数相信大家经常遇到,这些都是在做一些过渡操作时需要用到的,那么它们间的具体差别是什么呢?其实要搞清楚它们的区别,只要仔细看官方说明,明白它们的具体用途是什么。 MoveTowards Mathf、Vector2、Vector3等许多类都有这个方法,意思都差不多。以Vector3为例: 函数原型为: public static Vecto
guidetip.gameObject.transform.position = Vector3.MoveTowards(guidetip.gameObject.transform.position, guideendposition, Time.deltaTime * 300); 调用一次,移动中途会终止,不能完整移动 调用两次,可以完整移动 具体原因不明,应该是Unity的一个bug,可能与线程有关 一般用于相机的移动 diff=Vector3.MoveTowards(transform.position,transform.position+acc,3f* Time.fixedDeltaTime) public staticVector3MoveTowards(Vector3current,Vector3target, floatmaxDistanceDelta); current 移动的开始位置。 public static float Lerp(float a, float b, float t); 解释:根据t在a b之间进行线性差值 返回结果:插值的浮点数结果介于两个浮点数值之间 这个函数的作用就是将值a增加/减少到值b,而增加/减少的过程是根据t来决定的。 t的取值范围是[0~1],相当于百分比 当初始值为0时,每次返回的结果就是 5,7.5,8.75…直到结果等于10。 如果t = 0.6f,返回结果为6,8.4,9.36… Mathf.MoveTowards
1,Mathf.Lerp(float a, float b, float t):线性插值,如果需要达到t值,需要一个逐渐变大的t值。 另外可以将a设置为当前结果,t设置为一个恒定值,这样会得到一个逐渐减速的值,最后结果会无限接近于b 返回结果按照如下方式计算:return (a + ((b - a) * Clamp01(t))); 2,Mathf.MoveTowards(float curr
MoveTowards 是不会超过最大值的,step为正则靠近,step为负则远离 https://blog.csdn.net/ZFSR05255134/article/details/49103089?locationNum=9&amp;fps=1 void Update(){ float step = Speed*Time.deltaTime(); gameObject.transform.localPosition = Vector3.MoveTowards(gameObject.transform.localPosition, new Vector3(0, 0, 60), step); 法二:使用iTween iTween.MoveTo(m_UIbgCamera, i 第8 章 Unity 3D 协程背后的迭代器 228 第9 章 在Unity 3D 中使用可空型 260 第10 章 从序列化和反序列化看Unity 3D 的存储机制 281 第11 章 移动平台动态读取外部文件 318 第12 章 在Unity 3D 中使用AssetBundle 336 第13 章 Unity 3D 优化347 第14 章 Unity 3D 的脚本编译 365
m0_56692504: 兄弟讲的很不错, 该讲的基础内容都讲了. 作为使用了一大段时间fungus的本人来说, fungus简直就像个神器. 唯一不足的点就是它自带的存档功能, 被我直接舍弃. 我用反射的方式, 用fungus配合代码, 实现了非常实用的存档方式, 希望大佬观摩.表情包 https://www.bilibili.com/read/cv17887400?spm_id_from=333.999.0.0