我目前正在创建一个乒乓游戏,当球击中其中一个乒乓球拍时,它会一分为二。我通过破坏受到碰撞的桨,并安装一个我预制的分裂桨来实现这一点。
我的问题是,每个预制件都有不同的标签,每次球碰到球拍时,它都应该去掉标签并做点什么。。。但在第一次拆分之后,一旦实例化了新的桨板,函数就不会启动。。。
我可以有几个这样的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;
}
}
}