【问题标题】:Calling a function from other script in Unity从 Unity 中的其他脚本调用函数
【发布时间】:2016-10-23 20:17:49
【问题描述】:

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

这两个游戏对象被称为:Player、Game Manager。

玩家有一个名为 Gold 的脚本,而游戏管理器有一个名为 GameManager 的脚本

尝试从 GameManager.cs 调用 Gold.cs 中的 SetGold() 函数,但出现错误:NullReferenceException: Object reference not set to an istance of an object

我当前的代码: 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);
    }
}

提前致谢。

【问题讨论】:

  • 将以下内容从GameManager gm;初始化为gm = new GameManager();并对gold 对象执行相同操作或创建构造函数
  • 而不是 new GameManager();我不得不使用 gm = gameObject.AddComponent();出于某种原因,当我点击 Play 时,它在一秒钟内多次生成相同的错误: NullReferenceException: Object reference not set to an instance of an object Gold.SetGoldDisplay (Single amount) (at Assets/Scripts/Player/Gold.cs :37) 但我已将 Text 对象拖放到层次结构编辑器中的 gameObject 中:\
  • @MethodMan 不能在继承自 MonoBehaviour 的类上使用 new 关键字。 OPS 当前代码看起来不错。
  • 你能发布你的层次结构的截图吗?另外,你可以选择你的游戏对象然后截图并上传吗?只需在问题中发布屏幕截图的两个链接

标签: c# object unity3d reference


【解决方案1】:

我会推荐在 Awake 中使用初始化工作(阅读更多1,2,3)。 我在这里引用了一个答案:

通常 Awake() 用于初始化某些值或脚本是否 相互依赖,如果其中之一是 初始化太晚(游戏开始前唤醒运行)。清醒的是 每个脚本实例也只调用一次。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 2019-09-28
    • 2013-11-12
    相关资源
    最近更新 更多