Ищем способы реализации бонусов - PullRequest
1 голос
/ 24 сентября 2019

Я пытаюсь внедрить систему для бонусов в свою игру, но не знаю, как к ней подойти.До сих пор у меня есть средство запуска при включении питания, которое создает префаб при включении питания в случайном месте.Однажды подобранная, она уничтожает себя и порождает в другом месте.Один и тот же префаб используется для всех способностей, и на карте одновременно только один.

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
    }
}

Так что мне нужна помощь здесь.Как я должен структурировать свои бонусы?И как я могу назвать их случайно?Думая о том, чтобы, возможно, использовать для этого единствоИли, может быть, сохранить каждый powerup как префаб со своим собственным сценарием и поменять их местами (хотя это выглядит немного грязно).

Я немного растерялся, любые предложения / примеры приветствуются.:)

Ответы [ 2 ]

2 голосов
/ 24 сентября 2019

Вы можете перечислить 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 голос
/ 24 сентября 2019

Я думаю, что вы могли бы использовать ScriptAbleObjects для ваших бонусов.Это будет иметь ссылку на сборный дом, который он порождает.Чтобы рандомизировать его, я бы сохранил их в списке и вычислил случайный индекс для получения случайного включения.

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, содержащий все известные бонусы в игре.Вы можете запросить случайное включение у него, а затем использовать элемент Prefab объекта PowerUpObject, чтобы вызвать фактический Prefab.

Также я рекомендую это видео: https://www.youtube.com/watch?v=CLSiRf_OrBk

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...