【问题标题】:Unity Generic List in Hierarchy层次结构中的 Unity 通用列表
【发布时间】:2019-11-15 22:29:36
【问题描述】:

我正在寻找一个撤销类,它包含板上所有对象的所有撤销动作。

设置:

public class UndoClass
{
    public UndoLogging[] _Discs;
    public TileParent[] _Tiles;

    public UndoClass(UndoLogging[] discs, TileParent[] tiles)
    {
        _Discs = discs;
        _Tiles = tiles;
    }
}

class AddToList<T>
{
    private List<T> list = new List<T>();

    public void Add(T t)
    {
        list.Add(t);
    }
}

TileParent 是一个父脚本,它下面有一堆不同的图块,因此每个图块都需要一个不同的撤消列表,其中包含需要撤消的变量。

如何在 TileParent 中创建通用列表,但在单个图块中使用特定类型的列表?

public class TileParent : MonoBehaviour
{
    public AddToList<T> _UndoLog = new AddToList<T>();
}

public class BreakableTile : TileParent
{
    struct MyLog
    {
        bool active;
    }

    public override void Awake()
    {
        base.Awake();

        _UndoLog = new List<MyLog>();
    }
}

这可能吗?

以上代码产生的错误是

TileParent.cs(12,24): error CS0246: The type or namespace name 'T' could not be found (are you missing a using directive or an assembly reference?)

谢谢

【问题讨论】:

  • 不完全清楚您有什么问题...您发布的代码版本(已修复语法错误)是否会造成问题?
  • TileParent.cs(12,24):错误 CS0246:找不到类型或命名空间名称“T”(您是否缺少 using 指令或程序集引用?)
  • 您忘记将T 声明为generic type。你的类应该像public class TileParent&lt;T&gt; ... 然后确保T 实现所需的类型/接口:public class TileParent&lt;T&gt; where T : UndoClass。还要确保记得根据需要进行投射(请参阅:Covariance and Contravariance in Generics)。

标签: c# list unity3d generics


【解决方案1】:

你必须声明泛型:

public class TileParent<T> : MonoBehaviour
{
    public AddToList<T> _UndoLog = new AddToList<T>();
}

或具体说明:

public class TileParent : MonoBehaviour
{
    public AddToList<TileParent> _UndoLog = new AddToList<TileParent>();
}

其中任何一个都不太可能正是您想要的(因为 Unity 控制如何创建 MonoBehaviours,您将无法执行前者),但问题源于这里的过去,您向上传播泛型,而不是指定您希望列表的类型:

class AddToList<T>
{
    private List<T> list = new List<T>();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多