簡體   English   中英

在Unity C#中使用腳本播放聲音時未將對象引用設置為對象的實例

[英]Object Reference not set to an instance of an object while play sound using script in unity c#

我想使用腳本播放和暫停游戲中的聲音。 我有一個聲音管理器腳本來加載和播放聲音文件。 我嘗試播放其他腳本的音頻。 但是,在我編寫了用於播放音頻的代碼的其他腳本上 ,顯示錯誤消息“ 對象引用未設置為對象的實例 ”。

聲音管理器腳本

using UnityEngine;
using System.Collections;

public class soundManager : MonoBehaviour {

    public static AudioSource au_GameStart;
    public static AudioSource au_afterStart;
    public static AudioSource au_carStart;
    public static AudioSource au_go;
    public static AudioSource au_strike;

    public static bool muteStatus;
    public static soundManager instance;
    void Start () {
        muteStatus = false;
        instance=this;
        au_GameStart = (AudioSource)gameObject.AddComponent <AudioSource>();
        au_afterStart = (AudioSource)gameObject.AddComponent <AudioSource>();
        au_carStart = (AudioSource)gameObject.AddComponent <AudioSource>();
        au_go = (AudioSource)gameObject.AddComponent <AudioSource>();
        au_strike = (AudioSource)gameObject.AddComponent <AudioSource>();

        AudioClip clip_GameStart;
        clip_GameStart = (AudioClip)Resources.Load ("SFX/game_start");
        au_GameStart.clip = clip_GameStart;
        au_GameStart.loop = false;

        AudioClip clip_AfterStart;
        clip_AfterStart = (AudioClip)Resources.Load ("SFX/after_start");
        au_afterStart.clip = clip_AfterStart;
        au_afterStart.loop = false;

        AudioClip clip_carStart;
        clip_carStart = (AudioClip)Resources.Load ("SFX/car_start");
        au_carStart.clip = clip_carStart;
        au_carStart.loop = false;

        AudioClip clip_GO;
        clip_GO = (AudioClip)Resources.Load ("SFX/go");
        au_go.clip = clip_GO;
        au_go.loop = false;

        AudioClip clip_Strike;
        clip_Strike = (AudioClip)Resources.Load ("SFX/strike");
        au_strike.clip = clip_Strike;
        au_strike.loop = true;
}

其他腳本

void Start()
{
soundManager.au_GameStart.Play();
}

當我運行unity game時,它在其他腳本中給出了錯誤提示“對象引用未設置為對象的實例”。 我已經將soundmanager腳本附加到名為SoundManager的游戲對象上。 SoundManager游戲對象會在播放模式下加載聲音。

由於Start()otherscript之前執行Start()soundManager soundManager類中的Start()更改為Awake()應該可以解決此問題。

要么

如果您不想重命名,則可以更改腳本執行順序

更新:正如Everts在其評論中所指出的那樣,通常不建議在Start()或Awake中進行初始化,因為除非您明確指定了Script Execution Order,否則無法保證其執行順序。 但是,即使腳本執行命令也可能導致難以理解的代碼,因為腳本執行命令本身在代碼中不可見。

因此,我們的想法是,創建一個Init(),以便完全控制該對象的初始化。 如果在Init()旁邊需要初始化其他一些對象,請調用其中的Init()。

編輯:當您到達一個類(ClassA)依賴於另一類(ClassB)的地步時,ClassA觸發ClassB是必要的。

public class ClassB : MonoBehaviour
{
    [SerializeField] private MonoA monoA = null;
    public void Init(){
        this.monoA = this.gameObject.GetComponent<MonoA>();
    }
    public void GetMonoAValue(){
        if(this.monoA == null){  this.monoA = this.gameObject.GetComponent<MonoA>(); }
        return this.monoA.Value;
    }
}

public class ClassA:MonoBehaviour
{
     private void Start(){
         ClassB classB = FindObjectOfType<ClassB>();
         classB.Init();
         Value v = classB.GetMonoAValue(); 
     }
}

這種情況非常簡單,您可以直接調用GetMonoAValue,因為它會在null值的情況下進行初始化。 這是示例,您的Init方法可能包含更多代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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