首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我要获得Null引用异常,尽管我要检查对象是否为null来执行某项

为什么我要获得Null引用异常,尽管我要检查对象是否为null来执行某项
EN

Game Development用户
提问于 2022-01-18 09:07:59
回答 3查看 822关注 0票数 0

嗨,我只是想把一个简单的飞鸟游戏转换成多人游戏。

所以在多人游戏中使用光子,我希望鸟与地面或管道相撞,而不是与敌人的鸟.i.e.,忽略敌人的鸟碰撞。我想出了办法,下面的代码。

因此,我用名为"BirdClass“的名称标记了这只鸟,在开始时,我第一次使用了以下代码来忽略coillision:

代码语言:javascript
运行
复制
void Start()
    {
       PV = GetComponent<PhotonView>();
        playerBird = GameObject.FindGameObjectWithTag("BirdClass");
        if (playerBird != null)
            Physics2D.IgnoreCollision(playerBird.GetComponent<Collider2D>(), GetComponent<Collider2D>());

    }

在这里,我得到以下错误:

ArgumentNullException:值不能为空。参数名称: collider1 UnityEngine.Physics2D.IgnoreCollision (UnityEngine.Collider2D collider1,UnityEngine.Collider2D collider2) (at <4e5075cf57c3416eb788a8bd41817a84>:0) BirdPigeon.Start () (at资产/脚本/BirdPigeon.cs:45)

onCollider2d函数如下所示:

代码语言:javascript
运行
复制
private void OnCollisionEnter2D(Collision2D collision)
    {
        playerBird = GameObject.FindGameObjectWithTag("BirdClass");
        if (isMultiPlayerGame && playerBird != null && PV.IsMine)
        {           
           if (collision.gameObject.tag == playerBird.gameObject.tag)
            {
                Physics2D.IgnoreCollision(collision.gameObject.GetComponent<Collider2D>(), GetComponent<Collider2D>());
            }
            else
            {
                BirdCollided?.Invoke(true);             
            }
        }
        if (!isMultiPlayerGame)
        {
            BirdCollided?.Invoke(true);
            rigidBodyOfBird.velocity = Vector2.zero;
        }
    }

在这里,我得到了这样的错误:

代码语言:javascript
运行
复制
"NullReferenceException: Object reference not set to an instance of an object
BirdPigeon.OnCollisionEnter2D (UnityEngine.Collision2D collision) (at Assets/Scripts/BirdPigeon.cs:81)"

我不明白,虽然我正在检查它是否为空,为什么我仍然会得到这些错误?

EN

回答 3

Game Development用户

发布于 2022-01-18 12:27:02

似乎您的"playerBird“游戏对象没有Collider2D类型的组件。确保其中一个2D对撞机是附加的。当您想通过GetComponent找到它时,必须将它直接附加到对象上。当对撞机连接到"playerBird“的子对象时,使用GetComponentInChildren代替。

还请记住,也有对撞机没有后缀"2D“。这些是3D物理引擎使用的3D对撞机。2D和3D对撞机是完全独立的系统,不相互作用。

票数 1
EN

Game Development用户

发布于 2022-01-18 12:29:11

虽然这不是修复您的空指针,但它最终会有相同的结果。您正在尝试手动解决冲突异常。这对你来说很好,团结组织用一个简单的碰撞矩阵来传递这个信息。如果你使用的是二维物理,你需要使用2D版本。

https://docs.unity3d.com/Manual/LayerBasedCollision.html

票数 0
EN

Game Development用户

发布于 2022-02-18 02:37:56

您的playerBird不是null,但显然没有附加Collider2D,因此调用如下:

playerBird.GetComponent<Collider2D>()返回空

票数 0
EN
页面原文内容由Game Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://gamedev.stackexchange.com/questions/198923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档