Unity - Несоответствие типов при добавлении объектов в общий список - PullRequest
0 голосов
/ 19 октября 2019

У меня есть абстрактный класс с именем 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);
    }
}

Теперь я хочу создать класс, который расширяет его и сохраняет GameObjects:

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);
    }
}

Затем в моем зданииЯ сохраняю ссылку на этот объект Scriptable и вызываю:

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

Однако в моем редакторе он отображается как «Несоответствие типов» для каждой записи в списке, почему это так?

1 Ответ

0 голосов
/ 19 октября 2019

ScriptableObject s - это активы, , предназначенные для хранения только данных, независимо от игровых объектов . Они не могут постоянно хранить ссылки на игровые объекты в пределах определенной Сцены, поскольку они не имеют смысла для любой другой Сцены, на которую может ссылаться ScriptableObject, аналогично тому, как Префаб не может ссылаться на содержимое конкретной Сцены до помещения. Поэтому игровые объекты, на которые они ссылаются, будут перечислены как имеющие неверный тип, и любые такие ссылки будут перечислены как отсутствующие при изменении сцены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...