【问题标题】:How do I associate a C# object with a Unity gameobject?如何将 C# 对象与 Unity 游戏对象关联?
【发布时间】:2017-06-19 21:34:20
【问题描述】:

我了解 Unity 以基于组件的方式使用 C# 脚本,但在很多情况下这并不能很好地工作。

这是一个例子:假设我有一个炮塔类和一个激光类。它们都继承自实现了 Shoot() 方法的 IShootable 接口。我想遍历场景中的所有 IShootable 对象并调用 Shoot()。听起来很简单,但我不一定想将这些脚本作为组件添加到游戏对象中,而是用传统的 C# 方式实例化它们:Turret t1 = new Turret();

基本上,当我实例化 C# 对象时,我想实例化一个统一的游戏对象并对其进行几乎相同的处理。

我相当业余,我知道对此没有完美的答案。我只是想要一种一致的方式来处理这种混乱并使其不那么混乱。

谢谢!!!

【问题讨论】:

  • 除非您正在编写基于文本的冒险游戏,否则炮塔必须从某个地方射击?为什么不让炮塔成为那个物体射击的一个组成部分。但是,除了因为您不再使用组件系统之外,您的计划没有任何问题,您有责任自己在某处的 List<IShootable> 中跟踪所有 IShootable 对象(就像您在普通 C# 中一样)并 foreach该主列表并调用拍摄。
  • 我明白你在说什么。您可能是对的,没有理由不使用 Unity 的组件系统。也许引擎不适合我的风格(?)
  • “基本上,当我实例化 C# 对象时,我想实例化一个统一的游戏对象并对其进行几乎相同的处理。”这是完全没有意义的。要实例化一个游戏对象,请实例化一个游戏对象。
  • 它可能不“适合一个人的风格”,但没有其他可能的方式可以让行为附加到物理对象的 ECS .. 可以工作。

标签: c# oop object unity3d


【解决方案1】:

如果你想让一个对象存在于场景中,那么它必须是一个游戏对象。没有其他选择。

现在,您的 Turret 和 Laser 对象继承自 MonoBehaviour 是完美的,但它们必须与场景中的东西相关联,不知何故。场景中唯一存在的就是游戏对象。

  • 选项 A:制作一个 MonoBehaviour 脚本,将 Turret 和/或 Laser 作为该行为脚本的属性。循环遍历场景中的所有游戏对象并获取它们的 MB 组件并在其上调用 Shoot(),该组件会为其封装的 Turret 或 Laser 对象调用 Shoot()。

  • 选项 B:使您的炮塔和激光脚本实例化并存储对其关联游戏对象的引用。我这样做是出于某种方式,在我现在正在开发的一款游戏中。

【讨论】:

  • 使用选项 B,我们如何从游戏对象中获取脚本?例如,对于选项 A,我们可以使用 GetComponent() 来获取。选项B可以吗?
  • @BlueMoon93 试试gameObject.GetComponent<SCRIPTCLASSNAME>();
  • “让你的 Turret 和 Laser 脚本.. 存储对它们关联的 GameObject 的引用。” 这是一个完全、完全、完全奇怪的想法!如果你是一个组件,你所在的游戏对象是 .gameObject。我想,如果你“不喜欢输入” .gameObject,但你想输入 .banana 或 .moscow ,你可以使用属性,或者预处理器等来避免输入 .gameObject。
【解决方案2】:

我冒昧地假设您在谈论观察者模式。 链接:https://msdn.microsoft.com/en-us/library/ee817669.aspx 并使用 Unity3d 动作和代表: 链接:https://unity3d.com/ru/learn/tutorials/topics/scripting/input-actions-and-delegate-pattern 或使用 Unity3d Evetns。 我没有足够的声誉来插入另一个链接,但你可以在 Unity 的网站上找到教程

【讨论】:

    猜你喜欢
    • 2017-12-13
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多