【问题标题】:Unity, to what object should I attach my game engine scriptUnity,我应该将我的游戏引擎脚本附加到什么对象
【发布时间】:2016-10-04 23:41:43
【问题描述】:

我和我的朋友正在构建一个简单的放置游戏,作为我们的第一个统一项目。 我们已经构建了一个脚本来处理所有计算,并与玩家看到的每个GameObject 进行通信。

现在,我们应该将此脚本附加到什么地方?

我们宁愿不使用GameObject,因为:

1) GameObject 将是一个矫枉过正

2) GameObject 位于我所有“物理”对象存在的空间中(因为脚本不必“存在于某处”,所以这将是无用的)

第一次在stackoverflow发帖,如有错误请告诉我^^

【问题讨论】:

  • 或许这个问题应该在gamedev.stackexchange.com?
  • 这里很好,因为它与编程有关。两个网站上都有很多 Unity3D 问题

标签: unity3d unity5


【解决方案1】:

约定说放在主摄像头上或空GameObject

如果你真的不想做这两个,你可以让你的类静态。

如果您的类继承自 MonoBehaviour,则必须将其附加到 GameObject。如果你想将它附加到GameObject,它必须继承自MonoBehaviour

如果您想更好地理解 Unity 方式,我建议您阅读实体组件系统:

GameObject 是实体

MonoBehaviour 是组件

服务和管理器通常作为 Unity 中的组件实现,然后附加到主摄像头或以它们命名的空 GameObjects。

【讨论】:

  • 非常感谢^^所有这些信息都非常有用!我相信我们会简单地将脚本附加到相机上^^
【解决方案2】:

您可以创建一个普通的单例类和“Game Initializer”单行为,它将初始化您所有的单例管理器、结构等...

只需将这个单一行为添加到空游戏对象中的每个场景中,代码如下:

if(GameManager.instance == null)
   new GameManager();

或者在 scriptableObjects 的情况下,

if(GameManager.instance == null)
   gameManager.init()

另外,一个好的选择是使用实体系统模式,这里是统一框架(Unity-Ash、Entitas 等)

【讨论】:

  • 如果您要将脚本附加到一个空的游戏对象,那么拥有一个单例有什么意义呢?没有意义
  • 当你切换场景时,游戏对象将被重新创建,它的所有单体行为。即使您使用 DontDestroyOnLoad(),当它们是单一行为时,让所有管理器都只有一个实例并保存它们的状态也有点困难。此外,新的单一行为可能需要一些时间来加载/GC,从而浪费 CPU 时间。
  • 使用DontDestroyOnLoad() 并不难,而且我通过使用它确保我只有一个经理实例没有任何问题。不过,您还没有回答我之前的担忧,您的回答似乎表明单例也是 MonoBehaviour 附加到游戏对象。
  • 如果你想从编辑器中的任何场景启动你的游戏,DontDestroyOnLoad() 是不够的。您还应该为所有“一个实例单一行为”禁用 awake() 调用。禁用它一次要容易得多。此外,Monobehaviours 为自动完成添加了许多字段,这使得 self 作为管理者不方便使用。
  • 我知道创建管理器的最佳方式是:1) 一个单一行为初始化程序 2) 管理器,从 ScriptableObject 类扩展,具有到自身的静态链接、公共字段(填充预制件等)和您需要的方法.
猜你喜欢
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-19
相关资源
最近更新 更多