Не могли бы вы помочь мне с этой проблемой, я добавляю 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)
    }

}

Спасибо за аванс

0
YellowJazz 6 Янв 2017 в 14:46
Нехорошо помещать GameObject.Find () в Update (), потому что единство будет находить объект в сцене в каждом кадре, допустим, у вас есть 100 объектов, тогда единству нужно найти объект с именем Player в каждом кадре. Поместите это в функцию Awake ().
 – 
Tengku Fathullah
6 Янв 2017 в 15:49

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);
    }
}
0
Programmer 6 Янв 2017 в 15:48
Большое спасибо Программисту, но ошибка все равно появляется = ((У меня есть скрипт Менеджера меню, который управляет кнопками на уровне меню, и в этом скрипте я вызываю функцию MenuMusic (), но он дает мне скрипт ошибки: 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)
 – 
YellowJazz
9 Янв 2017 в 07:40
Но теперь это другой вопрос по другому сценарию. Можете ли вы принять это один раз, а затем создать новый вопрос. Включите этот код в свой новый вопрос и объясните, где возникает проблема. Я посмотрю.
 – 
Programmer
9 Янв 2017 в 13:47