using DG.Tweening; using PrizeSystem; using System.Collections.Generic; using UnityEngine; namespace CharacterSystem { public class CharactersController : MonoBehaviour { public static CharactersController I; [SerializeField] private List characterPrefabs; private Character[] characters; public static int CharacterIndex { get; private set; } = -1; public static int CharactersAmount => I.characters.Length; public static Character CurrentCharacter => I.characters[CharacterIndex]; public static bool HasActiveCharacter => I != null && CharacterIndex >= 0 && CharacterIndex < I.characters.Length; public void Initialize() { I = this; SetupCharacters(); } public void SetAllCharactersPrizeAvailable() { foreach (Character character in I.characters) character.prizeModule.ResetModule(); } public static void ResetAllCharactersDifficulty() { foreach (Character character in I.characters) character.difficultyModule.ResetPresetIndex(); } public static void ResetSystem() { if (I == null) return; ResetAllCharactersDifficulty(); CharacterIndex = -1; } public void HideCharacter() { if (HasActiveCharacter == false) return; CurrentCharacter.visualModule.GetHideSequence().PlayForward(); } public void StartSession(System.Action onComplete = null) { ResetSystem(); ShowCharacter(0, onComplete); } public static Character[] GetCharactersArray() => new List(I.characters).ToArray(); private void SetupCharacters() { if (characterPrefabs.Count <= 0) throw new System.Exception("Не заданы боты в контроллере"); int amount = characterPrefabs.Count; characters = new Character[amount]; for (int i = 0; i < amount; i++) { var character = Instantiate(characterPrefabs[i]); characters[i] = character; character.Initialize(i); } RefreshPrizes(); } public void RefreshPrizes() { for (int i = 0; i < characters.Length; i++) { PrizeSet prizesSet = PrizeSystemManager.PrizeContainer.Sets[i]; characters[i].prizeModule.SetPrizes(prizesSet); } } public void ShowCharacter(int newIndex, System.Action onComplete = null) { if (newIndex < 0 || newIndex >= characters.Length) throw new System.ArgumentOutOfRangeException(nameof(newIndex)); int oldIndex = CharacterIndex; CharacterIndex = newIndex; if (newIndex == oldIndex) { onComplete?.Invoke(); return; } var newCharacter = characters[newIndex]; Sequence seq = DOTween.Sequence(); if (oldIndex >= 0) { var oldCharacter = characters[oldIndex]; seq.Append(oldCharacter.visualModule.GetHideSequence()); seq.AppendInterval(0.1f); } seq.Append(newCharacter.visualModule.GetShowSequence()); seq.AppendCallback(() => { if (oldIndex >= 0 && newIndex < oldIndex) EventBus.TriggerEvent(GameEvent.Return); else EventBus.TriggerEvent(GameEvent.Appear); onComplete?.Invoke(); }); seq.PlayForward(); } } }