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.
387 lines
14 KiB
C#
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);
|
|
// }
|
|
|
|
// }
|
|
//}
|