2017-01-06 5 views
0

Pouvez-vous s'il vous plaît m'aider avec ce problème, j'ajoute FMOD à UNITY et je veux changer ma musique quand le joueur est endommagé, du côté FMOD est OK, mais dans l'unité, il me donne une erreur: NullReferenceException: objet de référence non définie à une instance d'un MusicControl.Update objet() (à Actif/MusicControl.cs:Unity + FMOD variable de joueur de santé à getParameter ne fonctionne pas

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) 
    } 

} 

Merci pour l'avance

+0

Il est bon de mettre GameObject.Find() dans Update(), parce que l'unité se trouve l'objet dans la scène chaque image, laissez dire que vous avez 100 objet alors besoin de trouver l'unité objet nommé joueur dans tous les Cadre. Mettez-le dans la fonction Awake(). –

Répondre

0

Le musicEv et musicPar les variables sont déclarées mais n'a jamais été initialisé avant utilisation dans la fonction Update().

Vous avez essayé de les initialiser dans les fonctions MenuMusic() et LevelMusic() mais il n'y a aucune garantie que ces fonctions seront appelées avant que la fonction Update() où vous les utilisez.

Supprimer musicEv = FMODUnity.RuntimeManager.CreateInstance(menuMusic); des deux MenuMusic() et LevelMusic() fonctions et le déplacer à la fonction Start() ou Awake() afin d'initialiser musicEv. Ensuite, vous pouvez initialiser musicPar en appelant musicEv.getParameter("HEALTH", out musicPar);.

De même, ne faites pas val = GameObject.Find("Player") dans la fonction de mise à jour. Faites-le une fois dans la fonction Start() ou Awake(), puis enregistrez-le dans une variable globale. En fait, il serait bon de simplement mettre en cache le script Player qui lui est attaché.

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

Un grand merci programmeur Mais l'erreur apparaît toujours = (( je menu script Mangeoire qui contrôlent les boutons sur le niveau du menu et dans ce script que j'appelle la fonction MenuMusic() mais il me donne un script d'erreur : 'public class MenuManager: MonoBehaviour { \t publique MusicControl musicSystem, \t vide Start() { musicSystem.MenuMusic();} ' et erreur: _NullReferenceException: référence d'objet non définie à une instance d'un objet MusicControl.MenuMusic() (at Assets/MusicControl.cs: 33) MenuManager.Start() (at Assets/Scripts/MenuManager.cs: 28) _ – YellowJazz

+0

Mais, maintenant c'est une question différente sur un autre script. Pouvez-vous accepter cela une fois, puis créer une nouvelle question. Incluez ce code dans votre nouvelle question et expliquez où se situe le problème. J'y jetterais un œil. – Programmer