在unity中踩过的坑(一)碰撞/物理
今天用unity搭建了一个船在海面上行驶的场景,需求是这样的:首先船需要在海面行驶,然后玩家在船上自由移动,并和船上的一些物体进行交互
乍一眼看,这并不是什么难事呀,我应该分分钟能搞出来吧😀
但是呢就是这样一个看似简单的需求,却让我踩到的好多坑。以此记录避免下次再犯
首先 我们使用了Crest Ocean System HDRP 4.15.1插件用来搭建一个海面场景,它内置了基于物理的船只行驶的脚本。
也就是说我们的船需要添加Rigibody这个组件。
对于如何让角色在船只上移动。我们要知道,船只虽然在移动,但是它想要带动其他物体进行移动的话还需要其他操作。如果我们直接将角色放到船只上,那么结果就是角色会直接滑走。为了解决这个问题,我一开始的思路有以下几种。
(1)让角色作为船只的子类,和船只一同移动,同时利用角色自带的移动进行相对移动
(2)给船只碰撞体添加一个摩擦力为满的物理材质,希望让其能够直接带动角色进行移动
(3)这个是后来才知道的一个方案。就是将一个平台设置为is Kinematic后它能够直接带着同样是Rigibody的物体进行移动
让我们逐个进行分析。
(1)方案其实一开始就错了,因为我们角色使用的是基于物理的控制器,需要使用Rigibody组件,但是Rigibody内部是不能再放Rigibody子类的,这是unity不允许的。那么我们的交互物品可以直接作为其子类吗,目前看来是可以的。
(2)我们基于物理知识知道,一个动态物体带动一个静态物体进行移动,那么他们实际上是因为存在一个静摩擦力。当我尝试新建一个满摩擦的物理材质赋给船只的碰撞后,发现它并不能满足这个需求,角色仍然会直接被滑走。
此外,在为mesh添加碰撞的时候,还发现了一个问题:一个mesh若是作为添加Rigibody的gameobject的子类,那么它其实是不能直接用mesh Collider组件的。解决方法是mesh Collider勾选Contex让mesh Collider称为凸面多边形或者是不使用mesh Collider而使用Box Collider及其他常规碰撞组件。但这两者都不能满足我们添加精细碰撞的需求。
最终,我选择了复制一个船体mesh,并单独添加一个mesh Collider。同时取消mesh的激活,让我们场景中只会看到一个船体。同时我们添加一个脚本用 Lerp平滑移动的方式,像这样:
var t = 1 / ((transform.position - endPos).magnitude);
transform.position = Vector3.Lerp(transform.position, endPos, t);
如果不使用平滑移动的话,我们会明显感觉到它的移动是一卡一卡的,尤其是我们使用的是第一人称的视角
此处我们添加了一个船体复制,用于为船体添加一个较为精细的碰撞
(3)当我们使用is Kinematic的平台时,他就可以载动我们基于Rigibody组件实现的角色控制器。这样看来我们唯一的方法就是再复制一份船体,用于载人,因为我们的第一条船体不能改为is Kinematic,因为和插件是绑定的。我一开始觉得2、3船体可以并用,但是这里又有一个坑了,就是is Kinematic如果不采用基于物理的移动方式,而是直接更改transform,那么它就不能载动上面放置的物体。我如果把第二条船改为is Kinematic,那么我们还要修改一下他的脚本。
我自以为这样只需要两条船体能够解决问题了...
直到我使用了HDRP Outline 1.1这个插件,我想添加新的需求,我想要为可交互的物体添加outline...
我使用的策略是 在摄像机中心点发射一条射线,如果碰到可交互的物体的layer,那么激活他的outline...嗯嗯这么看来我马上就能解决这个需求啦!😂
但是当将想要交互的物体作为有Rigibody的对象的子类时,我却发现Raycast射线检测怎么也检测不到它,检测到的居然是他的添加了Rigibody组件的父类对象!why?我也不知道了。我只知道我找这个问题就找了两个小时🤡。
fine,fine 所以最后我一共复制出了三条船用于解决这个问题,一条船是基于物理地在这个水插件上进行行驶;一条船是用is Kinematic,用于乘坐玩家和其他一些Rigibody的物体;最后一条船是用transform的方式,移动一些静态的可交互的物体。
用这种挺傻帽的方式暂时解决了这个需求。其实自己如果有能耐修改插件的话应该能给出更好的解决方法吧...要走的路还很长...🤠
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库