chip-gameV3/Assets/Scripts/Characters/CharactersController.cs

144 lines
4.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using DG.Tweening;
using PrizeSystem;
using System.Collections.Generic;
using UnityEngine;
namespace CharacterSystem
{
public class CharactersController : MonoBehaviour
{
public static CharactersController I;
[SerializeField] private List<Character> 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 void ApplyFirstCharacterColorsToBoard()
{
VisualModule visualModule = characters[0].visualModule;
Board.Instance.SetColorsImmediately(
visualModule.InnerColor,
visualModule.OutlineColor,
visualModule.CellsColor);
}
public static Character[] GetCharactersArray()
=> new List<Character>(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;
}
VideoUtility.CrossFadeToCharacter(newIndex);
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();
}
}
}