You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
HighGroundRoyaleNetcode/Assets/Scripts/Gameplay/UI/UICharSelectPlayerSeat.cs

387 lines
14 KiB
C#

using System;
using System.Collections.Generic;
using Unity.BossRoom.Gameplay.GameplayObjects.Character;
using Unity.BossRoom.Gameplay.GameState;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
namespace Unity.BossRoom.Gameplay.UI
{
public class UICharSelectPlayerSeat : MonoBehaviour
{
[SerializeField]
private GameObject m_InactiveStateVisuals;
[SerializeField]
private GameObject m_ActiveStateVisuals;
[SerializeField]
private Transform m_PlayerNumberHolderParent; // Parent for player images
[SerializeField]
private Transform m_PlayerNameHolderParent; // Parent for player names
[SerializeField]
private GameObject m_PlayerNumberTemplate; // Prefab template for player images
[SerializeField]
private GameObject m_PlayerNameTemplate; // Prefab template for player names
[SerializeField]
private Image m_Glow;
[SerializeField]
private Image m_Checkbox;
[SerializeField]
private Button m_Button;
[SerializeField]
private Animator m_Animator;
[SerializeField]
private string m_AnimatorTriggerWhenLockedIn = "LockedIn";
[SerializeField]
private string m_AnimatorTriggerWhenUnlocked = "Unlocked";
[SerializeField]
private CharacterTypeEnum m_CharacterClass;
private int m_SeatIndex;
private List<int> m_PlayerNumbers = new List<int>();
private List<string> m_PlayerNames = new List<string>();
private NetworkCharSelection.SeatState m_State;
private bool m_IsDisabled;
public static event Action<int, int> OnPlayerSwitchedProfile; // Event for player switching
public void Initialize(int seatIndex)
{
m_SeatIndex = seatIndex;
m_State = NetworkCharSelection.SeatState.Inactive;
m_PlayerNumbers.Clear();
m_PlayerNames.Clear();
ConfigureStateGraphics();
}
public bool IsLocked()
{
return m_State == NetworkCharSelection.SeatState.LockedIn && m_PlayerNumbers.Count > 0;
}
/// <summary>
/// Sets the state of the seat and updates the UI for the selected players.
/// </summary>
public void SetState(NetworkCharSelection.SeatState state, int playerNumber, string playerName)
{
if (state == NetworkCharSelection.SeatState.Inactive)
{
RemovePlayer(playerNumber);
}
else
{
OnPlayerSwitchedProfile?.Invoke(playerNumber, m_SeatIndex); // Notify other seats
AddPlayer(playerNumber, playerName);
}
m_State = state;
ConfigureStateGraphics();
}
/// <summary>
/// Adds a player's number and name to the seat.
/// </summary>
public void AddPlayer(int playerNumber, string playerName)
{
if (!m_PlayerNumbers.Contains(playerNumber))
{
m_PlayerNumbers.Add(playerNumber);
m_PlayerNames.Add(playerName);
}
ConfigureStateGraphics();
}
/// <summary>
/// Removes a player's number and name from the seat.
/// </summary>
public void RemovePlayer(int playerNumber)
{
int index = m_PlayerNumbers.IndexOf(playerNumber);
if (index >= 0)
{
m_PlayerNumbers.RemoveAt(index);
m_PlayerNames.RemoveAt(index);
}
ConfigureStateGraphics();
}
private void ConfigureStateGraphics()
{
// Clear existing player images and names.
foreach (Transform child in m_PlayerNumberHolderParent)
{
Destroy(child.gameObject);
}
foreach (Transform child in m_PlayerNameHolderParent)
{
Destroy(child.gameObject);
}
if (m_State == NetworkCharSelection.SeatState.Inactive || m_PlayerNumbers.Count == 0)
{
m_InactiveStateVisuals.SetActive(true);
m_ActiveStateVisuals.SetActive(false);
m_Glow.gameObject.SetActive(false);
m_Checkbox.gameObject.SetActive(false);
return;
}
m_InactiveStateVisuals.SetActive(false);
m_ActiveStateVisuals.SetActive(true);
float playerNumberYPosition = 0f; // Starting Y-position for player images.
float playerNameYPosition = 0f; // Starting Y-position for player names.
for (int i = 0; i < m_PlayerNumbers.Count; i++)
{
// Instantiate and position player number (image).
var playerImageObj = Instantiate(m_PlayerNumberTemplate, m_PlayerNumberHolderParent);
var playerImage = playerImageObj.GetComponent<Image>();
playerImage.sprite = ClientCharSelectState.Instance.m_IdentifiersForEachPlayerNumber[m_PlayerNumbers[i]].Indicator;
// Set position of player image with Y-offset of +60 units.
RectTransform imageRect = playerImageObj.GetComponent<RectTransform>();
imageRect.anchoredPosition = new Vector2(imageRect.anchoredPosition.x, playerNumberYPosition);
playerNumberYPosition += 60f; // Move upward by 60 units for the next image.
// Instantiate and position player name (text).
var playerNameObj = Instantiate(m_PlayerNameTemplate, m_PlayerNameHolderParent);
var playerNameText = playerNameObj.GetComponent<TextMeshProUGUI>();
playerNameText.text = m_PlayerNames[i];
playerNameText.color = ClientCharSelectState.Instance.m_IdentifiersForEachPlayerNumber[m_PlayerNumbers[i]].Color;
// Set position of player name with Y-offset of -20 units.
RectTransform nameRect = playerNameObj.GetComponent<RectTransform>();
nameRect.anchoredPosition = new Vector2(nameRect.anchoredPosition.x, playerNameYPosition);
playerNameYPosition -= 20f; // Move downward by 20 units for the next name.
}
if (m_State == NetworkCharSelection.SeatState.LockedIn)
{
m_Glow.color = ClientCharSelectState.Instance.m_IdentifiersForEachPlayerNumber[m_PlayerNumbers[0]].Color;
m_Glow.gameObject.SetActive(true);
m_Checkbox.gameObject.SetActive(true);
PlayLockAnim();
}
else
{
m_Glow.gameObject.SetActive(false);
m_Checkbox.gameObject.SetActive(false);
PlayUnlockAnim();
}
}
private void PlayLockAnim()
{
if (m_Animator)
{
m_Animator.ResetTrigger(m_AnimatorTriggerWhenUnlocked);
m_Animator.SetTrigger(m_AnimatorTriggerWhenLockedIn);
}
}
private void PlayUnlockAnim()
{
if (m_Animator)
{
m_Animator.ResetTrigger(m_AnimatorTriggerWhenLockedIn);
m_Animator.SetTrigger(m_AnimatorTriggerWhenUnlocked);
}
}
public void SetDisableInteraction(bool disable)
{
m_IsDisabled = disable;
}
public void OnClicked()
{
ClientCharSelectState.Instance.OnPlayerClickedSeat(m_SeatIndex);
}
private void OnEnable()
{
OnPlayerSwitchedProfile += HandlePlayerSwitched;
}
private void OnDisable()
{
OnPlayerSwitchedProfile -= HandlePlayerSwitched;
}
/// <summary>
/// Removes the player from this seat if they select another.
/// </summary>
private void HandlePlayerSwitched(int playerNumber, int newSeatIndex)
{
if (newSeatIndex != m_SeatIndex)
{
RemovePlayer(playerNumber);
}
}
}
}
//using System;
//using Unity.BossRoom.Gameplay.GameplayObjects.Character;
//using Unity.BossRoom.Gameplay.GameState;
//using TMPro;
//using UnityEngine;
//using UnityEngine.UI;
//namespace Unity.BossRoom.Gameplay.UI
//{
// /// <summary>
// /// Controls one of the eight "seats" on the character-select screen (the boxes along the bottom).
// /// </summary>
// public class UICharSelectPlayerSeat : MonoBehaviour
// {
// [SerializeField]
// private GameObject m_InactiveStateVisuals;
// [SerializeField]
// private GameObject m_ActiveStateVisuals;
// [SerializeField]
// private Image m_PlayerNumberHolder;
// [SerializeField]
// private TextMeshProUGUI m_PlayerNameHolder;
// [SerializeField]
// private Image m_Glow;
// [SerializeField]
// private Image m_Checkbox;
// [SerializeField]
// private Button m_Button;
// [SerializeField]
// private Animator m_Animator;
// [SerializeField]
// private string m_AnimatorTriggerWhenLockedIn = "LockedIn";
// [SerializeField]
// private string m_AnimatorTriggerWhenUnlocked = "Unlocked";
// [SerializeField]
// private CharacterTypeEnum m_CharacterClass;
// // just a way to designate which seat we are -- the leftmost seat on the lobby UI is index 0, the next one is index 1, etc.
// private int m_SeatIndex;
// // playerNumber of who is sitting in this seat right now. 0-based; e.g. this is 0 for Player 1, 1 for Player 2, etc. Meaningless when m_State is Inactive (and in that case it is set to -1 for clarity)
// private int m_PlayerNumber;
// // the last SeatState we were assigned
// private NetworkCharSelection.SeatState m_State;
// // once this is true, we're never clickable again!
// private bool m_IsDisabled;
// public void Initialize(int seatIndex)
// {
// m_SeatIndex = seatIndex;
// m_State = NetworkCharSelection.SeatState.Inactive;
// m_PlayerNumber = -1;
// ConfigureStateGraphics();
// }
// public void SetState(NetworkCharSelection.SeatState state, int playerIndex, string playerName)
// {
// if (state == m_State && playerIndex == m_PlayerNumber)
// return; // no actual changes
// m_State = state;
// m_PlayerNumber = playerIndex;
// m_PlayerNameHolder.text = playerName;
// if (m_State == NetworkCharSelection.SeatState.Inactive)
// m_PlayerNumber = -1;
// ConfigureStateGraphics();
// }
// public bool IsLocked()
// {
// return m_State == NetworkCharSelection.SeatState.LockedIn;
// }
// public void SetDisableInteraction(bool disable)
// {
// Debug.Log("Ali Interactable False");
// //m_Button.interactable = !disable;
// m_IsDisabled = disable;
// if (!disable)
// {
// // if we were locked move to unlocked state
// PlayUnlockAnim();
// }
// }
// private void PlayLockAnim()
// {
// if (m_Animator)
// {
// m_Animator.ResetTrigger(m_AnimatorTriggerWhenUnlocked);
// m_Animator.SetTrigger(m_AnimatorTriggerWhenLockedIn);
// }
// }
// private void PlayUnlockAnim()
// {
// if (m_Animator)
// {
// m_Animator.ResetTrigger(m_AnimatorTriggerWhenLockedIn);
// m_Animator.SetTrigger(m_AnimatorTriggerWhenUnlocked);
// }
// }
// private void ConfigureStateGraphics()
// {
// if (m_State == NetworkCharSelection.SeatState.Inactive)
// {
// m_InactiveStateVisuals.SetActive(true);
// m_ActiveStateVisuals.SetActive(false);
// m_Glow.gameObject.SetActive(false);
// m_Checkbox.gameObject.SetActive(false);
// m_PlayerNameHolder.gameObject.SetActive(false);
// Debug.Log("Ali Interactable False 2");
// //m_Button.interactable = !m_IsDisabled;
// PlayUnlockAnim();
// }
// else // either active or locked-in... these states are visually very similar
// {
// m_InactiveStateVisuals.SetActive(false);
// m_PlayerNumberHolder.sprite = ClientCharSelectState.Instance.m_IdentifiersForEachPlayerNumber[m_PlayerNumber].Indicator;
// m_ActiveStateVisuals.SetActive(true);
// m_PlayerNameHolder.gameObject.SetActive(true);
// m_PlayerNameHolder.color = ClientCharSelectState.Instance.m_IdentifiersForEachPlayerNumber[m_PlayerNumber].Color;
// //m_Button.interactable = !m_IsDisabled;
// Debug.Log("Ali Interactable False 3");
// if (m_State == NetworkCharSelection.SeatState.LockedIn)
// {
// m_Glow.color = ClientCharSelectState.Instance.m_IdentifiersForEachPlayerNumber[m_PlayerNumber].Color;
// m_Glow.gameObject.SetActive(true);
// m_Checkbox.gameObject.SetActive(true);
// Debug.Log("Ali Interactable False 4");
// //m_Button.interactable = false;
// PlayLockAnim();
// }
// else
// {
// m_Glow.gameObject.SetActive(false);
// m_Checkbox.gameObject.SetActive(false);
// PlayUnlockAnim();
// }
// }
// }
// // Called directly by Button in UI
// public void OnClicked()
// {
// ClientCharSelectState.Instance.OnPlayerClickedSeat(m_SeatIndex);
// }
// }
//}