177 lines
5.6 KiB
C#
Raw Permalink 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 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<GameObject> characterPrefabs;
Dictionary<CellState, Avatar> 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>();
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
}