Инкапсулированы методы появления и ухода персонажа Инкапсулирована работа с аниматором Работа с репликами вынесена в ScriptableObject Логика MessageBox вынесена в отдельный класс Переработан event bus персонажей Сложность и призовой модуль вынесены в отдельные классы Character.cs приведён к Single Responsibility Principle.
110 lines
3.5 KiB
C#
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();
|
|
}
|
|
}
|
|
} |