【问题标题】:How to Instantiate GameObject from Interface list如何从接口列表中实例化游戏对象
【发布时间】:2021-08-22 12:05:19
【问题描述】:

所以,我有List<ITower>

如果我尝试这样做:

var a = new List<ITower> {new DotBehaviour(), new RndBehaviour()};

foreach (var tower in a)
    Instantiate(tower);

我明白了:

类型“ITower”必须可转换为“UnityEngine.Object”才能在通用方法“T UnityEngine.Object.Instantiate(T)”中用作参数“T”

如果满足以下条件,我会很高兴:

a) 你告诉我怎么做或者

b) 如何在接口中创建返回方法,该方法将返回与我要实例化的 GameObject 关联的预制件。 (由于 C# 的强类型,我知道如何做到这一点,但我不想使用 dynamic

【问题讨论】:

  • 您可以尝试将其转换为 UnityEngine.Object,然后再转换为您想要的所有方法。只需确保检查演员表是否成功。
  • 不能保证一个接口是由一个特定的类实现的,所以你不能实例化一个接口。如果你有一个特定的对象要实例化并继续使用你的接口列表,你应该考虑实现一个工厂来实例化你想要的特定对象,并将你的接口传回。
  • 您是否考虑过使用抽象基类?此外(没有 DOT 专家)甚至允许使用 new 来创建实例以用于行为吗?我知道MonoBehaviour 绝对是“禁止”的^^
  • 1.直接投射是不可能的(方法已经尝试这样做)。 2. 我在 a) 中询问了如何做到这一点。 3. 这只是示范列表,不要复制粘贴大量代码,因此示例可能很脏。

标签: c# unity3d interface casting typing


【解决方案1】:

最新版的C#中有一个默认的接口方法实现,不知道unity有没有实现。如果他们这样做了,您可能可以在您的界面中定义一个方法并返回您想要实例化的预制件。比如:

GameObject GetPrefab()
{
    return Resources.Load("Path/To/My/Prefab");
}

然后你会调用 Instantiate(tower.GetPrefab());而不是 Instantiate(tower);.

如果您的 Unity 版本不支持默认接口方法,则必须在相关脚本中实现 GetPrfab 方法

【讨论】:

  • 所以,这是更新统一版本的正确答案。但是我都是根据很久以前记录的教程做的,所以将所有预制件从其他文件夹转移到资源中会出现问题。我会寻找另一个答案一段时间,如果我能以其他方式解决这个问题,我会发帖
  • 这适用于任何 Unity 版本。唯一的区别是如果你有一个默认接口实现,那么你只能在相关接口中定义这个方法一次。否则,您必须在接口的每个实现中定义此方法。我在这里写了一篇关于资源文件夹替代方案的博客:anton.website/resource-manager-and-object-pooling。也许会有所帮助
猜你喜欢
  • 1970-01-01
  • 2017-11-25
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多