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(); 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"); EventBus.OnGameEvent += OnGameEvent; Sequence seq = DOTween.Sequence(); seq.Append(transform.DOMove(VisiblePos, showDuration).SetEase(showEase)); return seq; } public Sequence GetHideSequence() { EventBus.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"); } private void Message(GameEvent replicaType, bool force, bool showName = false) { if (replicas.WillPlay(replicaType) == false) return; Replica replicaToPlay = replicas.GetNextReplica(replicaType); _messageBox.PlayReplica(replicaToPlay, force).Forget(); } public void InvokeThrowChip() => SoundManager.instance.playClip(chipThrowClip); public void ResetModule() { transform.position = HiddenPos; _animator.SetTrigger("PreAppear"); _animator.enabled = false; _audioSource.Stop(); _messageBox.Stop(); } } }