【问题标题】:ScriptableObject does not show up in Inspector when Unity is closed and then reopened当 Unity 关闭然后重新打开时,ScriptableObject 不会显示在 Inspector 中
【发布时间】:2019-03-07 11:51:58
【问题描述】:

像标题一样,我没有为 ScriptableObject 创建自定义检查器,我用谷歌搜索,大多数答案都是使用 SetDirty(object) 但它不起作用。当我修改项目和 Unity 中的任何代码时将重构C#代码,Inspector面板中会显示一些ScriptableObjects,不是所有SO都显示而是部分显示,我检查了这些显示的SO,数据没有丢失;当我再次重新打开项目时,然后单击SO Project面板,Inspector面板什么都没有;

如你所见,上次打开Unity时创建的MouseModuleData不是display,这次创建的是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();
    }
}

然后让我发疯,发生了一些事情。TestData 显示正常无论是否重新打开,它都像正常的操作系统一样工作。

请帮助我,让我走上正轨。

【问题讨论】:

  • 我看到脚本丢失了,可能是问题。

标签: unity3d


【解决方案1】:

已解决: 我把所有的ScriptableObject代码放在一个.cs文件里,重新加载项目后,Unity找不到ScriptableObject脚本instanceID,可以让Inspector进入DEBUG模式检查! 答案是每个 ScriptableObject 都应该有一个参考 .cs 文件;

【讨论】:

  • 一般来说,为每个单独的类、结构体、枚举等定义拥有一个.cs 文件总是更好的选择!首先,因为找到您的个人类型比找到您的个人类型要容易得多,其次,您没有更改的文件/类型不必重新编译 -> 如果您有所有您的实现在一个单一的每次您对其中一个定义进行小的更改时,它都必须重新编译整个文件!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多