C# 精灵。覆盖物理形状(?);

C# 精灵。覆盖物理形状(?);,c#,unity3d,C#,Unity3d,以下是关于以下内容的链接: IList的部分我理解。但是Vector2[],我不知道如何使用它来填充数据并在这里使用它。我还没有实际使用过这个,我目前还不能快速进行测试,但这可能会有所帮助。您应该能够将精灵的物理边界定义为一组形状 假设你有一个单独的精灵,中间有一个空隙。您可以选择将物理形状定义为两个部分,以使其更好地符合图像的两个部分,而不是围绕整个对象定义单个物理形状 因此,IList是形状的集合。这很可能只包含一个形状。Vector2数组为单个形状定义点(精灵空间中至少三个点)。所有矢量

以下是关于以下内容的链接:


IList的部分我理解。但是
Vector2[]
,我不知道如何使用它来填充数据并在这里使用它。

我还没有实际使用过这个,我目前还不能快速进行测试,但这可能会有所帮助。您应该能够将精灵的物理边界定义为一组形状

假设你有一个单独的精灵,中间有一个空隙。您可以选择将物理形状定义为两个部分,以使其更好地符合图像的两个部分,而不是围绕整个对象定义单个物理形状

因此,IList是形状的集合。这很可能只包含一个形状。Vector2数组为单个形状定义点(精灵空间中至少三个点)。所有矢量2阵列组合形成整体物理形状

编辑:如何设置值?也许是这样的

void Start ()
{
    SpriteRenderer spriteRenderer = GetComponent<SpriteRenderer>();
    Sprite sprite = spriteRenderer.sprite;

    sprite.OverridePhysicsShape(new List<Vector2[]> {
        new Vector2[] { new Vector2(0, 0), new Vector2(1, 0), new Vector2(1, 1), new Vector2(0, 1) },
        new Vector2[] { new Vector2(2, 2), new Vector2(3, 2), new Vector2(3, 3), new Vector2(2, 3) },
    });
}
void Start()
{
spritterenderer spritterenderer=GetComponent();
雪碧雪碧=雪碧者雪碧;
sprite.OverridePhysicsShape(新列表){
新向量2[]{new Vector2(0,0),new Vector2(1,0),new Vector2(1,1),new Vector2(0,1)},
新向量2[]{新向量2(2,2),新向量2(3,2),新向量2(3,3),新向量2(2,3)},
});
}

免责声明:不确定这是否真的有效。

很抱歉,Unity的官方答案是“不要麻烦。”调用Sprite.OverridePhysicsShape()仅在导入(或重新导入)图像时有效,并且在运行时(甚至在编辑器中)无法工作。请查看此链接:

前面的答案是正确的,这是Vector2[]数组的列表,但Vector2点的坐标必须全部在[0,0]和[1,1]之间,因为坐标与精灵的边界有关

下面是一些应该可以工作的代码。它现在不会抛出错误(在v2020.3.1中),但它似乎也没有做任何事情

public class SpritePhysicsShapeTest : MonoBehaviour {
    public Sprite sprite;
    
    // Start is called before the first frame update
    void Start() {
        List<Vector2[]> pts = new List<Vector2[]>();
        pts.Add( new Vector2[] { 
            new Vector2( 0, 0 ),
            new Vector2( 0.5f, 0 ),
            new Vector2( 0.5f, 0.5f ),
            new Vector2( 0, 0.5f ) 
        } );
        sprite.OverridePhysicsShape(pts);
    }
}
公共类SpritePhysisShapeTest:单行为{
公共雪碧;
//在第一帧更新之前调用Start
void Start(){
List pts=新列表();
pts.Add(新矢量2[]{
新矢量2(0,0),
新矢量2(0.5f,0),
新矢量2(0.5f,0.5f),
新矢量2(0,0.5f)
} );
sprite.OverridePhysicsShape(pts);
}
}

如果您试图以编程方式影响Unity Tilemap上的碰撞,我当前的解决方案是使用一个用于视觉效果的Tilemap(有256个可能的精灵)和第二个处理碰撞的不可见Tilemap(只有16个可能的精灵)。虽然我不得不在精灵编辑器中手动绘制这16个精灵的碰撞,但这似乎效果不错。

谢谢。但我的问题是:如何在我的向量中插入精灵的物理形式。这是我的怀疑。。。我如何储存健身?这些数据是什么?原谅我,在那一部分我迷失了自我…对于给你带来的不便,我深表歉意。但是,当您将精灵中的现有顶点保存在列表中并在该函数中使用它们时,是否正确?示例:GetComponent()。Points=GetComponent()。精灵顶点;结果甚至比我预期的要好,但并不正确。我非常感谢你的帮助。非常感谢。我想从你那里得到一个提示,正如你在这张图片中看到的,是一个透明的洞,但我想让对撞机忽略它。我该怎么做?