为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
MYYA 2023-08-13 10:13:00
我有一个脚本,它接受一个预制件,稍后从中实例化对象。该预制件在其组件之一中有一些静态数据,我希望在实例化任何内容之前读取这些数据,为此我需要获取该组件,自然是使用GetComponent(). 后来该数据被实例多次读取,所以我不想GetComponent()一直使用,因为我知道这是一个相当繁重的操作。因此,很自然地,像往常一样,我保留一个保存该组件的变量并在函数中初始化该变量Awake()。问题是,该Awake()函数不是为预制件本身调用的,而是仅为我后来使用Instantiate().换句话说,理想情况下我想这样做:void Awake(){    imageSelector = GetComponent<ImageSelector>();}public int MaxValue => imageSelector.Count;但为了让它在实例化之前适用于预制件本身,我需要这样做:public int MaxValue => GetComponent<ImageSelector>().Count;当然,我可以进行类似单例的读取访问,检查我是否已经保存了组件,如果没有,则获取并保存它,但这不太好,对我来说,会有一些初始化过程似乎是合理的我可以做这件事。那么如何初始化未实例化的预制件呢?我还想到了其他一些解决方法,其中没有一个是我特别喜欢的,但如果有必要,我会使用其中一个 - 尽管如此,我想知道是否有一种干净的方法可以做到这一点。提前致谢。
查看完整描述

3 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

你不能

预制件没有调用它们的 MonoBehaviour 方法,因为它们尚未且永远不会被初始化。

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


查看完整回答
反对 回复 2023-08-13
?
叮当猫咪

TA贡献1776条经验 获得超12个赞

我遇到了一些类似的问题,试图在实例化预制件设置之前对其进行初始化。我很难理解,因为我期望有更干净的方式来做到这一点,但似乎是 Unity 中的自然方式。通常来自 c++、c# 或 oop,它可能用于像在类构造函数中一样设置组件。我得到的结论是,从编程的角度来看,Unity 并没有完全达到这种操作方法。当然,您可以使用 C# 普通类及其构造函数等(不是从 monobehaviour 继承),但如果您准备使用 Unity 类和工具,您应该从编程的角度经历在 Unity 中设置类的尴尬方式,另一方面又非常有效。



查看完整回答
反对 回复 2023-08-13
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

ISerializationCallbackReceiver.OnAfterDeserialize() 可以用作预制件的 Awake() 的替代品。它的使用方式如下:


public class AnyCustomComponent : MonoBehaviour, ISerializationCallbackReceiver

{

    public AnySerializedData serializedData;


    private AnyInitializedData initializedData;


    public void OnBeforeSerialize() { }


    public void OnAfterDeserialize()

    {

        initializedData = serializedData.Init();

    }

}

需要注意的是,此回调不仅会在游戏开始时发生,还会在编辑器中编辑期间发生,但我想在大多数情况下,这实际上不应该成为问题。


查看完整回答
反对 回复 2023-08-13
  • 3 回答
  • 0 关注
  • 149 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信