Как сделать комботаймер в Unity - PullRequest
0 голосов
/ 09 июля 2020

Я сейчас делаю игру, и я застрял, когда думал о комботаймере.

Теперь в моей игре есть враги, которые проходят через моего персонажа, и я бью их. Тем не менее, в какой-то момент, если я смогу правильно поразить врагов, я хочу добавить мощную опцию комбо, например, поразить их без каких-либо трудностей. Я подумал, что могу создать класс или значение, которое сохраняет правильные совпадения, и скажем, что оно 5. Когда оно достигнет 5, я могу изменить параметры совпадений. Тем не менее, я застрял в том, как я могу определить, через сколько ударов или секунд комбо может закончиться. И тут мне пришло в голову, что со временем я справлюсь. Так вот в чем дело. Я хочу обнаружить 5 попаданий, а затем мне нужен комбинированный таймер, который уменьшает значение 5. Так что, когда значение достигнет 0, я могу продолжать играть в свою игру с обычными стандартами. Как я могу это сделать?

Ответы [ 2 ]

2 голосов
/ 09 июля 2020

Поскольку вы ничего не предоставили, я бы сделал это как фиктивный код. Это делает

  • Каждый раз, когда вы поражаете врага, проверяйте время с момента последнего удара
  • Если меньше максимальной задержки => добавить к комбо
  • Если не сбрасываете счетчик комбо и начните сначала
  • При достижении достаточного количества хитов => включить isSuperCombo
  • Со временем сбросить isSuperCombo
  • Пока вы isSuperCombo, вы все равно можете добавить попадания, даже если они происходят после обычного maxTimeBetweenHits, чтобы увеличить продолжительность isSuperCombo в качестве небольшого бонуса

Что-то вроде

public class ComboCounter : MonoBehaviour
{
    public bool isSuperCombo;
     
    // Maimum delay in seconds since the hit for counting the current hit as combo
    [SerializeField] private float maxTimeBetweenHits = 1;
    // Requried hits in one combo in order to activate power bonus
    [SerializeField] private int hitsUntilSuperCombo = 5;
    // Delay in seconds to reset the powerup after the last hit
    [SerializeField] private float powerUpDuration = 5;

    private int hitCounter;
    private float lastHitTime;
    private float powerUpResetTimer;

    private void Update()
    {
        if(isSuperCombo)
        {
            powerUpResetTimer -= Time.deltaTime;
            if(powerUpResetTimer <= 0)
            {
                isSuperCombo = false;
                hitCounter = 0;
            }
        }
    }

    // Call when you hit an enemy
    public void AddHit()
    {
        if(Time.time - lastHitTime < maxTimeBetweenHits)
        {
            // then add to the hit counter
            hitCounter++;

            if(hitCounter >= hitsUntilSuperCombo)
            {
                isSuperCombo = true;
                powerUpResetTimer = powerUpDuration;
            }
        }
        else
        {
            // otherwise the delay was too big => not a combo anymore
            // => Reset the counter and start over with this hit as the first one
            hitCounter = 1;
        }
        
        // update the lastHitTime
        lastHitTime = Time.time;
    }
}

Тогда вы можете, например, в другом классе проверьте что-нибудь вроде

public void CauseDamage(Enemy enemy)
{
    enemy.health -= GetComponent<ComboCounter>().isSuperCombo ? 4 : 1;
}
0 голосов
/ 09 июля 2020

Если вам нужно отметить 5 секунд увеличения урона, вы можете использовать сопрограмму

private float _damage = 10;

public void StartCombo(float duration = 5)
{
    StartCoroutine(ComboHandler(duration));
}

private IEnumerator ComboHandler(float duration)
{
    _damage *= 2; //_damage = _damage * 2;
    yield return new WaitForSeconds(duration); //wait necessary amount of real time
    _damage /= 2; //_damage = _damage / 2;
}

Если вам нужно нанести только 5 ударов с увеличенным уроном, вы можете использовать что-то

private float _damage = 10;
private int _increasedBlows = 0; //amount of blows with increased damage
private float _increasingCoeff = 2; //ratio of damage increase of blow

//add new increased blows after doing combo
public void AddIncreasedBlows(int amount)
{
    _increasedBlows += amount;
}

//return blow damage
public float GetHitDamage()
{
    if (_increasedBlows > 0)
    {
        _increasedBlows--;
        return _damage * -_increasingCoeff; //return increased damage
    }
    else
    {
        return _damage; //return usual damage
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...