109 lines
3.3 KiB
C#
109 lines
3.3 KiB
C#
using System.Collections.Generic;
|
|
using BrewMonster.Scripts.Managers;
|
|
using CSNetwork.Protocols.RPCData;
|
|
using UnityEngine;
|
|
|
|
namespace BrewMonster.Scripts
|
|
{
|
|
public class PlayerModelPreview : MonoBehaviour
|
|
{
|
|
[SerializeField] private Transform modelRoot;
|
|
|
|
public List<GameObject> playerModels = new();
|
|
public List<int> playerModelIds = new();
|
|
|
|
private int _loadVersion;
|
|
|
|
private void Awake()
|
|
{
|
|
if (modelRoot == null)
|
|
modelRoot = transform;
|
|
}
|
|
|
|
private void OnDestroy()
|
|
{
|
|
ClearModelsImmediate();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Loads one preview instance per role (via <see cref="NPCManager.GetModelPlayer"/>).
|
|
/// All instances stay hidden until <see cref="ShowPlayerModel"/> is called.
|
|
/// </summary>
|
|
public async void ShowAllPlayerModels(List<RoleInfo> roleInfos)
|
|
{
|
|
_loadVersion++;
|
|
int version = _loadVersion;
|
|
|
|
ClearModels();
|
|
|
|
if (roleInfos == null || roleInfos.Count == 0 || NPCManager.Instance == null)
|
|
return;
|
|
|
|
for (int i = 0; i < roleInfos.Count; i++)
|
|
{
|
|
RoleInfo role = roleInfos[i];
|
|
GameObject model = await NPCManager.Instance.GetModelPlayer(role.occupation, role.gender);
|
|
|
|
if (version != _loadVersion)
|
|
{
|
|
if (model != null)
|
|
Destroy(model);
|
|
return;
|
|
}
|
|
|
|
if (model == null)
|
|
continue;
|
|
|
|
model.transform.SetParent(modelRoot, false);
|
|
model.transform.localPosition = Vector3.zero;
|
|
model.transform.localRotation = Quaternion.identity;
|
|
model.SetActive(false);
|
|
playerModels.Add(model);
|
|
playerModelIds.Add(role.roleid);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Shows the preview for the given role id (matches <see cref="RoleInfo.roleid"/>). Hides all others.
|
|
/// </summary>
|
|
public void ShowPlayerModel(int playerModelId)
|
|
{
|
|
int n = Mathf.Min(playerModels.Count, playerModelIds.Count);
|
|
for (int i = 0; i < n; i++)
|
|
{
|
|
GameObject go = playerModels[i];
|
|
if (go == null)
|
|
continue;
|
|
go.SetActive(playerModelIds[i] == playerModelId);
|
|
}
|
|
}
|
|
|
|
private void ClearModels()
|
|
{
|
|
for (int i = 0; i < playerModels.Count; i++)
|
|
{
|
|
if (playerModels[i] != null)
|
|
Destroy(playerModels[i]);
|
|
}
|
|
playerModels.Clear();
|
|
playerModelIds.Clear();
|
|
}
|
|
|
|
private void ClearModelsImmediate()
|
|
{
|
|
for (int i = 0; i < playerModels.Count; i++)
|
|
{
|
|
if (playerModels[i] != null)
|
|
{
|
|
if (Application.isPlaying)
|
|
Destroy(playerModels[i]);
|
|
else
|
|
DestroyImmediate(playerModels[i]);
|
|
}
|
|
}
|
|
playerModels.Clear();
|
|
playerModelIds.Clear();
|
|
}
|
|
}
|
|
}
|