月度归档:2016年10月

如何正确地使用 Unity3D 中的 Bounds.Encapsulate 方法

在我们的游戏中有个很简单的需求,有一个物体 A 挂有所有控制的脚本,所有点击的处理逻辑代码都在这些脚本里头,在某个时机需要在物体 A 上再挂上一个武器物体 B,武器物体 B 有自己的 BoxCollider,原有的物体 A 也有自己的 BoxCollider,为了简单起见我的想法是当我把物体物体 B 挂到 物体 A 上的同时,我就将 A 物体的 BoxCollider 的 bounds 调整一下尺寸,让其能将物体物体 B 的 BoxCollider 给包含进来就好了,然后我再将武器物体 B 的 BoxCollider 给关闭。

看起来这个需求一点都不复杂呢,对伐?所以我就简单的这样写了以下的代码:

然而毛用都木有呢,mBaseCollider 在调用了 Encapsulate 方法之后,自身的尺寸并没有发生任何变化,当然前提肯定是 mSkillCollider 自身的 bounds 肯定不在 mBaseCollider 的 bounds 范围内的,那么问题是什么呢?

一开始,我以为是 mSkillCollider 自身的 GameObject 当前不是 Active 的导致了获取到的 bounds 是空的,毕竟在 Unity3D 的官方文档里头有这么一段嘛:

可是试了很多次依然不行,最后发现 Bounds 这货只是一个结构体,而且 Unity3D 对它的处理跟对 Transform 的 Position 的处理类似,而且更严格。首先我们不能直接修改 Bounds 结构体里头的 center 和 size 属性都不能直接设置,而且 BoxCollider 的 bounds 属性也不能直接设置。

由此我们可以推断 BoxCollider 的 bounds 属性每次调用都是复制了一个 Bounds 结构体出来,所以后续我们调用 Encapsulate 方法实际上操作的 Bounds 结构体已经跟 BoxCollider 自身没有关系了,这样就造成了我们即便调用了 Encapsulate 方法,BoxCollider 自身的 Bounds 尺寸并无任何变化的原因。如果我们想修改 BoxCollider 的 Bounds 尺寸,那么我们就应该是先获取 BoxCollider 的 Bounds 存起来,然后针对这个 Bounds 结构体进行操作,操作结束后,将该 Bounds 的数值反算回去,将反算出来的数值设置给 BoxCollider。

最终的代码就是这个样子的

测试一切正常了,BoxCollider 如我所愿地调整了自身的尺寸,并将 skillCollider 的 bounds 也给包围住了。