没有实例化的预制件的 Awake()

Awake() for Prefab Without Instantiation

我有一个接受预制件的脚本,稍后它会从中实例化对象。

那个预制件在其组件之一中有一些静态数据,我希望在实例化任何东西之前读取这些数据,为此我需要获取组件,自然地使用 GetComponent()。后来该数据被实例多次读取,所以我不想一直使用 GetComponent() 因为我知道这是一个相当繁重的操作。所以很自然地,像往常一样,我保留了一个变量来保存这个组件并在 Awake() 函数中初始化该变量。

问题是,Awake() 函数不会为预制件本身调用,而只会为我稍后使用 Instantiate() 创建的实例调用。

换句话说,理想情况下我想这样做:

void Awake()
{
    imageSelector = GetComponent<ImageSelector>();
}

public int MaxValue => imageSelector.Count;

但是为了让它在实例化之前为预制件本身工作,我需要这样做:

public int MaxValue => GetComponent<ImageSelector>().Count;

当然,我可以进行类似单例的读取访问,我检查我是否已经保存了组件,如果没有保存,则获取并保存它,但这不是很好,对我来说这似乎是合理的将是一些我可以挂钩的初始化过程。

那么如何为未实例化的预制件初始化东西?

我还想到了其他一些解决方法,none 我特别喜欢其中的一种,但如果需要我会使用其中的一种 - 尽管如此,我还是想知道是否有一种干净的方法这样做。

提前致谢。

你不能

Prefabs 没有对其调用 MonoBehaviour 方法,因为它们还没有——而且永远不会——被初始化。

请注意,您可以在检查器中自己分配 属性 而根本不用理会 Awake 调用。

我在尝试初始化预制设置之前遇到了一些类似的问题。我很难理解,因为我希望有一种更简洁的方式来做到这一点,但似乎是 Unity 中的自然方式。 通常来自 c++、c# 或 oop,它很可能用于组件的设置,例如 class 构造函数。我得到的结论是,从programaticall的角度来看,Unity并没有完全走到那种操作方式。 您当然可以使用 c# 普通 classes 及其构造函数等(不是从 monobehaviour 继承)但是如果您要使用 Unity classes 和工具,您应该通过 programaticall从另一方面来看,在 Unity 中设置 classes 的尴尬方式非常有效。 所以我认为设置事物的正常方法是通过 monobehaviour classes 的构造函数,这是 Awake() (或者可能是 start()),然后再进入更复杂的可以编写脚本的对象,或 .json/.xml 读者,除非您具有高级的 c# 和统一知识,否则解决这些问题并不容易。

希望对您有所帮助