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时间间隔的距离差异!静止中位置一致。

相关推荐
叶帆7 天前
【YFIOs】用C#开发硬件之设备上云
开发语言·unity·c#
久数君7 天前
AI三维建模工具“造形家”:地理场景三维化的高效解决方案
unity·glb·ai算法·ai三维建模工具·地图框选·造形家·城市建筑模型
会思考的猴子7 天前
Unity VFX 属性 Postion 和 TargetPostion
unity
hai3152475438 天前
九章编程法 · 猜数字游戏 (GW-BASIC 重构版) *
人工智能·microsoft·游戏引擎·游戏程序
心前阳光8 天前
Unity资源导入之自动化资源导入
unity·自动化·游戏引擎
心前阳光8 天前
Unity之2021.3.45f2c1发布安卓程序遇到的问题
android·unity·游戏引擎
纪纯8 天前
PicoVR Unity Integration SDK 3.4 常用交互API
unity·游戏引擎·vr·pico
龙智DevSecOps解决方案8 天前
3A 游戏优化技术栈:如何打通引擎级分析工具与 DevOps 持续集成管线?
unity·性能优化·游戏开发·技术美术·perforce·unrealengine
葛兰岱尔8 天前
从 SolidWorks 到 Three.js,从 Inventor 到 Unity——制造业CAD模型“几何-语义一体化“转换,不再是天方夜谭!
开发语言·javascript·unity
鼎艺创新科技8 天前
三维电子沙盘中OSGB倾斜摄影数据的加载与渲染
游戏引擎·cocos2d