我正在创建一个自定义EditorWindow。我有一堆具有RectOffset
属性的类。这些是常规类,不是从ScriptableObject
或Monobehaviour
继承的。
我序列化和反序列化它们。反序列化时,我使用Activator.CreateInstance(Type, Object[]);
动态实例化它们,例如:
public void OnAfterDeserialize() {
Vector2 dropPosition = new Vector2(10, 10);
Control child = (Control)Activator.CreateInstance(typeof(Button), dropPosition);
child.Name = child.InitName;
TestRectOffset = new RectOffset(0, 0, 0, 0);
}
但是在这种情况下, Unity3d 给我一个错误,我必须对OnEnable()
使用RectOffset
。
set_left不允许在序列化期间调用,请调用它 从OnEnable代替。 有关更多详细信息,请参见《 Unity手册》中的“脚本序列化”页面。 UnityEngine.RectOffset:.ctor(Int32,Int32,Int32,Int32)
当然,我没有这种方法。我的课程将拥有不止一个属性,该属性必须在OnEnable
中获取值,但是这是不可能的,因为它们是动态实例化的。
我该如何模拟OnEnable
的行为?如何使用Activator.CreateInstance
实例化对象而没有错误?
答案 0 :(得分:0)
此刻我自己做了一个非常简化的类,它可以正常工作:
[Serializable]
public class RectOffsetSeralizable {
public int Top { get; set; }
public int Left { get; set; }
public int Right { get; set; }
public int Bottom { get; set; }
public RectOffsetSeralizable() : this(0, 0, 0, 0) { }
public RectOffsetSeralizable(RectOffset rectOffset) {
Top = rectOffset.top;
Bottom = rectOffset.bottom;
Left = rectOffset.left;
Right = rectOffset.right;
}
public RectOffsetSeralizable(int left, int right, int top, int bottom) {
Top = top;
Bottom = bottom;
Left = left;
Right = right;
}
public RectOffset ToRectOffset() {
return new RectOffset(Left, Right, Top, Bottom);
}
public override string ToString() {
return $"RectOffset (l:{Left} r:{Right} t:{Top} b:{Bottom})";
}
}
但是,如果我要使用另一个内置的 Unity 类,这些类需要在 OnEnable()方法中进行初始化-我将不得不为越来越多的剩余类我的目的