如何在运行时为Unity中的碰撞计算正确的精灵范围

因此,在Unity中进行2D游戏时,我偶然发现了这个问题,并认为我会分享我发现效果很好的解决方案。

最初,必须有一个带有SpriteRenderer组件的预制件,而没有添加任何对撞机组件,当敌人死亡时会实例化该组件。 我们将随机精灵应用于从VFX精灵数据库中获取的实例化GameObject,该数据库存在于包含许多不同VFX精灵的项目中。 实例化的对象是2D精灵,应放置在地面上并发生碰撞,该碰撞的IsTrigger属性设置为true以进行图层调整(内部机制可以更改特定地面和其他碰撞区域上的SpriteRenderer排序顺序) 。

这是在Unity Sprite“编辑器”中打开的原始Sprite,其大小为64×64。

如果尝试在运行时将BoxCollider2D组件添加到对象,该组件具有一个SpriteRenderer组件,该组件绘制上面显示的精灵,则产生的碰撞的大小将不正确,如下所示。

我要解决的问题是首先在Unity Sprite编辑器中编辑边框,如下所示。

我为小精灵的边框的4个值添加了绿色矩形标记,它们是:L(eft),R(ight),T(op),B(ottom)。 这些值表示我们从4个所述方向使用工具引入的填充。

现在我们在哪里可以找到这些值? 当我们添加BoxCollider2D组件时,它不会使用刚刚定义的边框自动计算出正确的大小。 取而代之的是,从sprites数据库中随机获得的sprite具有类型为Vector4的边框组件。 因此,我们有x,y,z,w而不是L,R,T,B(无论在Unity Sprite编辑器中说什么)。 我发现这是它们彼此对应的方式:
左边框-> x;

右边框-> z;

顶部边框-> w;

底部边框-> y;

使用此信息以及还可以在精灵上找到的pixelsPerUnit组件,我们可以为新添加的2D对撞机计算出更准确的尺寸,如下所示:

分解:

  1. 在我的情况下获得随机精灵。
  2. 在新实例化的预制件上添加一个新的BoxCollider2D,我在上面设置了精灵,您不必为此担心。
  3. 我们定义Vector2类型的colliderSize对象
  4. 将bounds.size.x —(border.x(Left)+ border.z(Right))/ randomSprite.pixelsPerUnit分配给colliderSize.x。 在这里,我们仅添加左右边框并除以pixelPers(在我的情况下为100,取决于精灵导入设置)。 我们划分边界是因为bounds.size已包含除以pixelPerUnit值。 例如,如果我们的精灵大小为64×64像素,bounds.size.x将为0.64,y则相同。 一旦我们从bounds.size.x中减去正确的左右边界总和除以pixelsPerUnit,就为给定的精灵保留了正确的宽度。
  5. 我们对y进行相同操作,但是使用w(Top)和y(Bottom)边界进行计算。
  6. 我们将新计算的colliderSize分配给collider.size组件。

这是在运行时为具有边框的2D精灵创建的结果对撞机:

我知道碰撞不是居中的,但是这并不会打扰我,因为它的目的是有时使精灵的中心稍微偏离一点,这就是这种情况。

感谢您的阅读,希望对您有所帮助。 欢迎提问和编辑。