ScriptableObject не отображается в Инспекторе, когда Unity закрывается, а затем снова открывается - PullRequest
0 голосов
/ 07 марта 2019

Как и заголовок, я не создал пользовательский инспектор для ScriptableObject и, по-моему, большинство ответов использует SetDirty (объект), но он не работает. Когда я изменяю любой код в проекте и Unity проведет рефакторинг кода C #, некоторые из объектов ScriptableObject будут отображаться на панели «Инспектор», не все SO отображаются, но частично отображаются Панель проекта, панель инспектора не имеет ничего; enter image description here enter image description here

Как вы можете видеть, MouseModuleData не отображается, который был создан в последний раз, когда я открывал Unity. MouseModuleData1 создается с этого времени, поэтому я думаю, что если есть проблема с моей структурой данных.

/// <summary>
/// Base Class of Module Data
/// </summary>
public abstract class PitchModuleBaseData : ScriptableObject, IEnumerable
{
    public abstract IEnumerator GetEnumerator();
}

/// <summary>
/// Face Module Data
/// </summary>
[System.Serializable, CreateAssetMenu(fileName = "MouseModuleData", menuName = "AvatarData/MouseModuleData")]
public class MouthModuleData : PitchModuleBaseData
{
    public BoneData MouthCornerLeft;
    public BoneData MouthCornerRight;
    public BoneData LeapUp;
    public BoneData LeapMiddle;
    public BoneData LeapDown;
    public BoneData MouseRoot;

    public MouthModuleData()
    {
        MouthCornerLeft = new BoneData(PitchFaceConst.Mouth_CornerL, PitchFaceConst.Mouth_CornerR);
        MouthCornerRight = new BoneData(PitchFaceConst.Mouth_CornerR, PitchFaceConst.Mouth_CornerL);
        LeapDown = new BoneData(PitchFaceConst.Mouth_LeapDown);
        LeapMiddle = new BoneData(PitchFaceConst.Mouth_LeapMiddle);
        LeapUp = new BoneData(PitchFaceConst.Mouth_LeapUp);
        MouseRoot = new BoneData(PitchFaceConst.Mouth_Root);
    }

    public override IEnumerator GetEnumerator()
    {
        BoneData[] arr = new BoneData[6];
        arr[0] = MouthCornerLeft;
        arr[1] = MouthCornerRight;
        arr[2] = LeapUp;
        arr[3] = LeapDown;
        arr[4] = MouseRoot;
        arr[5] = LeapMiddle;
        return new DataEnumerator(arr);
    }
}

Итак, я сделал тест; Я создал данные, подобные приведенным выше.

 public abstract class ABData : ScriptableObject, IEnumerable
{
    public abstract IEnumerator GetEnumerator();
}

[System.Serializable, CreateAssetMenu(fileName = "TestData", menuName = "Create/TestData")]
public class TestData : ABData
{
    public TestData()
    {
        data = new BoneData();
        Middle = new BoneData(PitchFaceConst.Eye_Mid);
        Left = new BoneData(PitchFaceConst.Eye_Left, PitchFaceConst.Eye_Right);
        Right = new BoneData(PitchFaceConst.Eye_Right, PitchFaceConst.Eye_Left);
        EyeLeft1 = new BoneData(PitchFaceConst.Eye_L1, PitchFaceConst.Eye_R1);
        EyeLeft2 = new BoneData(PitchFaceConst.Eye_L2, PitchFaceConst.Eye_R2);
        EyeLeft3 = new BoneData(PitchFaceConst.Eye_L3, PitchFaceConst.Eye_R3);
        EyeLeft4 = new BoneData(PitchFaceConst.Eye_L4, PitchFaceConst.Eye_R4);
        EyeRight1 = new BoneData(PitchFaceConst.Eye_R1, PitchFaceConst.Eye_L1);
        EyeRight2 = new BoneData(PitchFaceConst.Eye_R2, PitchFaceConst.Eye_L2);
        EyeRight3 = new BoneData(PitchFaceConst.Eye_R3, PitchFaceConst.Eye_L3);
        EyeRight4 = new BoneData(PitchFaceConst.Eye_R4, PitchFaceConst.Eye_L4);
    }

    public BoneData data;

    public BoneData Middle;
    public BoneData Left;
    public BoneData Right;

    public BoneData EyeLeft1;
    public BoneData EyeLeft2;
    public BoneData EyeLeft3;
    public BoneData EyeLeft4;

    public BoneData EyeRight1;
    public BoneData EyeRight2;
    public BoneData EyeRight3;
    public BoneData EyeRight4;

    public override IEnumerator GetEnumerator()
    {
        throw new System.NotImplementedException();
    }
}

Тогда позвольте мне сойти с ума, что-то случилось. TheTestData показывается как обычно Независимо от того, открыт он снова или нет, он работает так же, как обычная ОС.

enter image description here

Пожалуйста, помогите мне, дайте мне встать на правильный путь.

1 Ответ

0 голосов
/ 07 марта 2019

РЕШЕНО: Я поместил весь код ScriptableObject в один файл .cs. После перезагрузки проекта Unity не может найти instanceID сценария ScriptableObject, вы можете разрешить Inspector перейти в режим DEBUG для проверки!Ответ - каждый ScriptableObject, с которым у вас должен быть справочный файл .cs;

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