【发布时间】: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