脚本实例返回null

时间:2016-06-18 12:27:19

标签: c# android unity3d 2d

对象引用未发送到对象的实例 我的代码是S ceneFader.instance.LoadLevel("Gameplay"); 我正在将它用于我的新的2d安卓游戏。

我的MainMenuController.cs完整代码是'

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class MainMenuController : MonoBehaviour {

    [SerializeField]
    private Button musicBtn;

    [SerializeField]
    private Sprite[] musicIcons;

    // Use this for initialization
    void Start () {
        CheckToPlayTheMusic ();
    }

    void CheckToPlayTheMusic(){
        if (GamePreferences.GetMusicState () == 1) {
            MusicController.instance.PlayMusic (true);
            musicBtn.image.sprite = musicIcons [1]; 
        } else {
            MusicController.instance.PlayMusic (false);
            musicBtn.image.sprite = musicIcons [0];
        }

    }

    public void StartGame(){
        GameManager.instance.gameStartedFromMainMenu = true;
        //Application.LoadLevel ("Gameplay");
        SceneFader.instance.LoadLevel("Gameplay");
    }

    public void HighscoreMenu(){
        Application.LoadLevel ("HighScoreScene");


    }

    public void OptionsMenu(){
        Application.LoadLevel ("OptionsMenu");
    }


    public void QuitGame(){
        Application.Quit ();

    }


    public void MusicButton(){
        if (GamePreferences.GetMusicState () == 0) {
            GamePreferences.SetMusicState (1);
            MusicController.instance.PlayMusic (true);
            musicBtn.image.sprite = musicIcons [1];
        } else if (GamePreferences.GetMusicState () == 1) {
            GamePreferences.SetMusicState (0);
            MusicController.instance.PlayMusic (false);
            musicBtn.image.sprite = musicIcons [0];
        }

    }

}

任何机构都有同样的问题吗?

请查看scenefader脚本

使用UnityEngine; 使用System.Collections;

公共类SceneFader:MonoBehaviour {

public static SceneFader instance;

[SerializeField]

private GameObject fadePanel;

[SerializeField]
private Animator fadeAnim;

// Use this for initialization
void Awake () {
    MakeSingleton ();
}

void MakeSingleton(){
    if (instance != null) {
        Destroy (gameObject);
    } else {
        instance = this;
        DontDestroyOnLoad (gameObject);

    }

}

public void LoadLevel(string level){
    StartCoroutine (FadeInOut (level));
}

IEnumerator FadeInOut (string level){
    fadePanel.SetActive (true);
    fadeAnim.Play ("FadeIn");

    yield return StartCoroutine (MyCoroutine.WaitForRealSeconds (1f));

    Application.LoadLevel (level);
    fadeAnim.Play ("FadeOut");

    yield return StartCoroutine (MyCoroutine.WaitForRealSeconds (.7f));

    fadePanel.SetActive (false);

}

}

1 个答案:

答案 0 :(得分:0)

问题是由于单身人士造成的。没有SceneFader的实例。

变化:

void MakeSingleton(){
    if (instance != null) {
        Destroy (gameObject);
    } else {
        instance = this;
        DontDestroyOnLoad (gameObject);
}

void MakeSingleton(){
    if (instance != null && instance != this) {
        Destroy (gameObject);
    } else {
        instance = this;
        DontDestroyOnLoad (gameObject);
}

那应该可以解决你的问题。如果这个问题仍然存在,那么你必须从项目中删除单例。有一种叫做GetComponent的东西。使用它来获取SceneFader脚本的实例。

创建名为 SceneFaderObj 的GameObject,并从编辑器将SceneFader脚本附加到其中。不要忘记删除SceneFader脚本中的所有单例代码。

现在,在MainMenuController脚本中,

SceneFader screenFader;
void Start () {
    //Find the SceneFaderObj GameObject
    GameObject tempObj = GameObject.Find("SceneFaderObj");
    //Get the SceneFader script instance that is attached to SceneFaderObj 
    screenFader = tempObj.GetComponent<SceneFader>();
}

然后,您可以使用screenFader调用SceneFader脚本中的函数。为您的其他脚本执行相同的操作,例如MusicControllerGamePreferences以及GameManager脚本。