从Unity中的其他脚本调用函数

时间:2016-10-23 20:17:50

标签: c# object unity3d reference

我正在尝试使用附加到第二个游戏对象的其他脚本从附加到游戏对象的脚本调用函数。

这两个游戏对象被称为:玩家,游戏管理器。

播放器有一个名为Gold的脚本,Game Manager有一个名为GameManager的脚本

尝试从GameManager.cs调用Gold.cs中的SetGold()函数,但是我收到错误:NullReferenceException:对象引用未设置为对象的istance

我目前的代码: Gold.cs:

using UnityEngine;
using System.Collections;

public class Gold : MonoBehaviour {
    GameManager gm;

    public UnityEngine.UI.Text goldDisplay;

    private float _gold;

    void Start ()
    {
        gm = GameObject.Find("Game Manager").GetComponent<GameManager>();
        gm.Load();
    }

    void Update ()
    {
        UpdateGoldDisplay();
    }

    public void SetGold(float x)
    {
        _gold = x;
    }

    public float GetGold()
    {
        return _gold;
    }

    public void UpdateGoldDisplay()
    {
        SetGoldDisplay(GetGold().ToString());
    }
    public void SetGoldDisplay(string x)
    {
        goldDisplay.text = x;
    }
}

我的其他脚本(GameManager.cs)

using UnityEngine;
using System.Collections;

public class GameManager : MonoBehaviour {

    GameObject GO_Player;
    Gold gold;

    void Start ()
    {
        GO_Player = GameObject.Find ("Player");
        gold = GO_Player.GetComponent<Gold>();
    }

    void OnApplicationQuiot()
    {
        Save();
    }
    public void Load()
    {
        gold.SetGold(PlayerPrefs.GetFloat("gold", 50));
    }
    private void Save()
    {
        PlayerPrefs.SetFloat("gold", 1);
    }

    public void DeleteSaves()
    {
        PlayerPrefs.SetFloat("gold", 0);
    }
}

先谢谢。

1 个答案:

答案 0 :(得分:1)

我建议在Awake中使用初始化工作(阅读更多123)。 我在这里引用了一个答案:

  

通常,Awake()用于初始化某些值或脚本   相互依赖,如果其中之一,则会导致错误   初始化太晚了(在游戏开始前清醒运行)。醒来是   每个脚本实例也只调用一次。

您的空引用异常使我认为您在初始化之前尝试访问它,因为所有初始化也在Start中编写。