sega 116b9b3116 Рефакторинг Character.cs: приведение к SRP и вынос логики
Инкапсулированы методы появления и ухода персонажа
Инкапсулирована работа с аниматором
Работа с репликами вынесена в ScriptableObject
Логика MessageBox вынесена в отдельный класс
Переработан event bus персонажей
Сложность и призовой модуль вынесены в отдельные классы
Character.cs приведён к Single Responsibility Principle.
2026-08-13 16:19:56 +03:00

110 lines
3.5 KiB
C#

using UnityEngine;
using Cysharp.Threading.Tasks;
using DG.Tweening;
namespace CharacterSystem
{
public class VisualModule : MonoBehaviour
{
public Sprite icon;
public Sprite iconSmall;
public Sprite chipImage;
[SerializeField] private MessageBox _messageBox;
[SerializeField] private ReplicasContainer replicas;
[SerializeField] private AudioSource _audioSource;
[SerializeField] private Animator _animator;
public AnimationClip chipSpawningAnim;
public AudioClip chipThrowClip;
[Header("Анимация появление/убирание")]
[SerializeField] private float showDuration = 1;
[SerializeField] private float hideDuration = 1;
[SerializeField] private Ease showEase = Ease.Linear;
[SerializeField] private Ease hideEase = Ease.Linear;
[SerializeField] private Vector2 HiddenPos;
[SerializeField] private Vector2 VisiblePos;
public void Initialize(string name)
{
SettingsManager.OnSettingsChanged += PullSettings;
_audioSource = GetComponent<AudioSource>();
PullSettings();
replicas.Initialize();
transform.position = HiddenPos;
_animator.SetTrigger("PreAppear");
_animator.enabled = false;
_messageBox.Initialize(name);
}
private void PullSettings()
{
_audioSource.volume = SettingsManager.GetFloat(SettingKey.SOUNDS_VOLUME);
}
public Sequence GetShowSequence()
{
_animator.enabled = true;
_animator.SetTrigger("PreAppear");
CharacterEventBus.OnGameEvent += OnGameEvent;
Sequence seq = DOTween.Sequence();
seq.Append(transform.DOMove(VisiblePos, showDuration).SetEase(showEase));
return seq;
}
public Sequence GetHideSequence()
{
CharacterEventBus.OnGameEvent -= OnGameEvent;
Sequence seq = DOTween.Sequence();
seq.Append(transform.DOMove(HiddenPos, hideDuration).SetEase(hideEase));
seq.AppendCallback(() =>
{
_animator.SetTrigger("PreAppear");
_animator.enabled = false;
});
return seq;
}
public void OnGameEvent(GameEvent gameEvent)
{
bool forceMessage = ReplicasContainer.ShouldForceMessage[gameEvent];
bool shouldShowName = gameEvent == GameEvent.Appear;
Message(gameEvent, force: forceMessage, showName: shouldShowName);
if (gameEvent == GameEvent.Appear)
_animator.SetTrigger("Appear");
if (gameEvent == GameEvent.PlayerWin)
_animator.SetTrigger("Lose");
}
bool Message(GameEvent replicaType, bool force, bool showName = false)
{
if (replicas.WillPlay(replicaType) == false)
return false;
Replica replicaToPlay = replicas.GetNextReplica(replicaType);
_messageBox.PlayReplica(replicaToPlay, force).Forget();
return true;
}
public void InvokeThrowChip()
=> SoundManager.instance.playClip(chipThrowClip);
public void ResetModule()
{
transform.position = HiddenPos;
_animator.SetTrigger("PreAppear");
_animator.enabled = false;
_audioSource.Stop();
_messageBox.Stop();
}
}
}