繁体   English   中英

NullReferenceException:Object 引用未设置为 object Unity2D 的实例

[英]NullReferenceException: Object reference not set to an instance of an object Unity2D

我正在尝试使用 c# 在统一上制作一个拾取武器系统。 我正在尝试将一个值从一个脚本更改为另一个,但我遇到了一些问题。 我正在尝试将武器编号更改为 1。

using UnityEngine;

public class Pew : MonoBehaviour
{
public int weapon = 0;
}

所以,我正在使用这行代码

using UnityEngine;

public class PickUpBow : MonoBehaviour
{

    public void OnCollisionEnter2D(Collision2D collision)
    {
    GameObject thePlayer = GameObject.Find("ThePlayer");
    Pew pew = thePlayer.GetComponent<Pew>();
    pew.weapon = 1;
    }
}

但是当我触摸 object 时,它给了我以下错误:“对象引用未设置为 object Unity 的实例”,在以下行: Pew pew = thePlayer.GetComponent<Pew>();

谢谢!

我假设碰撞发生在玩家身上。

问题是因为 GameObject.Find("ThePlayer") 在层次结构中搜索任何以这种方式命名的游戏object 也许名称中有一些空格。 使用该方法不是一个好习惯,因为它可能会导致此类问题。

所以,而不是:

GameObject thePlayer = GameObject.Find("ThePlayer");
Pew pew = thePlayer.GetComponent<Pew>();

最好像:

GameObject thePlayer = collision.gameObject;
Pew pew = thePlayer.GetComponent<Pew>();

这个新代码的问题是我们假设碰撞发生在玩家身上,但如果是敌人怎么办?

一个好的解决方案是使用Tags ,现在:

if(collision.gameObject.CompareTag("Player") 
{
    GameObject thePlayer = collision.gameObject;
    Pew pew = thePlayer.GetComponent<Pew>();
}

这意味着播放null thePlayer

这意味着分配不起作用: GameObject thePlayer = GameObject.Find("ThePlayer");

确保这有效: GameObject.Find("ThePlayer");

文档: https://docs.unity3d.com/ScriptReference/GameObject.Find.html

此 function 仅返回活动游戏对象。 如果找不到具有名称的 GameObject,则返回 null。

确保名称正确匹配!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM