首页 > 解决方案 > 无需实例化的预制件的 Awake()

问题描述

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

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

问题是,Awake()预制件本身不会调用该函数,而只会为我稍后使用Instantiate().

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

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

public int MaxValue => imageSelector.Count;

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

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

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

那么如何为未实例化的预制件初始化事物呢?

我还想到了其他一些解决方法,我特别喜欢其中的一种,但如果有必要我会使用其中一种——不过,我想知道是否有一种干净的方法可以做到这一点。

提前致谢。

标签: c#unity3dinitialization

解决方案


你不能

Prefab 没有调用 MonoBehaviour 方法,因为它们没有被初始化——也永远不会被初始化。

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


推荐阅读