263 lines
9.1 KiB
C#
263 lines
9.1 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 Button _btnExit;
|
|
[SerializeField] private CreateCharacterScreen createCharacterScreen;
|
|
|
|
private CharacterItemUI _selectingCharacterItemUI;
|
|
private Action<RoleInfo> _onClickItemChar;
|
|
private Action<RoleInfo> _onCreateCharacterComplete;
|
|
private Action _onExit;
|
|
private List<RoleInfo> _roleInfos;
|
|
|
|
private Coroutine _showModelReadyCoroutine;
|
|
private int _pendingShowModelRoleId = -1;
|
|
|
|
private void OnEnable()
|
|
{
|
|
_btnEnterGame.onClick.AddListener(OnClickedEnterGame);
|
|
_btnEnterGame.gameObject.SetActive(false);
|
|
|
|
if(_btnExit != null)
|
|
{
|
|
_btnExit.onClick.AddListener(OnClickedExit);
|
|
}
|
|
|
|
if (_roleInfos != null && _roleInfos.Count > 0)
|
|
{
|
|
PlayerModelPreview.Instance?.ShowAllPlayerModels(_roleInfos);
|
|
}
|
|
else
|
|
{
|
|
PlayerModelPreview.Instance?.ClearModels();
|
|
}
|
|
}
|
|
|
|
private void OnDisable()
|
|
{
|
|
_btnEnterGame.onClick.RemoveListener(OnClickedEnterGame);
|
|
if (_showModelReadyCoroutine != null)
|
|
{
|
|
StopCoroutine(_showModelReadyCoroutine);
|
|
_showModelReadyCoroutine = null;
|
|
}
|
|
_pendingShowModelRoleId = -1;
|
|
HostPlayerPortraitCapture.Instance?.ClearPortrait();
|
|
_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, Action onExit = null)
|
|
{
|
|
_onClickItemChar = OnClickItemChar;
|
|
_onCreateCharacterComplete = onCreateCharacterComplete;
|
|
_onExit = onExit;
|
|
|
|
// 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);
|
|
_btnEnterGame.interactable = false; // Disable the button until the model is ready
|
|
|
|
if (PlayerModelPreview.Instance == null || characterItemUI.RoleInfo == null)
|
|
{
|
|
_btnEnterGame.interactable = true; // If we can't show the model, allow entering the game anyway
|
|
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);
|
|
HostPlayerPortraitCapture.Instance?.AttachToPlayerModelPreview(roleId);
|
|
_btnEnterGame.interactable = true;
|
|
_showModelReadyCoroutine = null;
|
|
yield break; // Model is ready, show it and stop this coroutine
|
|
}
|
|
yield return null;
|
|
}
|
|
_btnEnterGame.interactable = true;
|
|
_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");
|
|
}
|
|
}
|
|
|
|
private void OnClickedExit()
|
|
{
|
|
HostPlayerPortraitCapture.Instance?.ClearPortrait();
|
|
_onExit?.Invoke();
|
|
gameObject.SetActive(false);
|
|
|
|
if(PlayerModelPreview.Instance != null)
|
|
{
|
|
PlayerModelPreview.Instance.HideAllPlayerModels();
|
|
}
|
|
}
|
|
}
|
|
}
|