Не могли бы вы помочь мне с этой проблемой, я добавляю FMOD в UNITY и хочу изменить свою музыку, когда Player получает повреждение, со стороны FMOD все в порядке, но в Unity это дает мне ошибку: NullReferenceException: ссылка на объект не установлен в экземпляр объекта MusicControl.Update () (в Assets / MusicControl.cs:
using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;
using FMOD.Studio;
public class MusicControl : MonoBehaviour {
[FMODUnity.EventRef]
public string explosion = "event:/EXPLOSION";
[FMODUnity.EventRef]
public string shoot = "event:/SHOOT SOUND";
[FMODUnity.EventRef]
public string menuMusic = "event:/MENU MUSIC";
int val;
public FMOD.Studio.EventInstance musicEv;
public FMOD.Studio.ParameterInstance musicPar;
void Start()
{
}
//music for menu, I'm call this function when my stage starts(menu game)
public void MenuMusic()
{
musicEv = FMODUnity.RuntimeManager.CreateInstance(menuMusic);
musicEv.start();
}
//music for level 1, I'm call this function when my stage starts(level game)
public void LevelMusic()
{
musicEv = FMODUnity.RuntimeManager.CreateInstance(menuMusic);
musicEv.setParameterValue("FIGHT MUSIC", 100f);
musicEv.getParameter("HEALTH", out musicPar);
musicPar.setValue(100);
musicEv.start();
}
//I'm call this function when stages is close up
public void StopMusic()
{
musicEv.stop(FMOD.Studio.STOP_MODE.IMMEDIATE);
}
// I'm take current Health from Player script
void Update()
val = GameObject.Find("Player").GetComponent<Player>().stats.curHealth;
musicPar.setValue(val); //Unity gives me an error - NullReferenceException: Object reference not set to an instance of an object MusicControl.Update () (at Assets/MusicControl.cs:147)
}
}
Спасибо за аванс
1 ответ
Переменные musicEv
и musicPar
объявлены , но никогда не инициализируются перед использованием в функции Update()
.
Вы пытались инициализировать их в функциях MenuMusic()
и LevelMusic()
, но нет гарантии, что эти функции будут вызваны перед функцией Update()
, в которой вы их фактически используете.
Удалите musicEv = FMODUnity.RuntimeManager.CreateInstance(menuMusic);
из функций MenuMusic()
и LevelMusic()
и переместите его в функцию Start()
или Awake()
, чтобы инициализировать musicEv
.
После этого вы можете инициализировать musicPar
, вызвав musicEv.getParameter("HEALTH", out musicPar);
.
Также не делайте val = GameObject.Find("Player")
в функции обновления. Сделайте это один раз в функции Start()
или Awake()
, затем сохраните в глобальной переменной. Фактически, было бы хорошо просто кэшировать прикрепленный к нему скрипт Player
.
public class MusicControl : MonoBehaviour {
[FMODUnity.EventRef]
public string explosion = "event:/EXPLOSION";
[FMODUnity.EventRef]
public string shoot = "event:/SHOOT SOUND";
[FMODUnity.EventRef]
public string menuMusic = "event:/MENU MUSIC";
int val;
public FMOD.Studio.EventInstance musicEv;
public FMOD.Studio.ParameterInstance musicPar;
private Player player;
void Awake()
{
//Initialize musicEv
musicEv = FMODUnity.RuntimeManager.CreateInstance(menuMusic);
//Initialize musicPar(done with the out keyword)
musicEv.getParameter("HEALTH", out musicPar);
//Initialize player
player = GameObject.Find("Player").GetComponent<Player>();
}
//music for menu, I'm call this function when my stage starts(menu game)
public void MenuMusic()
{
musicEv.start();
}
//music for level 1, I'm call this function when my stage starts(level game)
public void LevelMusic()
{
musicEv.setParameterValue("FIGHT MUSIC", 100f);
musicEv.getParameter("HEALTH", out musicPar);
musicPar.setValue(100);
musicEv.start();
}
//I'm call this function when stages is close up
public void StopMusic()
{
musicEv.stop(FMOD.Studio.STOP_MODE.IMMEDIATE);
}
// I'm take current Health from Player script
void Update()
{
val = player.stats.curHealth;
musicPar.setValue(val);
}
}
public class MenuManager : MonoBehaviour { public MusicControl musicSystem; void Start() { musicSystem.MenuMusic(); }
и ошибку: NullReferenceException: ссылка на объект не установлена на экземпляр объекта MusicControl.MenuMusic () (в Assets / MusicControl.cs: 33) MenuManager.Start () (в Assets / Scripts / MenuManager.cs: 28)
Похожие вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.