[英]C# / new keyword / class member reference
所以我有2個課(聲音課,音頻管理器課)
我不明白為什么我們可以在不創建Sound類實例的情況下訪問Sound的字段。 ()
像之間有什么區別
public Sound test1;
和
Sound test2 = new Sound();
這對我來說很奇怪,因為我在學習C#教程時/您只能通過創建該類的實例來訪問另一個類的變量,但是在Unity中,您只能通過鍵入public Sound test1來訪問它;
聲音等級
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Audio;
[System.Serializable]
public class Sound
{
public AudioClip clip;
public string name;
public float volume;
public float pitch;
public AudioSource soundclass_source;
}
AudioManager類
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Audio;
public class AudioManager : MonoBehaviour
{
public Sound test1;
Sound test2 = new Sound();
test1.name = "test1"; // without new
test2.name = "test2"; // with new
}
由於它是[Serializable]
並且MonoBehaviour
和ScriptableObject
(etc)類的Unity檢查器會 自動使用默認實例 初始化序列化的字段 ,因此兩者之間沒有區別
public Sound test1;
和
public Sound test1 = new Sound();
(如果類型是可序列化的,則默認情況下將對public
字段進行序列化)
還要注意,一旦您在Unity中創建實例並通過檢查器設置了值,這些序列化的值將始終取代您在此處進行硬編碼的值。 如果您稍后決定例如預先初始化一些值並將其更改為
public Sound test1 = new Sound() { name = "test1" };
因為將采用在檢查器中配置的值,所以它將無效。 此編碼值僅在實例第一次創建時使用,或者在組件上下文菜單中單擊“ Reset
時使用。
如果以后要使用編碼值,則必須在方法中分配新值(請參見下文)。
在c#
,對於諸如public
, protected
或private
類的字段(/ class / method / property / etc),沒有可訪問性定義始終表示private
。
如果字段是private
如您的情況),則必須“手動”對其進行初始化,否則,類的默認值始終為null
(==無實例引用)。
您可以像在課堂上靜態地那樣進行操作
private Sound test2 = new Sound();
這意味着該實例已經在創建您的類的實例后立即創建,或者以后可以在類似方法中執行
private Sound test2;
private void Awake()
{
Sound test2 = new Sound();
}
最后,您可以/應該對封裝進行盡可能的private
,但仍可以使它們序列化=>在檢查器中顯示並使用[SerializeField]
屬性進行存儲:
[SerilaizeField] private Sound test2;
您可以在此處閱讀有關Unity序列化的更多信息
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.