【问题标题】:Object reference not set to an instance of an object - What object isn't being referenced?对象引用未设置为对象的实例 - 未引用什么对象?
【发布时间】:2019-03-20 13:13:46
【问题描述】:

我正在尝试制作一个脚本,让玩家在通电时获得更强的攻击力。它对我所做的健康增加效果很好,但我似乎无法确定我在这方面做错了什么。在过去的几天里,我一直在这样做,但我没有得到任何地方。给出错误的行已被注释,但很难看到。这是倒数第二行代码:

power.damagePerShot = power.damagePerShot + DamageBoost;

我认为我掌握了错误的性质,但我不明白为什么我会收到它。如果 power.damagePerShot 取自 PlayerShooting 然后它被引用到正确的脚本,我不明白空引用来自哪里。

The conponent is referenced...

The script being referenced is attached to the object...

using UnityEngine;


public class ShootPowerUp : MonoBehaviour
{
    public GameObject pickupEffect;
    public PlayerShooting playerShooting;
    public int DamageBoost = 100;

    private void Update()
    {
        transform.Rotate(new Vector3(15, 30, 45) * Time.deltaTime);
    }

    void OnTriggerEnter(Collider other)
    {

        if (other.CompareTag("Player"))
        {
            ShootPowerPickup(other);
        }
    }

    void ShootPowerPickup(Collider player)
    {
        Instantiate(pickupEffect, transform.position, transform.rotation);

        PlayerShooting power = player.GetComponent<PlayerShooting>();
        power.damagePerShot = power.damagePerShot + DamageBoost; //This line is giving the error.
        Destroy(gameObject);
    }
}

【问题讨论】:

  • 请稍候@sujith karivelli 这个重复引用的方式被过度引用了,在这种情况下根本没有回答这个问题......仅仅因为OP提到了NullReferenceException并不意味着他没有'不知道它是什么..他想知道在他的情况下它来自哪里以及如何解决它!
  • @derHugo 我不会说它被过度引用,但在这种情况下它不是正确的副本。我已经投票决定在此基础上重新开放(并基于您提供的答案)。
  • @John 谢谢。我过度引用的意思是,我看到很多 Unity 特定问题在某处提到 NullReferenceException Bering 被标记为重复,尽管在许多情况下这并不能帮助他们以任何方式解决他们的问题。我只是想公平对待新用户并真正解决他们的问题。如果有一个更好的问题有一个足够的答案,至少指向正确的方向,而不是一个有效的重复,那就去吧:)
  • @John:如果他理解什么是 null 引用意味着他必须知道 Unity 为什么返回 null 的答案,不是吗?
  • @sujithkarivelil 不,没有必要.. 他知道,显然他的参考在尝试访问它时具有价值null,但 why 并没有由此解释(参见他的评论我的回答)

标签: c# unity3d nullreferenceexception


【解决方案1】:

组件PlayerShooting 未附加到Player 游戏对象,而是其子对象之一

改为使用GetComponentInChildrenlike

PlayerShooting power = player.GetComponentInChildren<PlayerShooting>();

你应该没事的。

【讨论】:

  • 天哪,谢谢!我不知道 GetComponentInChildren 存在。我的印象是没有区别。
  • 不客气!请注意,还有player.GetComponentInChildren&lt;PlayerShooting&gt;(true); 是在您的组件或游戏对象可能随时被禁用的情况下查找您的组件所必需的。
  • 如果这解决了您的问题,请随时接受答案;)
最近更新 更多