gpt4 book ai didi

unity-game-engine - 是否有 OnEnable() 方法的替代方法?

转载 作者:行者123 更新时间:2023-12-02 15:17:57 25 4
gpt4 key购买 nike

我正在制作一个自定义编辑器窗口。我有一堆具有 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 is not allowed to be called during serialization, call it from OnEnable instead. See "Script Serialization" page in the Unity Manual for further details. UnityEngine.RectOffset:.ctor(Int32, Int32, Int32, Int32)

当然我没有这个方法。我的类将具有多个属性,这些属性必须在 OnEnable 中获取值,但这是不可能的,因为它们是动态实例化的。

我应该怎样做才能模拟 OnEnable 行为?如何使用Activator.CreateInstance实例化一个对象而不出错?

最佳答案

我现在制作了自己的非常简化的类(class)并且它有效:

[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})";
}
}

但是,如果我将使用另一个需要在 OnEnable() 方法中初始化的内置 Unity 类 - 我将不得不为它们创建越来越多的剩余类我的目的

关于unity-game-engine - 是否有 OnEnable() 方法的替代方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50968226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com