寻找实现加电的方法

时间:2019-09-24 08:09:53

标签: c# unity3d

我正在尝试为游戏中的加电功能实现一个系统,但不确定如何实现。到目前为止,我有一个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。或者,可以将每个加电功能保存为带有其自己的脚本的预制件并交换它们(尽管感觉有些混乱)。

我在这里有点迷路,任何建议/示例都值得赞赏。 :)

2 个答案:

答案 0 :(得分:2)

您可以枚举powerUps

public enum PowerUp
{
    None, //default value
    SpeedBoost,
    JumpBoost,
    //etc
}    

然后创建对当前活动的PowerUp的引用

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类型创建一个预制件,并在确定实例化哪个实例之前调用随机生成。由您决定哪种解决方案看起来最干净,最容易理解,它们都是完全有效的

答案 1 :(得分:1)

我认为您可以将ScriptAbleObjects用于PowerUps。它会引用它产生的预制件。为了使其随机化,我将它们存储在一个列表中,并计算一个随机索引来检索随机加电。

public class PowerUpObject : ScriptAbleObject
{
    public GameObject Prefab;
} 

public class PowerUpManager : Monobehaviour
{
    public List<PowerUpObject> PowerUps;

    public PowerUp GetRandomPowerUp()
    {
        if(PowerUps != null && PowerUps.Count > 0)
        {
            int randomIdx = Random.Range(0, PowerUps.Count);
            return PowerUps[randomIdx];
        }

        // error case
        Debug.Log("No PowerUps in List");
        return null;
    }
}

这还不完整,但是应该为您提供所需的灵感。 您将拥有一个管理器GameObject来保存游戏中所有已知的powerUps。您可以从中请求随机加电,然后使用PowerUpObject的Prefab成员生成实际的Prefab。

我也推荐这个视频: https://www.youtube.com/watch?v=CLSiRf_OrBk