我正在尝试为游戏加电时实现一个系统,但不确定如何实现。到目前为止,我有一个powerup生成器,它可以在随机位置上实例化powerup预制件。一旦被拾取,它就会自我毁灭并在另一个位置产生。所有电源都使用相同的预制件,一次只在地图上显示一个。
spawnLocations = GameObject.FindGameObjectsWithTag("spawnLocation");
Instantiate(powerup, spawnLocations[spawnRandom].transform.position, transform.rotation);
至于加电,取下时应将其移除(如果玩家拥有)当前的力量,并用新随机选择的力量来代替。 (无需计时器)。
我做了几个简单的通电:
public void SpeeedBoost(float speedMultiplied) {
var playerController = gameObject.GetComponent<PlayerController>();
playerController.speed = playerController.speed * speedMultiplied;
}
public void JumpBoost(float jumpPower) {
var playerJump = gameObject.GetComponent<PlayerJump>();
playerJump.jumpSpeed = playerJump.jumpSpeed * jumpPower;
}
+也许换了武器等等。
他们应该这样称呼:
private void OnTriggerEnter2D(Collider2D collision) {
if (collision.gameObject.tag == "powerup") {
// Remove current powerup and call a new random one
}
}
所以我需要一些帮助。我应该如何构造我的能量提升?而且我怎么称呼他们呢?考虑为此可能使用unityEvent。或者,可以将每个加电功能保存为带有其自己的脚本的预制件并交换它们(尽管感觉有些混乱)。
我在这里有点迷路,任何建议/示例都值得赞赏。 :)
最佳答案
您可以枚举powerUps
public enum PowerUp
{
None, //default value
SpeedBoost,
JumpBoost,
//etc
}
然后创建对当前活动上电的引用
private PowerUp currentPowerUp;
这样一来,我们可以在分配新值之前取消其效果
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.tag == "powerup")
{
switch (currentPowerUp)
{
case PowerUp.JumpBoost:
RemoveJumpBoost();
break;
case PowerUp.SpeedBoost:
RemoveSpeedBoost();
break;
}
do
{
//I set the minimum value to 1 to skip "None"
var nextPowerUp = (PowerUp)UnityEngine.Random.Range(1, System.Enum.GetValues(typeof(PowerUp)).Length);
}
while (nextPowerUp == currentPowerUp);
switch (nextPowerUp)
{
case PowerUp.JumpBoost:
AddJumpBoost();
break;
case PowerUp.SpeedBoost:
AddSpeedBoost();
break;
}
currentPowerUp = nextPowerUp;
}
}
或者,您也可以将脚本添加到powerUp预制中,在其中指定上述powerUp枚举值,甚至在OnDestroy事件上声明该做什么。或者,您可以为每种powerUp类型创建一个预制件,并在确定实例化哪个实例之前调用随机生成。由您决定哪种解决方案对您而言最干净,最容易理解,它们都是完全有效的