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

相关推荐
努力长头发的程序猿2 小时前
Unity2D当中的A*寻路算法
算法·unity·c#
RReality13 小时前
【Unity Shader URP】Matcap 材质捕捉实战教程
java·ui·unity·游戏引擎·图形渲染·材质
魔士于安13 小时前
unity urp材质球大全
游戏·unity·游戏引擎·材质·贴图·模型
南無忘码至尊16 小时前
Unity学习90天 - 第 6 天 -学习物理 Material + 重力与阻力并实现弹跳球和冰面滑动效果
学习·unity·游戏引擎
mxwin19 小时前
Unity 单通道立体渲染(Single Pass Instanced)对 Shader 顶点布局的特殊要求
unity·游戏引擎·shader
魔士于安21 小时前
unity 低多边形 无人小村 木质建筑 晾衣架 盆子手推车,桌子椅子,罐子,水井
游戏·unity·游戏引擎·贴图·模型
RReality21 小时前
【Unity Shader URP】简易卡通着色(Simple Toon)实战教程
ui·unity·游戏引擎·图形渲染·材质
魔士于安1 天前
unity 骷髅人 连招 武器 刀光 扭曲空气
游戏·unity·游戏引擎·贴图·模型
洛阳吕工1 天前
从 micro-ROS 到 px4_ros2:ROS2 无人机集成开发实战指南
游戏引擎·无人机·cocos2d
风酥糖1 天前
Godot游戏练习01-第29节-游戏导出
游戏·游戏引擎·godot