178 lines
5.5 KiB
C#
178 lines
5.5 KiB
C#
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 Team PLAYER1 = Team.Player1;
|
||
const Team PLAYER2 = Team.Player2;
|
||
|
||
|
||
[SerializeField] private List<GameObject> characterPrefabs;
|
||
Dictionary<Team, 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()
|
||
{
|
||
return;
|
||
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, Team 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(Team team)
|
||
=> team == PLAYER1 ? baseHiddenLocalPosition : new Vector2(-baseHiddenLocalPosition.x, baseHiddenLocalPosition.y);
|
||
Vector2 GetShownPosition(Team 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(Team player) { }
|
||
private void TurnEnd(Team player)
|
||
{
|
||
avatars[player].Animator.SetTrigger(CHIPSPAWN_TRIGGER);
|
||
}
|
||
private void EndRound(Team winner)
|
||
{
|
||
//Обозначние для ничьей
|
||
if (winner == Team.None)
|
||
{
|
||
Draw();
|
||
return;
|
||
}
|
||
|
||
Team loser = winner == Team.Player1 ? Team.Player2 : Team.Player1;
|
||
avatars[winner].Animator.SetTrigger(WIN_TRIGGER);
|
||
avatars[loser].Animator.SetTrigger(LOSE_TRIGGER);
|
||
}
|
||
private void Draw()
|
||
{
|
||
Debug.Log("DRAW");
|
||
}
|
||
private void NewRound(Team lastRoundWinner)
|
||
{
|
||
//Debug.Log("NEW ROUND LAST WINNER " + lastRoundWinner);
|
||
}
|
||
private void EndGame(Team 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
|
||
}
|