在Unity中,如何获取Sprite的网格或本地边界?

4
这个问题只涉及Unity游戏引擎。
下面是一个视觉示例,展示了所谓的Unity“sprite”(Unity Sprite类),它是一个薄的3D对象。

enter image description here enter image description here

AABB指的是绿色线所示。在Unity中,通过.boundsdoco)可以获取gpu上的实时AABB。如果对CG不熟悉,可参考AABB解释
(注意,在Unity中,“local”(docodoco)表示:在父对象的四元数中;“world”表示在场景对象的四元数中。)
现在!对于任何正在阅读的Unity工程师:
通常在Unity中,当你想要获取Unity Bounds时,需要有一个可见的对象。
如果您想要它们在世界空间中,renderer.bounds 返回世界空间中的Unity Bounds
如果您想要它们在本地空间中,mesh.bounds 返回本地空间中的Unity Bounds
这是 Unity 的基础知识,您会经常使用。然而,对于新的精灵,也就是 SpriteRenderer,据我所知,没有真正的访问网格
(实际上,您可以获取.triangles,但从那里重新构建绕组和大小将是非常费力的。)
那么,您如何获得一个精灵的本地Unity Bounds
(请注意,sprite.bounds 本身只是相同的 renderer.bounds,这并没有帮助。)

我不理解为什么会有人踩。+1 - Programmer
2
一些非Unity开发人员可能不明白,在Unity中,“sprite”类是一个3D对象。 - Fattie
1个回答

6
我认为你正在寻找的是 SpriteRenderer.sprite.bounds
public class LogBounds : MonoBehaviour {
    void OnGUI () {
        var r = GetComponent<SpriteRenderer>();
        GUILayout.Label("SpriteRenderer.bounds center " + r.bounds.center + " size " + r.bounds.size);
        GUILayout.Label("SpriteRenderer.sprite.bounds center " + r.sprite.bounds.center + " size " + r.sprite.bounds.size);
    }
}

请注意,SpriteRenderer.sprite.bounds的值不会随着变换属性的更改而改变 - 这些值是以局部坐标表示的。

example


抱歉,但那绝对是不正确的。SpriteRenderer.bounds和SpriteRenderer.sprite.bounds返回不同的值。 - Gabriel Sibley
Sprite公开了verticestrianglesuv属性,这就是你制作一个不错的Mesh所需要的全部内容。我不确定你还对哪些类似于网格的属性感兴趣,这些属性是否适用于Sprite或者是否容易推断(例如法线)。 - Gabriel Sibley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接