首页 > 解决方案 > 访问静态非单一行为类

问题描述

我正在尝试从单一行为脚本访问静态类。我正在用一个实例声明这个类,但我得到了错误Cannot declare a variable of static type 'MeshExtension'。即使创建静态类的实例应该可以正常工作?我在这里做错了什么?

public class MeshVolume : MonoBehaviour {
 public MeshExtension meshExt  = new MeshExtension();
 public Mesh mesh;
 public GameObject point;

void Start()
{
  if (MeshExtension.IsPointInside(mesh.InverseTransformPoint(point.transform)))
   {
   
   }
}

}
public static class MeshExtension
 {
     public static bool IsPointInside(this Mesh aMesh, Vector3 aLocalPoint)
     {
       //..
     }
 }

标签: c#unity3d

解决方案


如前所述,存在多个问题:

  1. 您的班级static class只有static成员。您不能像在

    public MeshExtension meshExt  = new MeshExtension();
    

    您宁愿static使用例如直接通过类型本身访问成员

    // Note that if you do it this way you have to pass in both parameters!
    MeshExtension.IsPointInside(someMesh, someVector);
    
  2. 然而,这是一个扩展方法,你可以thisthis Mesh aMesh. 扩展方法以特殊方式处理:如果它们是this.. 定义的类型实例的一部分,您可以调用它们,在您的情况下Mesh,您可以简单地调用

    mesh.IsPointInside(someVector)
    
  3. 终于Transform.InverseTransformPoint不是一部分了,Mesh而是Transform

    因此,假设这里的网格属于您的脚本附加到的对象,您宁愿调用例如

    if (mesh.IsPointInside(transform.InverseTransformPoint(point.transform)))
    

    transform如果您需要相对于其他Transform组件的点,则必须在其中交换第一个。请注意, aMesh本身不知道它被哪个对象使用,因此您可能需要第二个public Transform meshOwner;字段才能获得正确的InverseTransformPoint.

实际上,如果这个网格同一个对象上,我宁愿直接从附加MeshFilter组件中检索它,例如

[RequireComponent(typeof(MeshFilter))]
public class MeshVolume : MonoBehaviour 
{
    [SerializeField] private MeshFilter _meshFilter;
    public GameObject point;
    private Mesh mesh;
 
    void Start()
    {
        if(!_meshFilter) _meshFilter= GetComponent<MeshFilter >();

        mesh = _meshFilter.mesh;

        mesh.IsPointInside(transform.InverseTransformPoint(point.transform.position)))
        {
            ...
        }
    }
}

推荐阅读