## Unity中3D人物移动的逻辑分析。

Unity中3D人物移动的逻辑分析。

记录一下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;
    }

- (三)具体移动逻辑

  1. 键盘输入结束之后,我们就要开始处理具体的人物移动,

上面提到,在三维坐标之中的“位移”其实就是被抽象为“坐标”的变换。正常情况下,我们会通过transform的更新来反映这种变化但在这里,我们使用的是CharacterController下的Move()方法,该方法要求我们传入public CollisionFlags Move (Vector3 motion);请注意,为了使我们的逻辑更加自然,我们采用了Time*deltatime的静态字段去和motion做点乘,更好的反应我们的移动的随时间变化的性质

  1. 移动控制:下面我们来分析一下一个完整的移动过程包括什么。

(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(),然后整体不断的随着时间的变化而更新,就能够体现随时间变化的移动。具体的Lerp的原理分析可以去看这一篇文章,大佬写的特别好
Unity3D中的线性插值Lerp()函数解析

(四)结构处理

这里参照B站大佬像素忍者的架构,将输入和具体逻辑处理部分分别存在两个文件里面,使得逻辑结构更加的清晰。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值