Files
test/Assets/PerfectWorld/Scripts/Players/PlayerModelPreview.cs
T
2026-04-03 16:33:30 +07:00

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();
}
}
}