【问题标题】:Getting properties of derived type on a Gameobject在 Gameobject 上获取派生类型的属性
【发布时间】: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


【解决方案1】:

听起来你想要GetComponent<Actor>()GetComponents<Actor>()FindObjectsOfType(typeof(Actor))

  • GetComponent 搜索单个 GameObject 并返回第一个匹配的组件,如果没有找到这样的组件,则返回 null。
  • GetComponents 搜索单个 GameObject 并返回所有匹配组件的数组,如果没有找到此类组件,则返回一个空数组。
  • FindObjectsOfType 搜索整个场景并返回一个包含所有匹配 Unity 对象的数组,如果没有找到此类对象,则返回一个空数组。最后一个调用相当昂贵,但全场景搜索确实有其用途。

搜索Actor 组件也会找到Doctor 组件,因为根据定义,每个Doctor 都是Actor

【讨论】:

  • 问题是我有几个从“演员”派生的演员类型。当我发现 1 我不想检查它是哪种类型时,我想立即获取属性列表。只要它源自“演员”并附加到游戏对象-我想要它的属性。使用 GetComponent,我需要指定要获取哪些属性的组件。
  • 这听起来像是一个不同寻常的设计选择,但你可以use reflection to get all properties of an object
猜你喜欢
  • 2022-06-10
  • 1970-01-01
  • 2017-11-05
  • 1970-01-01
  • 2019-03-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
相关资源
最近更新 更多