using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class DualAvatarController : MonoBehaviour { const string APPEAR_TRIGGER = "Appear"; //не используется пока в анимацияхъ const string IDLE_TRIGGER = "Idle"; const string CHIPSPAWN_TRIGGER = "ChipSpawn"; const string WIN_TRIGGER = "Win"; const string LOSE_TRIGGER = "Lose"; const CellState PLAYER1 = CellState.Player1; const CellState PLAYER2 = CellState.Player2; [SerializeField] private List characterPrefabs; Dictionary avatars = new(); [SerializeField] Transform AvatarsParent; private AvatarEventBus bus; //Для левого аватара [SerializeField] private Vector2 baseHiddenLocalPosition; [SerializeField] private Vector2 baseShownLocalPosition; [SerializeField] private float CharacterMovementSpeed = 5000; public Avatar CurrentAvatar => avatars[GameManager.instance.currentPlayer]; public static DualAvatarController Instance; private bool spawned = false; public void Initialize() { Instance = this; if (!spawned) { avatars[PLAYER1] = CreateAvatar(characterPrefabs[0], AvatarsParent, PLAYER1); avatars[PLAYER2] = CreateAvatar(characterPrefabs[1], AvatarsParent, PLAYER2); spawned = true; } bus = AvatarEventBus.Instance; BindEvents(); } public void ShowCharacters() //заспвавнить и показать { if (characterPrefabs != null && characterPrefabs.Count < 2) Debug.LogError("Меньше 2 персонажей в списке аватаров."); //Тут возможно будет рандомизация персонажей StartCoroutine(MoveLocal(avatars[PLAYER1], GetShownPosition(PLAYER1), CharacterMovementSpeed, OnComplete: AvatarAppeared)); StartCoroutine(MoveLocal(avatars[PLAYER2], GetShownPosition(PLAYER2), CharacterMovementSpeed, OnComplete: AvatarAppeared)); } public void HideCharacters() { StopAllCoroutines(); StartCoroutine(MoveLocal(avatars[PLAYER1], GetHiddenPosition(PLAYER1), CharacterMovementSpeed, OnComplete: () => { })); StartCoroutine(MoveLocal(avatars[PLAYER2], GetHiddenPosition(PLAYER2), CharacterMovementSpeed, OnComplete: () => { })); } Avatar CreateAvatar(GameObject prefab, Transform parent, CellState team) { GameObject go = Instantiate(prefab, parent); Avatar avatar = go.GetComponent(); avatar.Initialize(team); Transform transform = go.transform; transform.localPosition = GetHiddenPosition(team); return avatar; } Vector2 GetHiddenPosition(CellState team) => team == PLAYER1 ? baseHiddenLocalPosition : new Vector2(-baseHiddenLocalPosition.x, baseHiddenLocalPosition.y); Vector2 GetShownPosition(CellState team) => team == PLAYER1 ? baseShownLocalPosition : new Vector2(-baseShownLocalPosition.x, baseShownLocalPosition.y); void AvatarAppeared()//тут будем проверять когда оба прибыли. { } //вынести события сюда из аватаров и прописать обработчики. #region ПРИВЯЗКИ К ШИНЕ public void BindEvents() { bus.OnAvatarsAppeared.AddListener(Appear); bus.OnTurnStart.AddListener(TurnStart); bus.OnTurnEnd.AddListener(TurnEnd); bus.OnEndRound.AddListener(EndRound); bus.OnDraw.AddListener(Draw); bus.OnNewRoundStarted.AddListener(NewRound); bus.OnEndGame.AddListener(EndGame); } public void UnbindEvents() { bus.OnAvatarsAppeared.RemoveListener(Appear); bus.OnTurnStart.RemoveListener(TurnStart); bus.OnTurnEnd.RemoveListener(TurnEnd); bus.OnEndRound.RemoveListener(EndRound); bus.OnDraw.RemoveListener(Draw); bus.OnNewRoundStarted.RemoveListener(NewRound); bus.OnEndGame.RemoveListener(EndGame); } #endregion #region ОБРАБОТЧИКИ private void Appear() { avatars[PLAYER1].Animator.SetTrigger(APPEAR_TRIGGER); } private void TurnStart(CellState player) { } private void TurnEnd(CellState player) { avatars[player].Animator.SetTrigger(CHIPSPAWN_TRIGGER); } private void EndRound(CellState winner) { //Обозначние для ничьей if (winner == CellState.Empty) { Draw(); return; } CellState loser = winner == CellState.Player1 ? CellState.Player2 : CellState.Player1; avatars[winner].Animator.SetTrigger(WIN_TRIGGER); avatars[loser].Animator.SetTrigger(LOSE_TRIGGER); } private void Draw() { Debug.Log("DRAW"); } private void NewRound(CellState lastRoundWinner) { //Debug.Log("NEW ROUND LAST WINNER " + lastRoundWinner); } private void EndGame(CellState gameWinner) { //Debug.Log("ENDGAME"); } #endregion #region ХЕЛПЕРЫ private IEnumerator MoveLocal(Avatar avatar, Vector3 targetLocalPos, float speed, Action OnComplete) { Transform t = avatar.transform; while (t.localPosition != targetLocalPos) { t.localPosition = Vector3.MoveTowards(t.localPosition, targetLocalPos, speed * Time.deltaTime); yield return null; } OnComplete?.Invoke(); } #endregion }