c# - 访问静态非单一行为类
问题描述
我正在尝试从单一行为脚本访问静态类。我正在用一个实例声明这个类,但我得到了错误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)
{
//..
}
}
解决方案
如前所述,存在多个问题:
您的班级
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);
然而,这是一个扩展方法,你可以
this
在this Mesh aMesh
. 扩展方法以特殊方式处理:如果它们是this
.. 定义的类型实例的一部分,您可以调用它们,在您的情况下Mesh
,您可以简单地调用mesh.IsPointInside(someVector)
终于
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)))
{
...
}
}
}
推荐阅读
- ruby-on-rails - 用 rspec 观察 `allow` 和 `have_received` 的奇怪行为
- java - 创建n个任务并在Spring Batch中并行执行
- javascript - 调试器无法使用 chrome devtools 运行节点 js
- sql - 仅更新最小值内的特定行
- javascript - React JS API 发布请求
- html - 角度材料输入视图上的蓝色背景颜色
- linux - 如何在 bash 脚本中正确使用 telnet?
- sql-server - 基于其他列集将列作为字符串返回
- vue.js - 替换导致 Vue-router 中出现 NavigationDuplicated 错误的查询
- javascript - 石头剪刀布游戏...无法弄清楚