Вы упомянули поведение просто из-за функции «Сброс», когда у вас более двух усилений, другие отключают усиление и устанавливают скорость проигрывателя на ноль.
Есть разные подходы к этомупроблема, одно объявляет «усиление» поля статическим, так что оно будет общим свойством для всех бонусов, но у него будут свои побочные эффекты, такие как эффекты не будут складываться должным образом;
, так что у вас естьреализовать простую систему эффектов, чтобы игрок мог складывать эффекты бонусов, и ответственность за усиление будет заключаться только в доставке этих эффектов, а не в их активации / деактивации.
простая реализация может выглядеть так:
эффекты:
public interface IEffect
{
float Duration { get; set; }
void Do(Player p);
void Undo(Player p);
}
public class ActiveEffect
{
public IEffect Effect { get; private set; }
public float LeftTime;
public ActiveEffect(IEffect effect)
{
Effect = effect;
LeftTime = effect.Duration;
}
}
public class SpeedBoost : IEffect
{
public float Duration { get; set; }
public SpeedBoost()
{
Duration = 4;
}
public void Do(Player p)
{
p.speed = 40f;
}
public void Undo(Player p)
{
p.speed = 20f;
}
}
ваш менеджер эффектов:
public class EffectManager
{
Dictionary<Type, ActiveEffect> _activeEffects = new Dictionary<Type, ActiveEffect>();
public void AddEffect(IEffect effect)
{
var type = effect.GetType();
if (_activeEffects.ContainsKey(type))
{
//reseting effect duration to max
_activeEffects[type].LeftTime = effect.Duration;
}
else
{
var activeEffect = new ActiveEffect(effect);
_activeEffects.Add(type, activeEffect);
StartCoroutine(activeEffect);
}
}
private IEnumerator Apply(ActiveEffect effect)
{
effect.Effect.Do(player);
while (effect.LeftTime > 0)
{
yield return new WaitForEndOfFrame();
effect.LeftTime -= Time.deltaTime;
}
effect.Effect.Undo(player);
_activeEffects.Remove(effect.Effect.GetType());
}
}