![](/img/trans.png)
[英]Unity c# Object reference not set to an instance of an Object ( Shooting Script )
[英]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.