簡體   English   中英

C#/新關鍵字/類成員參考

[英]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]並且MonoBehaviourScriptableObject (etc)類的Unity檢查器會 自動使用默認實例 初始化序列化的字段 ,因此兩者之間沒有區別

public Sound test1;

public Sound test1 = new Sound();

(如果類型是可序列化的,則默認情況下將對public字段進行序列化)

還要注意,一旦您在Unity中創建實例並通過檢查器設置了值,這些序列化的值將始終取代您在此處進行硬編碼的值。 如果您稍后決定例如預先初始化一些值並將其更改為

public Sound test1 = new Sound() { name = "test1" };

因為將采用在檢查器中配置的值,所以它將無效。 此編碼值僅在實例第一次創建時使用,或者在組件上下文菜單中單擊“ Reset時使用。

如果以后要使用編碼值,則必須在方法中分配新值(請參見下文)。


c# ,對於諸如publicprotectedprivate類的字段(/ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM