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

相关推荐
技术小甜甜6 小时前
[Godot] 解决导出APK安装失败的常见问题:深入分析与调试方法
游戏引擎·godot·游戏开发
老朱佩琪!11 小时前
Unity桥接模式
unity·设计模式·c#·桥接模式
技术小甜甜11 小时前
[Godot][入门] 安装与版本选择:3.x 还是 4.x?(按项目类型一键决策)
游戏引擎·godot·游戏开发·2d
陈言必行11 小时前
Unity 之 物理引擎中三种刚体力施加方式详解
unity·游戏引擎
foreveryao12311 小时前
Unity渲染流程(底层逻辑)
unity·游戏引擎·图形渲染
small-pudding12 小时前
Unity中的PBR(基于物理的渲染)
unity·游戏引擎
CreasyChan12 小时前
3D游戏数学基础指南
游戏·3d·unity·数学基础
平行云1 天前
Enscape × Paraverse | 从设计到一键发布、网页分享、实时交互的全新体验
unity·ue5·xr·3dsmax·webgl·实时云渲染·云桌面
老朱佩琪!1 天前
Unity迭代器模式
unity·设计模式·迭代器模式
程序猿多布1 天前
Unity 多语言系统实现
unity·多语言