【发布时间】: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