【发布时间】:2016-02-03 14:57:25
【问题描述】:
所以我的场景中有几个代表不同演员的游戏对象。此外,我为每种类型的演员都有脚本,它们都来自Actor 脚本。
public class Actor : MonoBehaviour {
//some properties
}
///
public class Doctor : Actor {
//some more properties
}
只有派生的脚本附加到游戏对象。即,如果我有一个医生游戏对象 - 在检查器中只有 Doctor 脚本附加到它。
我的代码运行所有这些actor游戏对象-并从一些数据输入更新它们的属性(基础+派生)。 目前我正在检查每个游戏对象是否具有特定组件,然后从正确的脚本中获取属性。
我的目标是始终从Actor 获取派生类声明的属性,该属性当前附加到游戏对象,而无需查找组件。
我认为 Linq 中的某些东西可以解决问题。
【问题讨论】:
-
不清楚。 Doctor 添加了一些扩展 Actor 的新属性,而您只想获取 Doctor 定义的属性?
-
基本上是的。 @OguzOzgul。所以我想交叉检查一个组件是否满足两件事:1-附加到游戏对象和2-从演员派生
-
您应该使用反射和适当的 BindingFlags。如果您已经实现了获取所有属性,则只需检查 PropertyInfo.DeclaringType。如果是 Actor,请跳过。如果不是并且它扩展了 Actor,则更新。
-
obj.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly)怎么样?这将返回 deepest 类型的所有属性。也许您需要一些基本类型。在这种情况下,您可以使用obj.GetType().BaseType并使用DeclaredOnly再次调用它。这应该可以解决您的问题,我认为这就是 @OguzOzgul 的意思 您应该使用反射和适当的 BindingFlags。
标签: c# linq reflection unity3d