是否可以替代OnEnable()方法?

时间:2018-06-21 12:07:57

标签: unity3d

我正在创建一个自定义EditorWindow。我有一堆具有RectOffset属性的类。这些是常规类,不是从ScriptableObjectMonobehaviour继承的。

我序列化和反序列化它们。反序列化时,我使用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实例化对象而没有错误?

1 个答案:

答案 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()方法中进行初始化-我将不得不为越来越多的剩余类我的目的