chip-gameV3/Assets/Scripts/Gameplay/Avatars/DualAvatarController.cs

178 lines
5.5 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 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
}