Files
test/Assets/Scripts/SelecScreenCharacter.cs
T
2026-04-25 18:05:26 +07:00

231 lines
7.9 KiB
C#

using CSNetwork.Protocols.RPCData;
using System;
using System.Collections.Generic;
using BrewMonster.Scripts;
using UnityEngine;
using UnityEngine.UI;
using BrewMonster;
using System.Collections;
namespace BrewMonster.UI
{
// Select Character Screen
//TODO: Change the name to SelectCharacterScreen
public class SelecScreenCharacter : MonoBehaviour
{
[SerializeField] private GameObject characterItemPrefab;
[SerializeField] private GameObject addCharacterItemPrefab;
[SerializeField] private RectTransform parentItems;
[SerializeField] private Button createCharacterButton;
[SerializeField] private Button _btnEnterGame;
[SerializeField] private CreateCharacterScreen createCharacterScreen;
private CharacterItemUI _selectingCharacterItemUI;
private Action<RoleInfo> _onClickItemChar;
private Action<RoleInfo> _onCreateCharacterComplete;
private List<RoleInfo> _roleInfos;
private Coroutine _showModelReadyCoroutine;
private int _pendingShowModelRoleId = -1;
private void OnEnable()
{
_btnEnterGame.onClick.AddListener(OnClickedEnterGame);
_btnEnterGame.gameObject.SetActive(false);
if (_roleInfos != null && _roleInfos.Count > 0)
{
PlayerModelPreview.Instance?.ShowAllPlayerModels(_roleInfos);
}
else
{
PlayerModelPreview.Instance?.ClearModels();
}
}
private void OnDisable()
{
_btnEnterGame.onClick.RemoveListener(OnClickedEnterGame);
_selectingCharacterItemUI = null;
}
private void Start()
{
if (createCharacterButton != null)
{
createCharacterButton.onClick.AddListener(OnCreateCharacterClicked);
}
}
public void InitScreen(List<RoleInfo> roleInfos, Action<RoleInfo> OnClickItemChar, Action<RoleInfo> onCreateCharacterComplete = null)
{
_onClickItemChar = OnClickItemChar;
_onCreateCharacterComplete = onCreateCharacterComplete;
// Clear existing items
if (parentItems != null)
{
foreach (Transform child in parentItems)
{
Destroy(child.gameObject);
}
}
_roleInfos = roleInfos;
// Create character items
if (roleInfos != null)
{
foreach (RoleInfo info in roleInfos)
{
if (characterItemPrefab != null && parentItems != null)
{
CharacterItemUI item = Instantiate(characterItemPrefab, parentItems).GetComponent<CharacterItemUI>();
item.InitItem(info, OnSelectCharacter);
}
}
// If number of roles < 8, spawn addCharacterItemPrefab and hide createCharacterButton
if (roleInfos.Count < 8)
{
// Hide the createCharacterButton
if (createCharacterButton != null)
{
createCharacterButton.gameObject.SetActive(false);
}
// Spawn addCharacterItemPrefab
if (addCharacterItemPrefab != null && parentItems != null)
{
GameObject addCharacterItem = Instantiate(addCharacterItemPrefab, parentItems);
// Set up click handler for the add character item
Button addButton = addCharacterItem.GetComponent<Button>();
if (addButton == null)
{
addButton = addCharacterItem.GetComponentInChildren<Button>();
}
if (addButton != null)
{
addButton.onClick.RemoveAllListeners();
addButton.onClick.AddListener(OnCreateCharacterClicked);
}
}
}
else
{
// Show the createCharacterButton if we have 8 or more roles
if (createCharacterButton != null)
{
createCharacterButton.gameObject.SetActive(true);
}
}
// Load player preview 3D models
PlayerModelPreview.Instance?.ShowAllPlayerModels(roleInfos);
}
else
{
if (PlayerModelPreview.Instance != null)
PlayerModelPreview.Instance.ShowAllPlayerModels(null);
// If roleInfos is null, show createCharacterButton
if (createCharacterButton != null)
{
createCharacterButton.gameObject.SetActive(true);
}
}
}
private void OnSelectCharacter(CharacterItemUI characterItemUI)
{
if (_selectingCharacterItemUI == characterItemUI)
{
return;
}
if(_selectingCharacterItemUI!=null)
{
_selectingCharacterItemUI.SetFocus(false);
}
_selectingCharacterItemUI = characterItemUI;
_selectingCharacterItemUI.SetFocus(true);
_btnEnterGame.gameObject.SetActive(true);
if (PlayerModelPreview.Instance == null || characterItemUI.RoleInfo == null)
{
return;
}
_pendingShowModelRoleId = characterItemUI.RoleInfo.roleid;
if (_showModelReadyCoroutine != null)
{
StopCoroutine(_showModelReadyCoroutine);
}
_showModelReadyCoroutine = StartCoroutine(ShowSelectedModelWhenReady(_pendingShowModelRoleId));
}
private IEnumerator ShowSelectedModelWhenReady(int roleId)
{
while (isActiveAndEnabled && PlayerModelPreview.Instance != null)
{
if (_pendingShowModelRoleId != roleId)
{
yield break; // Role changed, stop this coroutine
}
if (PlayerModelPreview.Instance.playerModelIds != null && PlayerModelPreview.Instance.playerModelIds.Contains(roleId))
{
PlayerModelPreview.Instance.ShowPlayerModel(roleId);
_showModelReadyCoroutine = null;
yield break; // Model is ready, show it and stop this coroutine
}
yield return null;
}
_showModelReadyCoroutine = null;
}
private void OnCreateCharacterClicked()
{
if (createCharacterScreen != null)
{
gameObject.SetActive(false);
createCharacterScreen.Show(OnCreateCharacterComplete, OnCreateCharacterCancel);
}
}
private void OnCreateCharacterComplete(RoleInfo newRole)
{
if (createCharacterScreen != null)
{
createCharacterScreen.Hide();
}
gameObject.SetActive(true);
_onCreateCharacterComplete?.Invoke(newRole);
}
private void OnCreateCharacterCancel()
{
if (createCharacterScreen != null)
{
createCharacterScreen.Hide();
}
gameObject.SetActive(true);
}
private void OnClickedEnterGame()
{
if (_selectingCharacterItemUI != null)
{
_onClickItemChar?.Invoke(_selectingCharacterItemUI.RoleInfo);
}
else
{
BMLogger.LogError("No role selected");
}
}
}
}