fix code optimate for PlayerModelPreview v3

This commit is contained in:
VuNgocHaiC7
2026-04-26 16:37:34 +07:00
parent 50604ce4a9
commit f33c878cd9
5 changed files with 168 additions and 56 deletions
@@ -15,6 +15,8 @@ using System.Text;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using BrewMonster.Scripts.UI.Inventory;
using CSNetwork.Protocols.RPCData;
namespace BrewMonster.Scripts.Managers
{
@@ -166,6 +168,7 @@ namespace BrewMonster.Scripts.Managers
ShowDetailPanel(false);
ShowSplitPanel(false);
RefreshAll();
RefreshCharacterModelPreview();
}
private void WireSplitUI()
@@ -688,6 +691,7 @@ namespace BrewMonster.Scripts.Managers
Debug.Log($"[InventoryUI] Equip request sent for item {currentSelectedItem.m_tid} from slot {currentSelectedSlot} to equip location {equipLocation}");
// Refresh inventory after equip
RefreshAll();
RefreshCharacterModelPreview();
});
}
@@ -713,6 +717,7 @@ namespace BrewMonster.Scripts.Managers
Debug.Log($"[InventoryUI] Unequip request sent for item {currentSelectedItem.m_tid} from equip location {equipLocation} to inventory slot {emptySlot}");
// Refresh inventory after unequip
RefreshAll();
RefreshCharacterModelPreview();
});
}
@@ -738,6 +743,7 @@ namespace BrewMonster.Scripts.Managers
// Refresh inventory after drop
RefreshAll();
RefreshCharacterModelPreview();
}
/// <summary>
@@ -1617,6 +1623,61 @@ namespace BrewMonster.Scripts.Managers
return false;
}
public void RefreshCharacterModelPreview()
{
var preview = PlayerModelPreview.Instance;
if (preview != null)
{
RoleInfo roleInfo = BuildCurrentPreviewRoleInfo();
if (roleInfo != null)
{
preview.ReloadRoleModel(roleInfo);
}
}
var inventoryPreview = FindFirstObjectByType<InventoryCharacterPreview>();
if (inventoryPreview != null)
{
inventoryPreview.QueueRefresh();
}
}
private RoleInfo BuildCurrentPreviewRoleInfo()
{
RoleInfo roleInfo = UnityGameSession.Instance != null ? UnityGameSession.Instance.GetRoleInfo() : null;
if (roleInfo == null)
return null;
RoleInfo snapshot = roleInfo.Clone();
if (snapshot.equipment == null)
snapshot.equipment = new List<GRoleInventory>();
else
snapshot.equipment.Clear();
CECHostPlayer host = CECGameRun.Instance?.GetHostPlayer();
var equipInv = host?.GetInventory(InventoryConst.IVTRTYPE_EQUIPPACK);
if (equipInv == null)
return snapshot;
int size = equipInv.GetSize();
for (int i = 0; i < size; i++)
{
EC_IvtrItem item = equipInv.GetItem(i, false);
if (item == null)
continue;
snapshot.equipment.Add(new GRoleInventory
{
id = (uint)item.GetTemplateID(),
pos = i,
count = item.GetCount(),
max_count = Math.Max(1, item.GetPileLimitInstance())
});
}
return snapshot;
}
private bool IsPointerOverDetailPanel(Vector2 screenPosition)
{
var panelRect = detailPanelRoot.transform as RectTransform;
@@ -15,6 +15,9 @@ namespace BrewMonster.Scripts
private int _loadVersion;
private bool _hasRequestedPlayerModelId;
private int _requestedPlayerModelId;
private void Awake()
{
if (modelRoot == null)
@@ -50,20 +53,19 @@ namespace BrewMonster.Scripts
if (version != _loadVersion)
{
if (model != null)
Destroy(model);
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);
ApplyRequestedModelVisibility();
}
}
@@ -72,13 +74,36 @@ namespace BrewMonster.Scripts
/// </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);
//}
_hasRequestedPlayerModelId = true;
_requestedPlayerModelId = playerModelId;
ApplyRequestedModelVisibility();
}
/// <summary>
/// Applies the visibility of player models based on the requested player model id.
/// </summary>
private void ApplyRequestedModelVisibility()
{
if(!_hasRequestedPlayerModelId)
return;
int n = Mathf.Min(playerModels.Count, playerModelIds.Count);
for (int i = 0; i < n; i++)
{
GameObject go = playerModels[i];
if (go == null)
if(go == null)
continue;
go.SetActive(playerModelIds[i] == playerModelId);
go.SetActive(playerModelIds[i] == _requestedPlayerModelId);
}
}
@@ -307,5 +332,14 @@ namespace BrewMonster.Scripts
}
return skeletonBuilder;
}
public void ReloadRoleModel(RoleInfo roleInfo)
{
if (roleInfo == null)
return;
ShowAllPlayerModels(new List<RoleInfo> { roleInfo });
ShowPlayerModel(roleInfo.roleid);
}
}
}
@@ -27,21 +27,23 @@ namespace BrewMonster.Scripts.UI.Inventory
[SerializeField] private Vector3 previewLocalPosition = Vector3.zero;
[SerializeField] private Vector3 previewLocalEuler;
[SerializeField] private Vector3 previewLocalScale = Vector3.one;
[SerializeField] private float previewHeightOffset = 0.12f;
[Tooltip("Copy the preview root layer onto the cloned hierarchy so the preview camera can isolate it.")]
[SerializeField] private bool inheritPreviewLayer = true;
[Header("Camera Output")]
[SerializeField] private RawImage previewFrame;
[SerializeField] private RenderTexture previewRenderTexture;
[SerializeField] private bool autoFocusCamera = true;
[SerializeField] private Vector3 cameraFocusOffset = new Vector3(0f, 1.5f, 0f);
[SerializeField] private Vector3 cameraFocusOffset = new Vector3(0f, 0f, 0f);
[Header("Camera Framing")]
[SerializeField] private float previewCameraDistance = 1.4f;
[SerializeField] private Vector3 previewCameraOffset = new Vector3(0f, 0.5f, 0f);
[SerializeField] private float previewCameraDistance = 3.3f;
[SerializeField] private Vector3 previewCameraOffset = new Vector3(0.15f, 0.8f, 0f);
[SerializeField] private bool overrideFieldOfView = true;
[SerializeField][Range(10f, 60f)] private float previewFieldOfView = 38f;
[SerializeField][Range(10f, 60f)] private float previewFieldOfView = 33f;
[SerializeField] private bool autoFrameByBounds = true;
[SerializeField][Range(1f, 2f)] private float autoFramePadding = 1.15f;
[SerializeField] private float minAutoCameraDistance = 1.25f;
[SerializeField] private float maxAutoCameraDistance = 8f;
private bool _cameraStateCached;
private Vector3 _cachedCameraPosition;
@@ -95,17 +97,27 @@ namespace BrewMonster.Scripts.UI.Inventory
// Check if origin model structure has changed (equipment models are child objects)
// This detects equipment changes in realtime since all equipment is attached as children
Transform currentOriginRoot = ResolveSourceModelRoot();
if (currentOriginRoot != null)
if (currentOriginRoot == null)
{
int currentChildCount = CountAllChildren(currentOriginRoot);
// Refresh if origin model changed or child count changed (equipment added/removed)
if (_lastOriginModelRoot != currentOriginRoot || _lastOriginModelChildCount != currentChildCount)
if (_previewInstance == null)
{
_lastOriginModelRoot = currentOriginRoot;
_lastOriginModelChildCount = currentChildCount;
QueueRefresh();
}
if(_refreshQueued)
{
_refreshQueued = false;
BuildPreviewModel();
}
return;
}
int currentChildCount = CountAllChildren(currentOriginRoot);
if (_lastOriginModelRoot != currentOriginRoot || _lastOriginModelChildCount != currentChildCount)
{
_lastOriginModelRoot = currentOriginRoot;
_lastOriginModelChildCount = currentChildCount;
QueueRefresh();
}
if (_refreshQueued)
@@ -226,9 +238,19 @@ namespace BrewMonster.Scripts.UI.Inventory
Transform sourceRoot = ResolveSourceModelRoot();
if (sourceRoot == null)
{
_previewInstance = null;
_lastOriginModelRoot = null;
_lastOriginModelChildCount = 0;
QueueRefresh();
return;
}
if (!sourceRoot.gameObject.activeSelf)
{
sourceRoot.gameObject.SetActive(true);
}
// Use resolved source root, not sourceModelRoot field directly.
_previewInstance = sourceRoot.gameObject;
Transform instanceTransform = _previewInstance.transform;
@@ -238,15 +260,11 @@ namespace BrewMonster.Scripts.UI.Inventory
instanceTransform.SetParent(previewRoot, false);
}
instanceTransform.localPosition = previewLocalPosition + Vector3.up * previewHeightOffset;
instanceTransform.localPosition = previewLocalPosition + Vector3.up;
instanceTransform.localRotation = Quaternion.Euler(previewLocalEuler);
instanceTransform.localScale = previewLocalScale;
if (inheritPreviewLayer)
{
ApplyLayerRecursive(instanceTransform, previewRoot.gameObject.layer);
}
ApplyLayerRecursive(instanceTransform, previewRoot.gameObject.layer);
EnsureCameraFocus(instanceTransform);
EnsureCameraBindings();
}
+27 -29
View File
@@ -500,10 +500,10 @@ RectTransform:
m_Children: []
m_Father: {fileID: 7166820878650541780}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 588.35, y: -59.5}
m_SizeDelta: {x: 85, y: 85}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &9112205963990496432
CanvasRenderer:
@@ -907,10 +907,10 @@ RectTransform:
m_Children: []
m_Father: {fileID: 7166820878650541780}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 479.18, y: -59.5}
m_SizeDelta: {x: 85, y: 85}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &3997873020355048166
CanvasRenderer:
@@ -1238,10 +1238,10 @@ RectTransform:
m_Children: []
m_Father: {fileID: 7166820878650541780}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 370.01, y: -59.5}
m_SizeDelta: {x: 85, y: 85}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &4479228720555407959
CanvasRenderer:
@@ -4929,10 +4929,10 @@ RectTransform:
m_Children: []
m_Father: {fileID: 7166820878650541780}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 42.5, y: -59.5}
m_SizeDelta: {x: 85, y: 85}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &7052320096474271168
CanvasRenderer:
@@ -11098,16 +11098,14 @@ MonoBehaviour:
previewLocalPosition: {x: 0, y: 0, z: 100}
previewLocalEuler: {x: 0, y: 0, z: 0}
previewLocalScale: {x: 1, y: 1, z: 1}
inheritPreviewLayer: 1
previewFrame: {fileID: 6707240765686952970}
previewRenderTexture: {fileID: 8400000, guid: 42c3c43cd0c3b704cb6cf0dd1051d9ff, type: 2}
autoFocusCamera: 1
cameraFocusOffset: {x: 0, y: 0, z: 0}
previewCameraDistance: 1.4
previewCameraOffset: {x: 0, y: 0.1, z: 0}
previewCameraDistance: 3.3
previewCameraOffset: {x: 0.06, y: 1.07, z: 0}
overrideFieldOfView: 1
previewFieldOfView: 25
freezeAnimation: 1
previewFieldOfView: 44
--- !u!1 &5473020210238587200
GameObject:
m_ObjectHideFlags: 0
@@ -14072,10 +14070,10 @@ RectTransform:
m_Children: []
m_Father: {fileID: 7166820878650541780}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 151.67, y: -59.5}
m_SizeDelta: {x: 85, y: 85}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &4452551064742165538
CanvasRenderer:
@@ -19519,10 +19517,10 @@ RectTransform:
m_Children: []
m_Father: {fileID: 7166820878650541780}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 260.84, y: -59.5}
m_SizeDelta: {x: 85, y: 85}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &5155025384962724770
CanvasRenderer:
@@ -517,6 +517,7 @@ namespace BrewMonster
if (ui != null)
{
ui.RefreshAll();
ui.RefreshCharacterModelPreview();
}
UpdateEquipSkins();