【问题标题】:null reference exception in level manager script级别管理器脚本中的空引用异常
【发布时间】:2017-11-21 04:36:42
【问题描述】:

所以我基本上是 Unity 和 C# 的新手,并且一直在关注在线教程(N3K 2D Platformer、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

所以这里是我的播放器类中的一个 sn-p 代码,它在 LevelManager 脚本上使用实例,以便它可以访问 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;
        }

【问题讨论】:

  • 我猜你忘了在 Unity 编辑器中分配 scoreText 和/或 hitPointText 的变量(当你查看分配给这个脚本的游戏对象的属性时)跨度>
  • 另外,空 pointer 异常来自 Java,您面临的是空 reference 异常,
  • 是的,对不起,我来自 java 背景,所以有点弗洛伊德式的失误
  • 你是否在任何地方使用单例Instance

标签: c# unity3d


【解决方案1】:

我的猜测是当你调用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();
}

【讨论】:

  • 我看到你在那儿得到了什么,对象可能在它们被创建之前就被引用了,但不幸的是,即使在对象引用调用移位之后,它仍然给出空引用异常进入 Start(),当然同样的 2 行是有问题的代码。
  • 您在编辑器中运行游戏时是否确定这些组件仍分配给LevelManager
  • 是的,一旦游戏运行,这两个对象仍然分配给关卡管理器脚本,我已经更新了我的原始帖子,包括一些场景视图和游戏视图的 sn-ps游戏运行。可以看出,乐谱文本和命中点文本对象仍然分配给关卡管理器脚本。
  • 有趣的是,它实际上按照关卡管理器脚本改变了 UI 以反映分数和生命值,从而在游戏视图中看到它的意图。
  • 你刚刚写了我想写的东西......无论如何:你有没有试过通过设置断点或将这个场景中使用的所有变量转储到控制台来调试它?这可能比我在这里可以做的推测更有帮助。您现在可能想尝试一下,然后返回结果。
【解决方案2】:

感谢大家的帮助和所有伟大的建议。

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

再次感谢所有努力提供帮助的人,又是一天的另一个学习经历。

D.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-17
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多