我正在尝试为我的Unity3D游戏开发一个系统,它可以让我通过将属性传递给函数来显示属性。但是为了使它工作,我需要属性名称,我无法正确得到它。现在,这就是我所做的 在我的"检查员脚本"我基本上就是这个。这将调用一个继承的函数,该函数应该处理"其他"东西。在这种情况下,'值'是Unity的变换组件和' position'是一个Vector3属性。
DoUI(value.position);
" DoUI"功能
protected virtual void DoUI(object property)
{
Type type = property.GetType();
Debug.Log("Type ToString: " + type.ToString() + " | Name: " + type.Name + " | Full Name: " + type.FullName);
}
现在,该功能仅打印调试消息,通过查看,我可以看到它不正确。它给了我类型名称,在这种情况下,Vector3,是的,我知道你可以通过查看代码清楚地看到它。
所以问题仍然存在,我怎样才能通过传递它来获得一个属性名称"按原样#34;用户不必进行任何复杂的反射调用?那是" DoUI"是为了。
答案 0 :(得分:1)
In C# 6 you can use nameof
operator. like nameof(myClass.MyProp)
which returns a string "MyProp"
However Unity 5 supports C# 4 so you have to use this workaround for lack of nameof in C# versions prior to 6
or this one
答案 1 :(得分:1)
序列化对象和序列化属性可能就是您所寻找的。它们甚至被Unity内部检查员使用,采用它们应该没有问题。
要使用序列化属性,您首先需要使用要编辑的实例构造SerializedObject。然后使用FindPropertyRelative方法(或者在根级别时使用FindProperty)来获取对象的SerializedProperty。然后,您可以访问属性的名称和类型,并设置值,甚至可以进一步深入挖掘嵌套属性。要更新序列化表示,请在序列化对象上调用Update。要将更改写回Object,请使用ApplyModifiedProperties。
但有两个主要的警告。该类需要继承ScriptableObject或MonoBehaviour或需要Serializable标志。而且您只能访问"属性"团结可以序列化,讽刺地排除了物业。您需要为属性SerializeField标记的属性需要公共字段或私有支持字段。