unity中移动方案--物理渲染分层

一、三种基本移动方案

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则不会出现穿墙的情况

注意:

1.如果希望贴墙斜着走,使用velocity,但不要锁住Rigidbody的Y轴旋转,当速度较大的时候,离开墙的时候,Rigidbody会出现类似陀螺一样继续旋转的情况,此时可以将角速度设置为Vector3.zero。

2.如果需要实现类似冲刺的功能,使用Rigidbody在快速冲刺后,如果碰到墙,还会出现弹飞的情况,记得在冲刺结束后将velocity,设置为Vector3.zero。

复制代码
rigidbody.angularVelocity = Vector3.zero

二、顶着墙的时候,鬼畜碰撞

这是因为如果在Update中修改了位置,unity会在FixedUpdate中进行物理检测,矫正位置,会出现 进入墙体内-->被物理系统挤出墙体-->进入墙体内-->被物理系统挤出墙体 的情况

为了避免这种情况,通常需要在FixedUpdate中设置物理位置

三、物理移动和渲染分层处理

我们项目中为了保证FixedUpdate保持固定时间执行,且不会受到帧率影响,在Update的循环中,根据固定时长,实现了项目自定义的FixedUpdate函数,进行逻辑循环,由于unity中的物理计算是在自身的FixedUpdate函数内,因此要在需要的时间周期内(即移动指令设置后),手动调用物理模拟

复制代码
Physics.SyncTransforms();
Physics.Simulate(fixedDeltaTime);

为了保证移动在固定时间间隔内稳定,且性能、帧率可控,在FixedUpdate中实现物理层移动,待物理系统矫正位置后(即上述代码执行后),在LateUpdate中插值控制表现层的移动,从而模拟跟随物理层的移动。

注意事项该方案其实是渲染层追物理层,因此存在一个FixedUpdate的时间间隔,如果速度过大,或者FixedUpdate时间间隔过大,会出现移动的过程中,表现上差一个FixedUpdate时间间隔的距离差异!静止中位置一致。

相关推荐
WarPigs1 天前
Unity编辑器开发笔记
unity·编辑器·excel
Q***f6351 天前
C++在游戏引擎开发中的实践
游戏引擎
6***x5451 天前
C++在计算机视觉中的图像处理
c++·图像处理·计算机视觉·游戏引擎·logback·milvus
霜绛1 天前
Unity:lua热更新(三)——Lua语法(续)
unity·游戏引擎·lua
世洋Blog2 天前
更好的利用ChatGPT进行项目的开发
人工智能·unity·chatgpt
evolution_language2 天前
Unity场景(Scene)的注意事项和易错点
unity·游戏引擎·scene
EQ-雪梨蛋花汤2 天前
【AI工具】使用 Doubao-Seed-Code 优化 Unity 编辑器插件:从功能实现到界面美化的完整实践
人工智能·unity·编辑器
g***B7382 天前
元宇宙游戏引擎
游戏引擎
Dr.勿忘2 天前
开源Unity小框架:高效单例与模块化设计
游戏·unity·开源·c#·游戏引擎·游戏程序·gamejam
jtymyxmz4 天前
《Unity Shader》8.4 透明度混合
unity·游戏引擎