在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的方式,移动一些静态的可交互的物体。

用这种挺傻帽的方式暂时解决了这个需求。其实自己如果有能耐修改插件的话应该能给出更好的解决方法吧...要走的路还很长...🤠

posted @   fjnloo  阅读(609)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示