亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 212 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號