记录一下Unity3D的学习
- (一)先于一切的物理载体。
1.就如同2D的人物移动一样,游戏引擎作为一种对于物理的模拟方式,想要实现人物的移动,其大前提是,“人物”本身必须具有“碰撞”和“物理载体”两个属性。在2D中,我们通过ColliderBox2D和RigidBody2D来分别承载这两种属性。在3D中,我们使用一个叫做CharacterControler的Component即可。它就相当于一个物理的“存在”,我们的物理属性就可以依附于该组件之上。
- (二)输入处理。
1.键盘的输入有两块,其一是键盘前后左右的输入,这里需要注意,unity中的前后为x轴,左右为z轴,跳跃与下蹲的与y轴相关。
(1)处理细节:从键盘的输入依靠着Input类下的GetAxisRaw静态方法完成,此方法的返回值没有经过平滑处理,因此会返回-1,0,1三个数值。我们采用该函数读入前后左右的移动,并将其保存为一个vector3的变量,然后,我们会将改变量更新为最新的位置,即通过“位移”的形式来反应“速度”的变化。因此我们选择建立一个函数用来处理以下逻辑:
①读入在Horizontal和Vertical上的位移
②计算二者随时间(Time.deltatime)的变化
③将二者处理成一个新的Vector3并返回;
Code:
public Vector3 GetInput()
{
Vector3 move = new Vector3(x: Input.GetAxisRaw("Horizontal"), y: 0, z:Input.GetAxisRaw("Vertical"));//这里的实参写法是一种规范,可以使得我们的实参输入不按照形参顺序
move = Vector3.ClampMagnitude(move, maxLength: 1);
return move;
}
- (三)具体移动逻辑
键盘输入结束之后,我们就要开始处理具体的人物移动,
上面提到,在三维坐标之中的“位移”其实就是被抽象为“坐标”的变换。正常情况下,我们会通过transform的更新来反映这种变化但在这里,我们使用的是CharacterController下的Move()方法,该方法要求我们传入public CollisionFlags Move (Vector3 motion);请注意,为了使我们的逻辑更加自然,我们采用了Time*deltatime的静态字段去和motion做点乘,更好的反应我们的移动的随时间变化的性质
移动控制:下面我们来分析一下一个完整的移动过程包括什么。
(1)首先,当我们按下键盘上的前后左右中的按键时,移动开始,计算机读入键盘的在“Horizontal”和“Vertical”上的变化。
(2)其次,在void Update()方法中,引擎会按照电脑性能在一定间隔中反复的处理一段逻辑。我们会将“移动的”函数在Update中反复调用,以达到一个“连续”移动的效果
(3)我们日常生活中的移动,是,在“一段时间中”的“连续的速度变化”。比如,如果我们想要提速的话,我们需要从速度为0,提速到速度为最大值。Unity中的一个合理的速度变化也应该是这样的。这里我们调用Vector类型下的静态方法Lerp(),该方法要求我们传入
public static Vector3 Lerp (Vector3 a, Vector3 b, float t); 两个值a与b两个三次的向量,表示一个变化的范围。之后的一个float类型的t表示的是插值的位置,我们应该用一个t*Time.deltatime来反应其随时间变化。
(4)我们把通过Lerp处理过的速度传入move(),然后整体不断的随着时间的变化而更新,就能够体现随时间变化的移动。