【问题标题】:Unity - Type mismatch when adding objects to Generic ListUnity - 将对象添加到通用列表时类型不匹配
【发布时间】:2019-10-20 00:29:43
【问题描述】:

我有一个名为RunTimeSet<T>的抽象类:

public abstract class RuntimeSet<T> : ScriptableObject
{
    public List<T> items = new List<T>();

    public void Add(T t)
    {
        if(!items.Contains(t)) items.Add(t);
    }
    public void Remove(T t)
    {
        if (!items.Contains(t)) items.Remove(t);
    }
}

现在我想创建一个扩展它的类,并存储游戏对象:

public class BuildingSet : RuntimeSet<GameObject>
{
    //...
}

static class BuildingSetMenu
{
    [MenuItem("Assets/Create/Sets/BuildingSet")]
    public static void CreateRuntimeSet()
    {
        var asset = ScriptableObject.CreateInstance<BuildingSet>();

        var path = AssetDatabase.GetAssetPath(Selection.activeObject);
        path += "/My New BuildingSet.asset";

        ProjectWindowUtil.CreateAsset(asset, path);
    }
}

然后在我的 Building 中,我保留对这个 Scriptable Object 的引用,然后调用:

public void OnEnable()
    {
        buildingSet.Add(gameObject);
    }

但是,在我的编辑器中,列表中的每个条目都显示为“类型不匹配”,这是为什么呢?

【问题讨论】:

    标签: c# unity3d generics


    【解决方案1】:

    ScriptableObjects 是资产,designed to hold only data, independent of game objects。它们不能在特定场景中永久存储对游戏对象的引用,因为这些对于可能引用 ScriptableObject 的任何其他场景都没有意义,类似于预制件在放置之前无法引用特定场景的内容。因此,它们所引用的游戏对象将被列为不正确的类型,并且任何此类引用都将在场景更改时被列为缺失。

    【讨论】:

    • 你确定这是真的吗? youtube.com/watch?time_continue=2572&v=raQ3iHhE_Kk。看看运行时集@40:00
    • @Green_qaue 我已经编辑了我的答案以澄清,场景特定的对象可以以这种方式临时存储(并且其他脚本可以正常与这些列表中引用的对象交互),但是改变场景将破坏仍然存储在列表中的任何引用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多