赞
踩
能让自己的物体动起来一定很酷,让我们来总结一点关于移动的方法吧
你知道的我们总是可以调用物体的身上的组件,修改组件上的参数,以此来完成我们对物体的控制,在transform中有关于物体的三维坐标,角度等。
我首先定义了一个公共的浮点型变量,用它来实现我们对速度大小的控制。
在Update中我调用transform组件中Translate方法来改变他的三维坐标,Translate方法会将身后的括号内的三维向量加到物体坐标上。
Translate ( x轴,y轴,z轴,(参考系) );
//(默认为自身参考系)
在为三维坐标赋值的时候可以发现 我使用了speed * Time.deltaTime以此将每帧赋值变为每秒赋值。这样更符合人的直觉。
值得一提的是,这种坐标改变默认参考的是自身坐标系,物体自己的旋转会影响移动的方向。也可以在三维向量后面标明 Space.World ,会发现相机旋转不会改变物体移动的方向,有种脖子落枕的美。
如果说transform中的移动像是物理中的路程,只在意过程。那Lerp方法就像是物理中的位移,只在意起点和终点。
Lerp(当前位置(v1),目标位置(v2),时间(t))
//时间越小,物体移动速度越慢
我定义了一个公共的Transform组件,它的position就是目标位置,物体的跟随速度是非线性的,所以看起来很丝滑,适合做一些动画或者摄像机跟随。也可以使用Slerp (v1,v2,t)函数它的跟随曲线是圆弧过渡效果更好。
Rigidbody会为物体附上灵魂,符合物理规则的灵魂,也可以通过调整参数来控制它。
如果走在路上想让一块石头向前移动,那我可能会从后面踢它一脚,因为现实中石头一定有Rigidbody组件,它的其中几种方法是:
1.AddForce(力的大小和方向(v3),力的模式)
//力的大小和方向可以用一个三维向量来表示。
//力的模式
1.Force(一直给这个力,受到质量影响)
2.Acceleration(一直给这个加速度,无视质量)
3.Impulse(给一次这个力,受到质量影响)
4.VelocityChange(给一个这个加速度,无视质量)
通常会把涉及物理计算和逻辑判断放在FixedUpdate()函数中,这样会更精准,是的他们都这么说,可能和更新频率有关系。我尝试了把这段代码放到Update()中,但它显然不会使用牛顿第二定律。
2.MovePosition(目标位置(v4))
//它和transform.translate()差不多 别忘了乘上Time.deltaTime,让他慢一点,更符合直觉一点。
3.Velocity(一个速度向量(v5))
//直接更改一次物体的速度,很适合用来做跳跃,大家一般都会用它。
//注:Vector3 b = (0,20,0);
当我点击鼠标左键时,物体的速度被设置为(0,20,0),它看起来就像是突然跳起来一样哈哈。
终于到最后一个了,就和它的名字一样角色控制器,它天生就该来控制角色移动,它的其中一个方法是:
Move(一个三维向量(v6))
有意思的是它没有重力效果,但是他有刚体的部分性质(比如碰撞体),想要模拟重力效果可以通过改变y轴的值来实现。
1.transform中我可以调用translate方法直接更改物体的坐标同时乘上Time.deltaTime来让物体按时间移动,相较于Rigidbody和CharaterController,它可能没有碰撞和物理效果。
2.Lerp和SLerp函数通过给起点和终点,来进行平滑的移动,用在摄像机跟随上可能会不错
3.Rigidbody可以让物体符合力学,可以用在很多场景。
4.CharacterController可以用于人物控制,它的自定义程度很高,感觉可以用来优化人物移动和下落的手感。
现在我已经学会了基础的移动方法,和我一起动手做起来吧!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。