我可以在一个OnCollisionEnter2D函数中使用一系列if/else-if语句吗



我目前正在创建一个乒乓游戏,当球击中其中一个乒乓球拍时,它会一分为二。我通过破坏受到碰撞的桨,并安装一个我预制的分裂桨来实现这一点。

我的问题是,每个预制件都有不同的标签,每次球碰到球拍时,它都应该去掉标签并做点什么。。。但在第一次拆分之后,一旦实例化了新的桨板,函数就不会启动。。。

我可以有几个这样的if/else-if语句吗?我错过了什么?

这是我的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PaddleSplit_Script : MonoBehaviour
{
public GameObject split_paddle1;
public GameObject split_paddle2;
public GameObject split_paddle3;
public GameObject split_opponent_paddle1;
public GameObject split_opponent_paddle2;
public GameObject split_opponent_paddle3;
//public override void Apply(GameObject target)
//{
//    void 
//    if (target.gameObject.CompareTag("Player 1"))
//    {
//        //Instantiate()
//    }
//}
private void OnCollisionEnter2D(Collision2D collision)
{
// Pre-State
if (collision.gameObject.CompareTag("Player 1"))
{
Debug.Log("Player Split");
Destroy(collision.gameObject);
Instantiate(split_paddle1);
//Destroy(gameObject);
}
else if (collision.gameObject.CompareTag("Player 2"))
{
Debug.Log("Opponent Split");
Destroy(collision.gameObject);
Instantiate(split_opponent_paddle1);
//Destroy(gameObject);
}
// Primary State
else if (collision.gameObject.CompareTag("Player 1_1"))
{
Debug.Log("Player split again");
Destroy(collision.gameObject);
Instantiate(split_paddle2);
}
else if (collision.gameObject.CompareTag("Player 2_1"))
{
Debug.Log("Opponent split again");
Destroy(collision.gameObject);
Instantiate(split_opponent_paddle2);
}

// Secondary State
// else if (collision.gameObject.CompareTag("Player 1_2"))
// {
//     Destroy(collision.gameObject);
//     Instantiate(split_paddle3);
// }
// else if (collision.gameObject.CompareTag("Player 2_2"))
// {
//     Destroy(collision.gameObject);
//     Instantiate(split_opponent_paddle3);
// }
}
}

正如你所注意到的,我把它们分解成了状态(状态前是划桨未拆分(。

我试图实现的是,一旦球碰到球拍,它应该根据它碰到的标签来检测碰撞。。。。

我可以有几个这样的if/else-if语句吗?

当然可以!CCD_ 1(在这方面(与任何其它方法一样是CCD_ 2方法。

应该吗这是另一个问题。

不幸的是,标签系统在那里非常有限,并且不能真正动态扩展。此外,您可能会错过正确标记和引用对象的机会。

在这种情况下,我宁愿使用像这样的简单组件,而不是使用tags

public enum Side
{
Player,
Opponent
}
public class Paddle : Monobehaviour
{
public int splitLevel;
public Side side;
}

并进行例如

public Paddle[] paddlesPrefabs;
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.TryGetComponent<Paddle>(out var paddle))
{
var currentSplitLevel = paddle.splitLevel;
var side = paddle.Side;
var newSplitLevel = currentSplitLevel + 1;
if(newSplitLevel >= paddlesPrefabs.Length)
{
// GameOverAndLoserIs(side);
}
else
{
var newPrefab = paddlesPrefabs[newSplitLevel];
var newPaddle = Instantiate(newPrefab);
newPaddle.splitLevel = newSplitLevel;
newPaddle.side = side;
}
}
}

相关内容

  • 没有找到相关文章

最新更新