Unity中的MeshCollider可以为MeshRenderer提供精确的碰撞,在对复杂多边形提供碰撞盒的时候经常有用到,刚好最近项目中遇到了一个问题,就是当我在运行时(注意是运行时而不是在Unity编辑器中)通过代码修改了Mesh以后而MeshCollider的形状并没有跟着一起改变,导致碰撞失效的问题。最后发现了一个解决方案,打算记录下来和大家分享。
比如我们在项目中可能有时候会对当前的网格进行修改:
Mesh m =GetComponent<MeshFilter>().mesh;
m.vertices = xxxx //这里xxxx代表对网格的修改
m.RecalculateBounds();
起初我以为只要调用过RecalculateBounds重新计算了网格以后 MeshCollider就会跟着修改,最后发现这样不行,需要重新对MeshCollider的sharedMesh进行赋值。这样就可以使网格碰撞盒的大小和新的Mesh一致了,类似下面这样:
Mesh m =GetComponent<MeshFilter>().mesh;
m.vertices = xxxx //这里xxxx代表对网格的修改
m.RecalculateBounds();
MeshCollider collider = GetComponent<MeshCollider>();
collider.sharedMesh = null;
collider.sharedMesh = m;
这样重新赋值以后就可以了。这次记录就先写到这吧,说点题外话,一直觉得自己博客的界面有些简陋,起码像代码这部分应该加个代码高亮之类的,不过就是太忙(懒)了,一直没时间弄,等到有时间了,考虑给自己的博客重新装修一下。不过自己这台云服务器也觉得好贵,不得不吐槽下阿里云这些优惠活动都只针对新用户,对老用户实在是不友好,将来如果负担不起了,真的要考虑把博客搬回oschina了~