Написал систему бонусов для ранера в Unity. Насколько правильно я это сделал?
Я новичок в unity и мне нужен совет правильно ли я делаю, и если нет то интересно что не так и как будет лучше с точки зрения архитектуры кода. Код работает.
Абстрактный класс самого бонуса
public abstract class BonusPlayer : MonoBehaviour
{
[SerializeField] private float _duration;
[SerializeField] private Sprite _icon;
[SerializeField] private AudioClip _soundEffect;
[SerializeField] private ParticleSystem _specialEffect;
protected Player Player;
private AudioSource _audioSource;
protected float Duration { get => _duration; set => _duration = value; }
protected Sprite Icon { get => _icon; set => _icon = value; }
private void Start()
{
_audioSource = GetComponent<AudioSource>();
}
private void OnTriggerEnter(Collider other)
{
if (other.TryGetComponent(out Player player))
{
Player = player;
StartBonus();
}
}
public virtual void StartBonus()
{
if (_specialEffect != null)
{
Instantiate(_specialEffect, transform.position, transform.rotation, transform);
}
if (_soundEffect != null)
{
_audioSource.clip = _soundEffect;
_audioSource.Play();
}
StartCoroutine(TimeBonusAction());
}
public IEnumerator TimeBonusAction()
{
yield return new WaitForSeconds(_duration);
StopBonus();
}
public virtual void StopBonus()
{
StopCoroutine(SoundTimer());
gameObject.SetActive(false);
}
Код уже конкретного бонуса для увеличения количества очков
public class BonusScore : BonusPlayer
{
[SerializeField] private int _bonusScore;
public override void StartBonus()
{
base.StartBonus();
Player.ShowBonusUi(Icon, Duration);
Player.BonusScore(_bonusScore);
}
public override void StopBonus()
{
base.StopBonus();
Player.BonusScoreEnd();
}
}
И код отображения иконки подобранного бонуса на экране
public class BonusUI : MonoBehaviour
{
[SerializeField] private CanvasGroup _canvasGroup;
[SerializeField] private Text _textDuration;
[SerializeField] private Image _iconBonus;
[SerializeField] private Player Player;
private float _duration;
private void Update()
{
_textDuration.text = _duration.ToString("0");
_duration -= Time.deltaTime;
if (_duration < 0)
{
_canvasGroup.alpha = 0;
}
}
private void OnEnable()
{
Player.ShowBonusIcon += ShowBonus;
}
private void OnDisable()
{
Player.ShowBonusIcon -= ShowBonus;
}
public void ShowBonus(Sprite icon, float duration)
{
_canvasGroup.alpha = 1;
_duration = duration;
_iconBonus.sprite = icon;
} }
Скрипт отображения иконки подобранного бонуса на экран, вызывается через событие в скрипте Player больше всего интересует правильно ли у меня это реализовано. Или лучше делать вывод на экран не касаясь скрипта игрока?
код класса Player
public void ShowBonusUi(Sprite icon, float duration)
{
ShowBonusIcon?.Invoke(icon, duration);
}
public void BonusScore(int bonus)
{
_scoreMultiplae = bonus;
}
public void BonusScoreEnd()
{
_scoreMultiplae = 3;
}