一、三种基本移动方案
unity中的移动分为Transform和Rigidbody以及CharacterController,其中CharacterController已经考虑了穿墙,贴墙走等情况。
1.使用transform,直接修改位置,无视碰撞
1.transform.position
2.transform.Translate
2.使用MovePosition /rigidbody.position会出现按住移动按钮,当移动速度过大的时候,顶着墙会出现模型挤到墙体中的情况
1.rigidbody.velocity
2.rigidbody.MovePosition /rigidbody.position
使用velocity则不会出现穿墙的情况,注意,如果希望贴墙斜着走,不要锁住Rigidbody的Y轴旋转
二、顶着墙的时候,鬼畜碰撞
这是因为如果在Update中修改了位置,unity会在FixedUpdate中进行物理检测,矫正位置,会出现 进入墙体内-->被物理系统挤出墙体-->进入墙体内-->被物理系统挤出墙体 的情况
为了避免这种情况,通常需要在FixedUpdate中设置物理位置
三、物理移动和渲染分层处理
我们项目中为了保证FixedUpdate保持固定时间执行,且不会受到帧率影响,在Update的循环中,根据固定时长,实现了项目自定义的FixedUpdate函数,进行逻辑循环,由于unity中的物理计算是在自身的FixedUpdate函数内,因此要在需要的时间周期内(即移动指令设置后),手动调用物理模拟
Physics.SyncTransforms(); Physics.Simulate(fixedDeltaTime);
为了保证移动在固定时间间隔内稳定,且性能、帧率可控,在FixedUpdate中实现物理层移动,待物理系统矫正位置后(即上述代码执行后),在LateUpdate中插值控制表现层的移动,从而模拟跟随物理层的移动。
注意该方案其实是渲染层追物理层,因此存在一个FixedUpdate的时间间隔,如果速度过大,或者FixedUpdate时间间隔过大,会出现移动的过程中,表现上差一个FixedUpdate时间间隔的距离差异!静止中位置一致。