级别管理器脚本中的空引用异常

时间:2017-11-20 15:40:05

标签: c# unity3d

所以我基本上是团结和C#的新手,并一直跟随在线教程(N3K 2D平台游戏,YouTube),我正在尝试创建一个基本的UI来显示得分等我似乎遇到过一个空指针异常,我似乎无法弄清楚,因为我引用了导致此错误的两个对象,即我的scoreText对象和我的hitPointText对象。

正如我所说,我确实通过将它们从我的层次结构中拖动到我在检查器中的级别管理器脚本中创建的字段来引用这些对象,并且我只是按照教程完成并完成了正如视频指示的那样,但在视频上它似乎工作正常。

令人讨厌的代码行是:

    scoreText.text = score.ToString();
    hitPointText.text = hitPoints.ToString();

本教程现已超过1年,有可能团结更新已改变,需要引用的内容吗?

我会在下面发布我的级别管理员代码,希望有人能够指出我似乎缺少的错误。

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

public class LevelManager : MonoBehaviour
{
    public static LevelManager Instance { set; get; }

    public Transform spawnPosition;
    public Transform playerTransform;
    private int hitPoints = 3;
    private int score = 0;

    public Text scoreText;
    public Text hitPointText;

    private void Awake()
    {
        Instance = this;
        scoreText.text = score.ToString();
        hitPointText.text = hitPoints.ToString();
    }

    // Use this for initialization
    void Start ()
    {

    }

    // Update is called once per frame
    private void Update ()
    {
        if(playerTransform.position.y < (-10))
        {
            playerTransform.position = spawnPosition.position;
            hitPoints--;

            if(hitPoints <= 0)
            {
                Debug.Log("Your Dead!");
            }
        }
    }

    public void Win()
    {
        Debug.Log("Victory");
    }
}

以下屏幕的片段:

Scene view of unity engine

Game view of unity engine, with game running

所以这里是我的播放器类的一段代码,它在LevelManager脚本上使用Instance,以便它可以访问win()方法,如开关“WinPost”的最后一种情况所示,而不是当你提到单身时,确定这是否就是你所指的那个,除此之外,我所拥有的任何一个剧本中都没有使用单身一词。

switch (hit.gameObject.tag)
        {
            case "Coin":
                Destroy(hit.gameObject);
                break;
            case "JumpPad":
                verticalVelocity = jumpForce * 2;
                break;
            case "Teleporter_1":
                controller.enabled = false;
                transform.position = hit.transform.GetChild(0).position;
                controller.enabled = true;
                Debug.Log("This works!");
                break;
            case "Teleporter_2":
                controller.enabled = false;
                transform.position = hit.transform.GetChild(0).position;
                controller.enabled = true;
                Debug.Log("This works!");
                break;
            case "WinPost":
                LevelManager.Instance.Win();
                break;
            default:
                break;
        }

2 个答案:

答案 0 :(得分:0)

我的猜测是,当您致电Awake时,组件未初始化。创建对象后,Awake将被调用为构造函数类方法。调用它时,您无法确定其他组件是否已初始化。

我建议您将Awake中的作业复制到Start,然后回来查看它是否有效。在GameObjects初始化组件后调用Start。

private void Awake()
{
    Instance = this;
}

// Use this for initialization
void Start ()
{
    scoreText.text = score.ToString();
    hitPointText.text = hitPoints.ToString();
}

答案 1 :(得分:0)

感谢大家尝试提供帮助和所有好建议。

最终我在尝试在新的空白场景中重新创建相同的UI时最终破坏了我的游戏,我确实设法在打破我的游戏之前重新创建相同的错误,然后让我没有更聪明。然而,由于我打破了我的游戏,我不得不退回至少两个教程并重新创建关卡管理器对象和空子spawnPosition对象,(关卡管理器脚本没问题,它只是关卡管理器对象及其子项我破了),无论如何必须再次重新创建这两个对象现在看起来一切都按预期工作了所以这让我得出的结论是问题不是代码而是对象本身???

再次感谢所有试图提供帮助的人,另一天又是另一种学习经历。

d