嗨,我只是想把一个简单的飞鸟游戏转换成多人游戏。
所以在多人游戏中使用光子,我希望鸟与地面或管道相撞,而不是与敌人的鸟.i.e.,忽略敌人的鸟碰撞。我想出了办法,下面的代码。
因此,我用名为"BirdClass“的名称标记了这只鸟,在开始时,我第一次使用了以下代码来忽略coillision:
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函数如下所示:
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;
}
}
在这里,我得到了这样的错误:
"NullReferenceException: Object reference not set to an instance of an object
BirdPigeon.OnCollisionEnter2D (UnityEngine.Collision2D collision) (at Assets/Scripts/BirdPigeon.cs:81)"
我不明白,虽然我正在检查它是否为空,为什么我仍然会得到这些错误?
发布于 2022-01-18 04:27:02
似乎您的"playerBird“游戏对象没有Collider2D
类型的组件。确保其中一个2D对撞机是附加的。当您想通过GetComponent
找到它时,必须将它直接附加到对象上。当对撞机连接到"playerBird“的子对象时,使用GetComponentInChildren
代替。
还请记住,也有对撞机没有后缀"2D“。这些是3D物理引擎使用的3D对撞机。2D和3D对撞机是完全独立的系统,不相互作用。
发布于 2022-01-18 04:29:11
虽然这不是修复您的空指针,但它最终会有相同的结果。您正在尝试手动解决冲突异常。这对你来说很好,团结组织用一个简单的碰撞矩阵来传递这个信息。如果你使用的是二维物理,你需要使用2D版本。
发布于 2022-02-17 18:37:56
您的playerBird
不是null,但显然没有附加Collider2D
,因此调用如下:
playerBird.GetComponent<Collider2D>()
返回空
https://gamedev.stackexchange.com/questions/198923
复制