在Unity中避免与自我碰撞

时间:2017-03-29 03:13:58

标签: c# unity3d game-development

我使用以下方法在2d太空游戏中用大炮发射激光:

[Command]
private void CmdFire()
{
    GameObject laser = (GameObject)Instantiate(LaserPrefab, leftShot ? leftCannon.position : rightCannon.position, leftShot ? leftCannon.rotation * Quaternion.Euler(0, 0, 90) : rightCannon.rotation * Quaternion.Euler(0, 0, 90));
    Physics2D.IgnoreCollision(laser.GetComponent<Collider2D>(), transform.FindChild("PlayerShip").GetComponent<Collider2D>());
    Physics2D.IgnoreCollision(laser.GetComponent<Collider2D>(), transform.FindChild("PlayerShip").FindChild(leftShot?"LeftCannon":"RightCannon").GetComponent<Collider2D>());
    laser.GetComponent<SpriteRenderer>().sortingOrder = 0;
    laser.GetComponent<Rigidbody2D>().velocity = laser.transform.right * 10;
    NetworkServer.Spawn(laser);
    leftShot = !leftShot;
    Destroy(laser, 2f);
}

重要的一点是Physics2D.IgnoreCollision()部分,旨在阻止他们自己拍摄。这与主机上的预期完全一样(你可以拍摄其他船但不是你自己),但是激光器不断地在客户端机器上击中自己的船。

正如你在这里看到的那样:

Demo

这是我第一次尝试在Unity制作多人游戏,所以任何帮助都会受到赞赏。

3 个答案:

答案 0 :(得分:2)

或者,您可以在播放器中添加标签,例如&#34;播放器&#34;并检查OnCollisionEnter2D子弹是否与玩家发生碰撞:

void OnCollisionEnter2D (Collision2D coll) {
    // If the tag of the thing we collide with is "Player"...
    if (coll.gameObject.tag == "Player")
        Debug.Log("Player hit!");

    // Ignore the collision with the player.
    Physics2D.IgnoreCollision(player.collider, collider);
}

另一种方法是给玩家一个不同的子弹层,并忽略玩家和子弹层之间的碰撞:

Physics2D.IgnoreLayerCollision(PlayerLayer, BulletLayer, true);

或转到修改&gt;项目设置&gt;物理2D并选择哪些层在那里相互碰撞: Collision Matrix

您可能希望为播放器和项目符号添加自己的自定义图层。

答案 1 :(得分:0)

在激光的OnCollisionEnter2D中,检查gameObject是否是“你自己” 通过比较ID

If( collider.gameObject.GetInstanceID() != yourself.gameObject.GetInstanceID() )

答案 2 :(得分:0)

转到“编辑”>“项目设置”>“ Physics 2D”,然后选择其中哪些层相互碰撞:

enter image description here