我正在尝试为游戏加电时实现一个系统,但不确定如何实现。到目前为止,我有一个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类型创建一个预制件,并在确定实例化哪个实例之前调用随机生成。由您决定哪种解决方案对您而言最干净,最容易理解,它们都是完全有效的

09-25 21:43