【问题标题】:Unity + FMOD health player variable to getParameter doesn't workUnity + FMOD 健康播放器变量到 getParameter 不起作用
【发布时间】:2017-01-06 11:46:08
【问题描述】:

你能帮我解决这个问题吗,我正在将 FMOD 添加到 UNITY 并且想在播放器受到损坏时更改我的音乐,从 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)
    }

}

感谢提前

【问题讨论】:

  • 不宜将GameObject.Find()放到Update()中,因为unity会在每一帧找到场景中的物体,假设你有100个物体,那么unity需要找到名为Player的物体在每一帧。将其放入 Awake() 函数中。

标签: c# unity3d fmod


【解决方案1】:

musicEvmusicPar 变量已声明在用于 Update() 函数之前从未初始化。

您尝试在 MenuMusic()LevelMusic() 函数中初始化它们,但不能保证这些函数会在您实际使用它们的 Update() 函数之前被调用。

MenuMusic()LevelMusic() 函数中删除musicEv = FMODUnity.RuntimeManager.CreateInstance(menuMusic); 并将其移至Start()Awake() 函数以初始化musicEv

之后,您可以通过调用musicEv.getParameter("HEALTH", out musicPar); 来初始化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);
    }
}

【讨论】:

  • 非常感谢程序员但仍然出现错误 =(( 我有菜单管理器脚本,它控制菜单级别上的按钮,在这个脚本中我调用 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)
  • 但是,现在这是另一个脚本的不同问题。你能接受一次,然后创建一个新问题。在您的新问题中包含该代码并解释问题发生的位置。我去看看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多