diff --git a/Assets/PerfectWorld/Prefab/UIManager.prefab b/Assets/PerfectWorld/Prefab/UIManager.prefab
index a4126ad6ba..d54d64101c 100644
--- a/Assets/PerfectWorld/Prefab/UIManager.prefab
+++ b/Assets/PerfectWorld/Prefab/UIManager.prefab
@@ -8543,10 +8543,102 @@ PrefabInstance:
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
+ - target: {fileID: 2825516843822704547, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3}
+ propertyPath: m_SizeDelta.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 3959004304404627642, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3}
+ propertyPath: m_AnchorMax.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 3959004304404627642, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3}
+ propertyPath: m_AnchorMin.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 3959004304404627642, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3}
+ propertyPath: m_AnchoredPosition.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 3959004304404627642, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3}
+ propertyPath: m_AnchoredPosition.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 5330897987501731450, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3}
+ propertyPath: m_AnchorMax.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 5330897987501731450, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3}
+ propertyPath: m_AnchorMin.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 5330897987501731450, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3}
+ propertyPath: m_AnchoredPosition.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 5330897987501731450, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3}
+ propertyPath: m_AnchoredPosition.y
+ value: 0
+ objectReference: {fileID: 0}
- target: {fileID: 6238266639003596740, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3}
propertyPath: m_Name
value: SkillUI
objectReference: {fileID: 0}
+ - target: {fileID: 6238266639003596740, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3}
+ propertyPath: m_IsActive
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6375080618180806221, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3}
+ propertyPath: m_AnchorMax.y
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 6375080618180806221, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3}
+ propertyPath: m_AnchorMin.y
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 6375080618180806221, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3}
+ propertyPath: m_AnchoredPosition.x
+ value: 83.16
+ objectReference: {fileID: 0}
+ - target: {fileID: 6375080618180806221, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3}
+ propertyPath: m_AnchoredPosition.y
+ value: -162.18411
+ objectReference: {fileID: 0}
+ - target: {fileID: 8029283128219612690, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3}
+ propertyPath: m_AnchorMax.y
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 8029283128219612690, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3}
+ propertyPath: m_AnchorMin.y
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 8029283128219612690, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3}
+ propertyPath: m_AnchoredPosition.x
+ value: 83.16
+ objectReference: {fileID: 0}
+ - target: {fileID: 8029283128219612690, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3}
+ propertyPath: m_AnchoredPosition.y
+ value: -292.4765
+ objectReference: {fileID: 0}
+ - target: {fileID: 8302858527499935758, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3}
+ propertyPath: m_SizeDelta.y
+ value: 28
+ objectReference: {fileID: 0}
+ - target: {fileID: 9102658109286783788, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3}
+ propertyPath: m_AnchorMax.y
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 9102658109286783788, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3}
+ propertyPath: m_AnchorMin.y
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 9102658109286783788, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3}
+ propertyPath: m_AnchoredPosition.x
+ value: 83.16
+ objectReference: {fileID: 0}
+ - target: {fileID: 9102658109286783788, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3}
+ propertyPath: m_AnchoredPosition.y
+ value: -48.51895
+ objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
diff --git a/Assets/PerfectWorld/Resources/UI/DialogScriptTableObject.asset b/Assets/PerfectWorld/Resources/UI/DialogScriptTableObject.asset
index 3a56aa4ebf..f1405a4f75 100644
--- a/Assets/PerfectWorld/Resources/UI/DialogScriptTableObject.asset
+++ b/Assets/PerfectWorld/Resources/UI/DialogScriptTableObject.asset
@@ -39,3 +39,5 @@ MonoBehaviour:
prefab: {fileID: 6310702841431484757, guid: 6620f766cee7c8f4cb00dd457ac77675, type: 3}
- id: Win_ArrangeTeam
prefab: {fileID: 2452003196178065293, guid: 5a3e828efd5c542469d1f17565205ded, type: 3}
+ - id: CDlgInfoTooltip
+ prefab: {fileID: 6830833846243993097, guid: 97dd1de3aba08a04980849e40d5c1ea4, type: 3}
diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_InventoryUI.cs b/Assets/PerfectWorld/Scripts/Managers/EC_InventoryUI.cs
index 7d0655d343..673c0867e3 100644
--- a/Assets/PerfectWorld/Scripts/Managers/EC_InventoryUI.cs
+++ b/Assets/PerfectWorld/Scripts/Managers/EC_InventoryUI.cs
@@ -2,6 +2,7 @@ using BrewMonster;
using BrewMonster.Common;
using BrewMonster.Network;
using BrewMonster.Scripts;
+using BrewMonster.Scripts.UI;
using CSNetwork.GPDataType;
using ModelRenderer.Scripts.GameData;
using PerfectWorld.Scripts.Managers;
@@ -26,9 +27,9 @@ namespace BrewMonster.Scripts.Managers
[SerializeField] private GameObject detailPanelRoot;
[SerializeField] private Vector2 detailPanelOffset = new Vector2(20f, 0f);
[SerializeField] private bool hideDetailOnStart = true;
- [SerializeField] private TextOutlet nameText;
- [SerializeField] private TextOutlet descriptionText;
- [SerializeField] private TextOutlet extendedDescText;
+ [SerializeField] private EC_UIUtility.TextOutlet nameText;
+ [SerializeField] private EC_UIUtility.TextOutlet descriptionText;
+ [SerializeField] private EC_UIUtility.TextOutlet extendedDescText;
[SerializeField] private Button equipButton;
[SerializeField] private Button dropButton;
@@ -952,61 +953,11 @@ namespace BrewMonster.Scripts.Managers
}
// === Detail Panel Helpers ===
- [System.Serializable]
- private class TextOutlet
- {
- [SerializeField] public Text legacy;
- [SerializeField] public TMPro.TextMeshProUGUI tmp;
+ // Note: TextOutlet has been moved to EC_UIUtility for reuse across the codebase
- public void Set(string value)
- {
- if (legacy != null)
- {
- legacy.text = EC_Utility.FormatForLegacyText(value ?? string.Empty);
- }
- if (tmp != null)
- {
- tmp.text = FormatForTextMeshPro(value ?? string.Empty);
- }
- }
-
- ///
- /// Set text with explicit formatting preference
- ///
- /// Raw text with formatting codes
- /// Whether to prefer TextMeshPro formatting
- public void SetFormatted(string value, bool preferTextMeshPro = true)
- {
- string formattedText = preferTextMeshPro ?
- FormatForTextMeshPro(value ?? string.Empty) :
- EC_Utility.FormatForLegacyText(value ?? string.Empty);
-
- if (legacy != null)
- {
- legacy.text = formattedText;
- }
- if (tmp != null)
- {
- tmp.text = formattedText;
- }
- }
- }
-
- public void RefreshLayout(GameObject gameObject)
- {
- var parent = gameObject.GetComponent();
-
- // Force Unity to rebuild layout immediately
- parent.ForceUpdateRectTransforms();
- LayoutRebuilder.ForceRebuildLayoutImmediate(parent);
- }
private void ShowDetailPanel(bool show)
{
- if (detailPanelRoot != null)
- {
- detailPanelRoot.SetActive(show);
- RefreshLayout(detailPanelRoot);
- }
+ EC_UIUtility.ShowPanel(detailPanelRoot, show);
}
private Button GetButtonForSlot(byte package, int slot)
@@ -1054,69 +1005,8 @@ namespace BrewMonster.Scripts.Managers
return;
}
- var canvas = panelRect.GetComponentInParent