Create UI for DlgQuest, fix the proplem with quest have deep not equal 3

This commit is contained in:
Chomper9981
2026-02-07 14:57:35 +07:00
parent dfe70d4db9
commit f9c7d0f04c
17 changed files with 488 additions and 217 deletions
@@ -686,6 +686,8 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: bac01b5537b4341a7885fe2392d32eaa, type: 3}
m_Name:
m_EditorClassIdentifier:
skillNameText: {fileID: 0}
imageProgress: {fileID: 0}
m_TargetName:
m_TargetPos: {x: 0, y: 0, z: 0}
m_Targets: []
@@ -733,9 +735,9 @@ RectTransform:
- {fileID: 5334235739729266731}
m_Father: {fileID: 3016039455618517900}
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_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 131.66666, y: -25}
m_SizeDelta: {x: 50, y: 50}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &6804128504798270830
@@ -759,7 +761,7 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_Color: {r: 1, g: 1, b: 1, a: 0}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
@@ -1197,9 +1199,9 @@ RectTransform:
- {fileID: 2700626918252070787}
m_Father: {fileID: 3016039455618517900}
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_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 25, y: -25}
m_SizeDelta: {x: 50, y: 50}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &9058123560732067158
@@ -1223,7 +1225,7 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_Color: {r: 1, g: 1, b: 1, a: 0}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
@@ -1877,9 +1879,9 @@ RectTransform:
- {fileID: 8505317987590978995}
m_Father: {fileID: 3016039455618517900}
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_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 78.33333, y: -25}
m_SizeDelta: {x: 50, y: 50}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &1266149729541302388
@@ -1903,7 +1905,7 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_Color: {r: 1, g: 1, b: 1, a: 0}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
@@ -4,34 +4,21 @@ using UnityEngine.EventSystems;
using BrewMonster.Scripts.Task.UI;
using System.Collections.Generic;
using BrewMonster.UI;
using System.Text;
using System.Text.RegularExpressions;
namespace BrewMonster
{
public class StyledTaskTraceText : MonoBehaviour, IPointerMoveHandler, IPointerExitHandler,IPointerClickHandler
public class StyledTaskTraceText : MonoBehaviour, IPointerMoveHandler,IPointerClickHandler
{
public enum LinkType
{
coord,
npc,
monster,
item,
target
}
public TMP_Text tmp;
private List<LinkCommand> linkCommands =new List<LinkCommand>();
int hoveredLink = -1;
LinkType linkType = LinkType.coord;
Color32 normalColor = new Color32(77, 166, 255, 255);
Color32 hoverColor = new Color32(255, 200, 80, 255);
public void SetLinkType( LinkType linkType)
{
this.linkType = linkType;
}
private void Start()
{
tmp.raycastTarget = true;
ResetLinkColor();
tmp.ForceMeshUpdate();
}
@@ -45,22 +32,31 @@ namespace BrewMonster
if (linkIndex != hoveredLink)
{
ResetLinkColor();
hoveredLink = linkIndex;
if (hoveredLink != -1)
SetLinkColor(hoveredLink, hoverColor);
}
}
public void Set(string text)
{
tmp.text = text;
tmp.text = FormatForTextMeshPro(text);
}
public void OnPointerExit(PointerEventData eventData)
public static string FormatForTextMeshPro(string text)
{
ResetLinkColor();
hoveredLink = -1;
if (string.IsNullOrEmpty(text))
return string.Empty;
StringBuilder result = new StringBuilder(text);
result.Replace("\\r", "\n");
return ProcessColorCodes(result);
}
public static string ProcessColorCodes(StringBuilder text)
{
string pattern = @"\^([0-9A-Fa-f]{6})";
return Regex.Replace(text.ToString(), pattern, match =>
{
string hexColor = match.Groups[1].Value;
return $"<color=#{hexColor}>";
}, RegexOptions.None);
}
public void AddToFirstPosition(LinkCommand linkCommand)
@@ -110,34 +106,30 @@ namespace BrewMonster
public void OnPointerClick(PointerEventData eventData)
{
if (hoveredLink == -1) return;
TMP_LinkInfo linkInfo = tmp.textInfo.linkInfo[hoveredLink];
string linkText = linkInfo.GetLinkText();
string entityID = linkInfo.GetLinkID();
switch (linkType)
switch (entityID)
{
case LinkType.coord:
Debug.Log($"Clicked coord link: ID={entityID} Type={linkType} Text={linkText}");
case "coord":
Debug.Log($"Clicked coord link: ID={entityID} Text={linkText}");
linkCommands[hoveredLink].Execute(tmp);
//Debug.Log($"[StyledTaskTraceText] OnPointerClick: linkCommands[hoveredLink].Execute(tmp) => {linkCommands[hoveredLink].Execute(tmp)}");
break;
case LinkType.npc:
Debug.Log($"Clicked npc link: ID={entityID} Type={linkType} Text={linkText}");
case "npc":
Debug.Log($"Clicked npc link: ID={entityID} Text={linkText}");
linkCommands[hoveredLink].Execute(tmp);
break;
case LinkType.monster:
Debug.Log($"Clicked monster link: ID={entityID} Type={linkType} Text={linkText}");
case "monster":
Debug.Log($"Clicked monster link: ID={entityID} Text={linkText}");
break;
default:
Debug.Log($"Clicked unknown link: ID={entityID} Text={linkText}");
break;
}
ResetLinkColor();
hoveredLink = -1;
}
void ResetLinkColor()
{
if (hoveredLink == -1) return;
SetLinkColor(hoveredLink, normalColor);
}
}
}
@@ -50,9 +50,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 8688b7d87bac4c16b9eaa3408f8ea419, type: 3}
m_Name:
m_EditorClassIdentifier:
m_pTreeItemPrefab_Deep1: {fileID: 4314770845850481090, guid: 8752f9e95e4124abfb0d46a2cbe805e4, type: 3}
m_pTreeItemPrefab_Deep2: {fileID: 4314770845850481090, guid: 3cb6791423916496ea0a5b059419fdaa, type: 3}
m_pTreeItemPrefab_Deep3: {fileID: 4314770845850481090, guid: 7b4ec3e05f31a45138f72011c6bf7cf2, type: 3}
m_pTreeViewHolder: {fileID: 1273901548777618454, guid: 8bc89f863b5ec42b49f149d7363144f3, type: 3}
_currentSelectedItem: {fileID: 0}
m_aTreeViewItems: []
--- !u!114 &6404897883559725565
@@ -0,0 +1,110 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &700152255263326765
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5053903421260846465}
- component: {fileID: 4986645933044111193}
- component: {fileID: 1062363862839909147}
- component: {fileID: 1273901548777618454}
- component: {fileID: 442295838974077123}
m_Layer: 5
m_Name: TreeViewHolder
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &5053903421260846465
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 700152255263326765}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
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: 312.2704, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &4986645933044111193
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 700152255263326765}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3}
m_Name:
m_EditorClassIdentifier:
m_HorizontalFit: 0
m_VerticalFit: 1
--- !u!114 &1062363862839909147
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 700152255263326765}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Padding:
m_Left: 0
m_Right: 0
m_Top: 0
m_Bottom: 0
m_ChildAlignment: 1
m_Spacing: 0
m_ChildForceExpandWidth: 1
m_ChildForceExpandHeight: 1
m_ChildControlWidth: 0
m_ChildControlHeight: 0
m_ChildScaleWidth: 0
m_ChildScaleHeight: 0
m_ReverseArrangement: 0
--- !u!114 &1273901548777618454
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 700152255263326765}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: dfe78f833120b411d915fcd9c9793515, type: 3}
m_Name:
m_EditorClassIdentifier:
m_pTreeItemPrefab_Deep1: {fileID: 4314770845850481090, guid: 8752f9e95e4124abfb0d46a2cbe805e4, type: 3}
m_pTreeItemPrefab_Deep2: {fileID: 4314770845850481090, guid: 3cb6791423916496ea0a5b059419fdaa, type: 3}
m_pTreeItemPrefab_Deep3: {fileID: 4314770845850481090, guid: 7b4ec3e05f31a45138f72011c6bf7cf2, type: 3}
m_uItemData: 0
_treeLevel: 0
isLastItem: 1
_itemTextColor: {r: 0, g: 0, b: 0, a: 0}
_itemText:
_expand: 0
--- !u!222 &442295838974077123
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 700152255263326765}
m_CullTransparentMesh: 1
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 8bc89f863b5ec42b49f149d7363144f3
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -218,10 +218,10 @@ RectTransform:
- {fileID: 5827054231092576763}
m_Father: {fileID: 2024997316782034639}
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: 200.71739, y: -45.5}
m_SizeDelta: {x: 224.56522, y: 91}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &2230410216357545400
CanvasRenderer:
@@ -599,10 +599,10 @@ RectTransform:
- {fileID: 5340186735755952146}
m_Father: {fileID: 2024997316782034639}
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: 45, y: -45}
m_SizeDelta: {x: 150, y: 100}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &885853373149276158
CanvasRenderer:
@@ -661,7 +661,7 @@ MonoBehaviour:
m_SelectOnDown: {fileID: 0}
m_SelectOnLeft: {fileID: 0}
m_SelectOnRight: {fileID: 0}
m_Transition: 1
m_Transition: 0
m_Colors:
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
@@ -773,7 +773,7 @@ MonoBehaviour:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7973684205123875483}
m_Enabled: 1
m_Enabled: 0
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3}
m_Name:
@@ -63,12 +63,13 @@ MonoBehaviour:
_expandBG: {fileID: 6073336955970910715}
ExpandBGActive: {fileID: 21300000, guid: 42074c4f5f76b4cbc9043df8f430af5f, type: 3}
ExpandBGInactive: {fileID: 21300000, guid: e09a5d2cb3c3f4c858754a1e90a44abd, type: 3}
m_uItemData: 0
_treeLevel: 0
isLastItem: 0
_rectTransform: {fileID: 0}
OnClick:
m_PersistentCalls:
m_Calls: []
OnExpand:
m_PersistentCalls:
m_Calls: []
--- !u!114 &4986645933044111193
MonoBehaviour:
m_ObjectHideFlags: 0
@@ -143,10 +144,10 @@ RectTransform:
- {fileID: 5827054231092576763}
m_Father: {fileID: 2024997316782034639}
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: 184.67392, y: -33}
m_SizeDelta: {x: 220.65218, y: 66}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &2230410216357545400
CanvasRenderer:
@@ -175,7 +176,7 @@ MonoBehaviour:
m_SelectOnDown: {fileID: 0}
m_SelectOnLeft: {fileID: 0}
m_SelectOnRight: {fileID: 0}
m_Transition: 1
m_Transition: 0
m_Colors:
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
@@ -522,10 +523,10 @@ RectTransform:
- {fileID: 5062486824527634889}
m_Father: {fileID: 2024997316782034639}
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: 45.673943, y: -32}
m_SizeDelta: {x: 135.3478, y: 80}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &885853373149276158
CanvasRenderer:
@@ -681,7 +682,7 @@ MonoBehaviour:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7973684205123875483}
m_Enabled: 1
m_Enabled: 0
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3}
m_Name:
@@ -143,10 +143,10 @@ RectTransform:
- {fileID: 5827054231092576763}
m_Father: {fileID: 2024997316782034639}
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: 149.49998, y: -30}
m_SizeDelta: {x: 281, y: 60}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &2230410216357545400
CanvasRenderer:
@@ -254,8 +254,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0.00000023841858}
m_AnchoredPosition: {x: 35, y: 0}
m_SizeDelta: {x: -70, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &5842649278580849339
CanvasRenderer:
@@ -390,8 +390,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -0.00048828125, y: 0}
m_SizeDelta: {x: 48, y: 48}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 25, y: 25}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &7099288759002186546
CanvasRenderer:
@@ -415,13 +415,13 @@ MonoBehaviour:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastTarget: 0
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 21300000, guid: 00976b2e066af4e1f85ff5f3c94b5d48, type: 3}
m_Sprite: {fileID: -1288565630, guid: 00976b2e066af4e1f85ff5f3c94b5d48, type: 3}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
@@ -522,10 +522,10 @@ RectTransform:
- {fileID: 5062486824527634889}
m_Father: {fileID: 2024997316782034639}
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: 45, y: -27}
m_SizeDelta: {x: 50, y: 50}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &885853373149276158
CanvasRenderer:
@@ -549,13 +549,13 @@ MonoBehaviour:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 0}
m_RaycastTarget: 1
m_RaycastTarget: 0
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 21300000, guid: 00976b2e066af4e1f85ff5f3c94b5d48, type: 3}
m_Sprite: {fileID: -1288565630, guid: 00976b2e066af4e1f85ff5f3c94b5d48, type: 3}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
@@ -681,7 +681,7 @@ MonoBehaviour:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7973684205123875483}
m_Enabled: 1
m_Enabled: 0
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3}
m_Name:
@@ -43,7 +43,7 @@ TextureImporter:
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteMode: 2
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
@@ -108,7 +108,29 @@ TextureImporter:
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
sprites:
- serializedVersion: 2
name: dot_0
rect:
serializedVersion: 2
x: 2
y: 4
width: 20
height: 20
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: 0
bones: []
spriteID: 4daa99dcd797c4c14abcb146f46af16e
internalID: -1288565630
vertices: []
indices:
edges: []
weights: []
outline: []
customData:
physicsShape: []
@@ -122,7 +144,8 @@ TextureImporter:
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
nameFileIdTable:
dot_0: -1288565630
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
+19 -8
View File
@@ -202,6 +202,7 @@ namespace BrewMonster.Scripts.Task.UI
}
OnInitDialog();
}
// Convert exactly like C++ OnEventLButtonDown_Txt_QuestItem // 完全按照C++ OnEventLButtonDown_Txt_QuestItem转换
@@ -339,6 +340,10 @@ namespace BrewMonster.Scripts.Task.UI
{
CECUIHelper.FollowCoord(targetPos, targetName);
}
public static void SetTraceNpc(int entityID, int taskID)
{
CECUIHelper.FollowCoord(entityID, taskID);
}
private new void Update()
{
@@ -389,8 +394,9 @@ namespace BrewMonster.Scripts.Task.UI
CECGameUIMan gameUIMan = GetGameUIMan();
auiManager = gameUIMan;
}
AUIDialog pTrace = auiManager.GetDialog("Win_QuestMinion");
int index = this.transform.GetSiblingIndex();
pTrace.transform.SetSiblingIndex(index);
if (pTrace) {
pTrace.Show(m_bShowTrace);
}
@@ -706,7 +712,6 @@ namespace BrewMonster.Scripts.Task.UI
//
private bool Tick()
{
Debug.Log("[DlgTask] Tick");
RefreshTaskTrace();
// Time-window task refresh: while in Search view, refresh the list when server time crosses a minute boundary.
// This is throttled to avoid rebuilding large task lists every frame.
@@ -817,7 +822,6 @@ namespace BrewMonster.Scripts.Task.UI
}
public void RefreshTaskTrace()
{
Debug.Log("[DlgTask] RefreshTaskTrace");
// Get AUIManager, fallback to GetGameUIMan() if m_pAUIManager is not set yet
// 获取AUIManager,如果m_pAUIManager尚未设置则回退到GetGameUIMan()
AUIManager auiManager = GetAUIManager();
@@ -1066,6 +1070,9 @@ namespace BrewMonster.Scripts.Task.UI
AddTaskNode(id);
}
SortTaskNodeByType();
// Resolve all prefabs after quest loading is complete (after SetLastItem() calls are done)
// 在任务加载完成后解析所有预制体(在SetLastItem()调用完成后)
m_pTv_Quest.ResolveAllPrefabs();
string strTemp;
int iMaxTaskCount = TaskInterfaceConstants.TASK_ACTIVE_LIST_MAX_LEN;
strTemp = $"{pTask.GetTaskCount()}/{iMaxTaskCount}";
@@ -1188,6 +1195,9 @@ namespace BrewMonster.Scripts.Task.UI
}
SortTaskNodeByType();
// Resolve all prefabs after quest loading is complete (after SetLastItem() calls are done)
// 在任务加载完成后解析所有预制体(在SetLastItem()调用完成后)
m_pTv_Quest.ResolveAllPrefabs();
// string strTemp;
// ActiveTaskList pLst = (ActiveTaskList)pTask.GetActiveTaskList();
@@ -1377,7 +1387,7 @@ namespace BrewMonster.Scripts.Task.UI
// virtual bool OnChangeLayout(PAUIOBJECT pMine, PAUIOBJECT pTheir);
// virtual void OnChangeLayoutEnd(bool bAllDone);
//
private void InsertTaskChildren(TaskTreeViewItem pRoot, uint idTask, bool bExpand, bool bKey)
private void InsertTaskChildren(TaskTreeViewHolder pRoot, uint idTask, bool bExpand, bool bKey)
{
var pTreeTask = m_pTv_Quest;
var pMan = EC_Game.GetTaskTemplateMan();
@@ -1414,7 +1424,7 @@ namespace BrewMonster.Scripts.Task.UI
// [中文] 仅插入“已接任务(Active)”中的子任务(基于 ActiveTaskList 的 Child/NextSbl 索引)
// [English] Insert only active subtasks (based on ActiveTaskList Child/NextSbl indices)
private void InsertActiveTaskChildren(TaskTreeViewItem pRoot, uint idTask)
private void InsertActiveTaskChildren(TaskTreeViewHolder pRoot, uint idTask)
{
var pTreeTask = m_pTv_Quest;
var pMan = EC_Game.GetTaskTemplateMan();
@@ -1757,6 +1767,7 @@ namespace BrewMonster.Scripts.Task.UI
// Always create clickable link (even if coords aren't known yet).
// 总是创建可点击链接(即使暂时不知道坐标)。
sb.Append($"<link=\"coord_{nDNPC}\"><color=#00FF00>{npcName}</color></link>");
sb.Append("\n");
strText += sb.ToString();
@@ -2069,7 +2080,7 @@ namespace BrewMonster.Scripts.Task.UI
uint nTaskType = pTemp.m_FixedData.m_ulType;
if (pTemp.m_FixedData.m_DynTaskType != 0) nTaskType = (uint)ENUM_TASK_TYPE.enumTTEvent;
uint nAfterType = 0;
TaskTreeViewItem pAfter = null, pParent = null;
TaskTreeViewHolder pAfter = null, pParent = null;
// P_AUITREEVIEW_ITEM pItem = pTreeTask->GetFirstChildItem(pTreeTask->GetRootItem());
// var pItem = pTreeTask.transform.parent.GetChild(0).GetComponent<TaskTreeViewItem>();
var pItem = pTreeTask.GetFirstChild();
@@ -2136,10 +2147,10 @@ namespace BrewMonster.Scripts.Task.UI
// Collect direct children under the tree root (this component's transform)
int childCount = pTreeTask.transform.childCount;
var items = new List<(uint type, TaskTreeViewItem item)>(childCount);
var items = new List<(uint type, TaskTreeViewHolder item)>(childCount);
for (int i = 0; i < childCount; i++)
{
var child = pTreeTask.transform.GetChild(i).GetComponent<TaskTreeViewItem>();
var child = pTreeTask.transform.GetChild(i).GetComponent<TaskTreeViewHolder>();
if (child == null) continue;
uint nType = pTreeTask.GetItemData(child);
items.Add((nType, child));
@@ -6,14 +6,17 @@ namespace BrewMonster.Scripts.Task.UI
{
public class TaskTreeView : MonoBehaviour, IRefreshLayout
{
[SerializeField] private TaskTreeViewItem m_pTreeItemPrefab_Deep1;
[SerializeField] private TaskTreeViewItem m_pTreeItemPrefab_Deep2;
[SerializeField] private TaskTreeViewItem m_pTreeItemPrefab_Deep3;
[SerializeField] private TaskTreeViewHolder m_pTreeViewHolder;
[Header("DEBUG")]
[SerializeField] private TaskTreeViewItem _currentSelectedItem = null;
[SerializeField] private TaskTreeViewItem[] m_aTreeViewItems;
[SerializeField] private TaskTreeViewHolder _currentSelectedItem = null;
[SerializeField] private TaskTreeViewHolder[] m_aTreeViewItems;
private RectTransform _rectTransform;
private void Awake()
{
_rectTransform = GetComponent<RectTransform>();
}
private void Start()
{
@@ -23,24 +26,24 @@ namespace BrewMonster.Scripts.Task.UI
});
}
public void SetItemData(TaskTreeViewItem item, uint taskType)
public void SetItemData(TaskTreeViewHolder item, uint taskType)
{
item.SetItemData(taskType);
}
public uint GetItemData(TaskTreeViewItem item)
public uint GetItemData(TaskTreeViewHolder item)
{
if (item == null)
return 0;
return item.GetItemData();
}
public TaskTreeViewItem GetNextSiblingItem(TaskTreeViewItem item)
public TaskTreeViewHolder GetNextSiblingItem(TaskTreeViewHolder item)
{
if (m_aTreeViewItems == null)
{
m_aTreeViewItems = GetComponentsInChildren<TaskTreeViewItem>(true);
m_aTreeViewItems = GetComponentsInChildren<TaskTreeViewHolder>(true);
}
for (int i = 0; i < m_aTreeViewItems.Length - 1; i++)
@@ -54,24 +57,13 @@ namespace BrewMonster.Scripts.Task.UI
return null;
}
public TaskTreeViewItem InsertItem(string text, TaskTreeViewItem pParent, TaskTreeViewItem pAfter)
public TaskTreeViewHolder InsertItem(string text, TaskTreeViewHolder pParent, TaskTreeViewHolder pAfter)
{
//caculate treelevel first
int treeLevel = pParent != null ? pParent.GetTreeLevel() + 1 : 0;
// Create a new item GameObject and component
TaskTreeViewItem pItem = null;
switch (treeLevel)
{
case 0:
pItem = Instantiate(m_pTreeItemPrefab_Deep1);
break;
case 1:
pItem = Instantiate(m_pTreeItemPrefab_Deep2);
break;
default:
pItem = Instantiate(m_pTreeItemPrefab_Deep3);
break;
}
TaskTreeViewHolder pItem = Instantiate(m_pTreeViewHolder);
if(pParent != null)
{
pParent.SetLastItem(false);
@@ -103,10 +95,10 @@ namespace BrewMonster.Scripts.Task.UI
pItem.SetTreeLevel(treeLevel);
// Refresh local cache of items
m_aTreeViewItems = GetComponentsInChildren<TaskTreeViewItem>(true);
m_aTreeViewItems = GetComponentsInChildren<TaskTreeViewHolder>(true);
// pParent.RefreshLayout();
if(pParent) pParent.SetExpand(false); // Collapse parent to show new item only when expanded
if(pParent) pParent.OnExpand(false); // Collapse parent to show new item only when expanded
return pItem;
}
@@ -116,7 +108,7 @@ namespace BrewMonster.Scripts.Task.UI
List<Transform> childrenCopy = new();
foreach (Transform child in transform)
{
// Destroy(child.GetComponent<TaskTreeViewItem>());
// Destroy(child.GetComponent<TaskTreeViewHolder>());
childrenCopy.Add(child);
}
@@ -127,18 +119,18 @@ namespace BrewMonster.Scripts.Task.UI
}
m_aTreeViewItems = null;
// m_aTreeViewItems = GetComponentsInChildren<TaskTreeViewItem>(true);
// m_aTreeViewItems = GetComponentsInChildren<TaskTreeViewHolder>(true);
_currentSelectedItem = null;
}
public TaskTreeViewItem GetItemByData(uint taskType)
public TaskTreeViewHolder GetItemByData(uint taskType)
{
if (m_aTreeViewItems == null)
{
m_aTreeViewItems = new TaskTreeViewItem[this.transform.childCount];
m_aTreeViewItems = GetComponentsInChildren<TaskTreeViewItem>(true);
m_aTreeViewItems = new TaskTreeViewHolder[this.transform.childCount];
m_aTreeViewItems = GetComponentsInChildren<TaskTreeViewHolder>(true);
}
foreach (var item in m_aTreeViewItems)
@@ -152,12 +144,12 @@ namespace BrewMonster.Scripts.Task.UI
return null;
}
public TaskTreeViewItem GetFirstChild()
public TaskTreeViewHolder GetFirstChild()
{
return transform.childCount == 0 ? null : transform.GetChild(0).GetComponent<TaskTreeViewItem>();
return transform.childCount == 0 ? null : transform.GetChild(0).GetComponent<TaskTreeViewHolder>();
}
public TaskTreeViewItem GetSelectedItem()
public TaskTreeViewHolder GetSelectedItem()
{
return _currentSelectedItem;
}
@@ -170,11 +162,39 @@ namespace BrewMonster.Scripts.Task.UI
public void RefreshLayout()
{
var parent = GetComponent<RectTransform>();
var parent = _rectTransform;
foreach(var child in GetComponentsInChildren<TaskTreeViewHolder>(true))
{
child.RefreshSelf();
}
// Force Unity to rebuild layout immediately
parent.ForceUpdateRectTransforms();
LayoutRebuilder.ForceRebuildLayoutImmediate(parent);
Debug.Log($"[TaskTreeView] RefreshLayout");
}
/// <summary>
/// Resolve all prefabs after quest loading is complete
/// This should be called after all items are added and SetLastItem() calls are done
/// 在任务加载完成后解析所有预制体
/// 这应该在所有项目添加完成且SetLastItem()调用完成后调用
/// </summary>
public void ResolveAllPrefabs()
{
// Refresh cache to get all items
m_aTreeViewItems = GetComponentsInChildren<TaskTreeViewHolder>(true);
if (m_aTreeViewItems == null) return;
// Resolve prefab for each item
foreach (var item in m_aTreeViewItems)
{
if (item != null)
{
item.ResolvePrefab();
item.RefreshSelf();
}
}
}
}
@@ -0,0 +1,154 @@
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;
namespace BrewMonster.Scripts.Task.UI
{
public class TaskTreeViewHolder : MonoBehaviour,IRefreshLayout
{
[SerializeField] private TaskTreeViewItem m_pTreeItemPrefab_Deep1;
[SerializeField] private TaskTreeViewItem m_pTreeItemPrefab_Deep2;
[SerializeField] private TaskTreeViewItem m_pTreeItemPrefab_Deep3;
private TaskTreeViewItem _pTreeItemPrefab_Root;
[Header("DEBUG")]
[SerializeField] private uint m_uItemData;
[SerializeField] private int _treeLevel =999;
public bool isLastItem = true;
public Color _itemTextColor;
public string _itemText;
public bool _expand;
private RectTransform _rectTransform;
private void Awake()
{
_rectTransform = GetComponent<RectTransform>();
}
public void ResolvePrefab()
{
// Guard: prevent multiple calls to avoid duplicate prefab instances
// 防护:防止多次调用以避免重复的预制体实例
if (_pTreeItemPrefab_Root != null)
{
return;
}
if(isLastItem)
{
_pTreeItemPrefab_Root = Instantiate(m_pTreeItemPrefab_Deep3,transform);
}
else if(_treeLevel == 0)
{
_pTreeItemPrefab_Root = Instantiate(m_pTreeItemPrefab_Deep1,transform);
}
else
{
_pTreeItemPrefab_Root = Instantiate(m_pTreeItemPrefab_Deep2,transform);
}
_pTreeItemPrefab_Root.OnClick.AddListener(OnBtnClick);
_pTreeItemPrefab_Root.OnExpand.AddListener(OnExpand);
_pTreeItemPrefab_Root.transform.SetAsFirstSibling();
// Apply stored text and color to the prefab after creation
// 创建后应用存储的文本和颜色到预制体
if (!string.IsNullOrEmpty(_itemText))
{
_pTreeItemPrefab_Root.SetItemText(_itemText);
}
if (_itemTextColor != default(Color))
{
_pTreeItemPrefab_Root.SetItemTextColor(_itemTextColor);
}
_pTreeItemPrefab_Root.RefreshSelf();
}
public void SetItemData(uint uItemData)
{
m_uItemData = uItemData;
gameObject.name = $"Task_{uItemData}";
}
public uint GetItemData()
{
return m_uItemData;
}
public void SetItemTextColor(Color color)
{
_itemTextColor = color;
// Apply to prefab if it exists
// 如果预制体存在,则应用颜色
if (_pTreeItemPrefab_Root != null)
{
_pTreeItemPrefab_Root.SetItemTextColor(color);
}
}
public void SetLastItem(bool isLastItem)
{
this.isLastItem = isLastItem;
}
public void SetItemText(string text)
{
_itemText = text;
// Apply to prefab if it exists
// 如果预制体存在,则应用文本
if (_pTreeItemPrefab_Root != null)
{
_pTreeItemPrefab_Root.SetItemText(text);
}
}
public void SetTreeLevel(int level)
{
_treeLevel = level;
}
public int GetTreeLevel() => _treeLevel;
public void OnExpand(bool expand)
{
var children = GetComponentsInChildren<TaskTreeViewHolder>(true);
for (int i=1; i<children.Length; i++)
{
if(children[i].GetTreeLevel() == _treeLevel + 1)
{
children[i].gameObject.SetActive(expand);
}
}
}
public void RefreshLayout()
{
var rectTransform = _rectTransform;
if (rectTransform == null)
{
return;
}
Debug.Log($"[TaskTreeViewHolder] RefreshLayout");
foreach(var child in GetComponentsInChildren<TaskTreeViewHolder>(true))
{
child.RefreshSelf();
}
if (transform.parent &&
transform.parent.TryGetComponent<IRefreshLayout>(out var refreshLayout))
{
refreshLayout.RefreshLayout();
}
}
public void RefreshSelf()
{
var rectTransform = _rectTransform;
if (rectTransform == null)
{
return;
}
rectTransform.ForceUpdateRectTransforms();
LayoutRebuilder.ForceRebuildLayoutImmediate(rectTransform);
_pTreeItemPrefab_Root.RefreshSelf();
}
void OnBtnClick()
{
EventBus.Publish(new TaskItemClickEvent() { Data = m_uItemData });
Debug.Log($"[TaskTreeViewItem] OnBtnClick: {m_uItemData}");
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: dfe78f833120b411d915fcd9c9793515
@@ -12,28 +12,19 @@ namespace BrewMonster.Scripts.Task.UI
[SerializeField] private TextOutlet m_text;
[SerializeField] private Button m_Button;
[SerializeField] private Toggle _expandToggle;
[SerializeField] private TextOutlet _expandText;
[SerializeField] private LayoutElement _space;
[SerializeField] private Image _expandBG;
[SerializeField] private Sprite ExpandBGActive;
[SerializeField] private Sprite ExpandBGInactive;
[Header("DEBUG")]
[SerializeField] private uint m_uItemData;
[SerializeField] private int _treeLevel;
private RectTransform _rectTransform;
public bool isLastItem = true;
public UnityEvent<uint> OnClick = new UnityEvent<uint>();
[SerializeField] private RectTransform _rectTransform;
public UnityEvent OnClick = new UnityEvent();
public UnityEvent<bool> OnExpand = new UnityEvent<bool>();
#region UNITY_METHODS
private void Awake()
{
m_Button.onClick.AddListener(OnBtnClick);
//_expandButton.onClick.AddListener(OnExpandBtnClicked);
//_collapseButton.onClick.AddListener(OnCollapseBtnClicked);
// _expandButton.gameObject.SetActive(false);
// _collapseButton.gameObject.SetActive(false);
m_Button.onClick.AddListener(OnClick.Invoke);
_expandToggle.onValueChanged.AddListener(SetExpand);
_rectTransform = GetComponent<RectTransform>();
}
@@ -54,35 +45,25 @@ namespace BrewMonster.Scripts.Task.UI
public void SetItemData(uint uItemData)
{
m_uItemData = uItemData;
gameObject.name = $"Task_{uItemData}";
}
public uint GetItemData()
{
return m_uItemData;
}
public void SetItemTextColor(Color color)
{
if (m_text != null)
{
m_text.SetColor(color);
_expandText.SetColor(color);
}
}
public void SetLastItem(bool isLastItem)
{
this.isLastItem = isLastItem;
if(isLastItem)
{
_expandText.Set("●"); // thís not show in tmp text
_expandToggle.onValueChanged.RemoveAllListeners();
}
else
{
_expandText.Set("+");
_expandToggle.onValueChanged.AddListener(OnExpandToggleValueChanged);
}
}
@@ -94,27 +75,15 @@ namespace BrewMonster.Scripts.Task.UI
}
}
public void SetTreeLevel(int level)
{
_treeLevel = level;
_space.preferredWidth = level * 40;
}
public int GetTreeLevel() => _treeLevel;
public void SetExpand(bool expand)
{
var children = GetComponentsInChildren<TaskTreeViewItem>(true);
for (int i=1; i<children.Length; i++)
{
if(children[i].GetTreeLevel() == _treeLevel + 1)
children[i].gameObject.SetActive(expand);
}
_expandBG.sprite = expand ? ExpandBGActive : ExpandBGInactive;
//_expandButton.gameObject.SetActive(!expand);
//_collapseButton.gameObject.SetActive(expand);
//RefreshLayout();
Debug.Log($"[TaskTreeViewItem] RefreshLayout: {expand}");
OnExpand.Invoke(expand);
RefreshLayout();
}
@@ -129,51 +98,26 @@ namespace BrewMonster.Scripts.Task.UI
public void RefreshLayout()
{
var rectTransform = _rectTransform;
if (rectTransform == null)
{
return;
}
// Force Unity to rebuild layout immediately
rectTransform.ForceUpdateRectTransforms();
LayoutRebuilder.ForceRebuildLayoutImmediate(rectTransform);
if (transform.parent &&
transform.parent.TryGetComponent<IRefreshLayout>(out var refreshLayout))
{
refreshLayout.RefreshLayout();
}
}
void OnBtnClick()
public void RefreshSelf()
{
OnClick.Invoke(m_uItemData);
EventBus.Publish(new TaskItemClickEvent() { Data = m_uItemData });
Debug.Log($"[TaskTreeViewItem] OnBtnClick: {m_uItemData}");
}
void OnExpandBtnClicked()
{
SetExpand(expand: true);
}
void OnCollapseBtnClicked()
{
SetExpand(false);
var rectTransform = _rectTransform;
if (rectTransform == null)
{
return;
}
rectTransform.ForceUpdateRectTransforms();
LayoutRebuilder.ForceRebuildLayoutImmediate(rectTransform);
}
void OnExpandToggleValueChanged(bool isOn)
{
SetExpand(isOn);
if(isOn)
{
_expandText.Set("-");
}
else
{
_expandText.Set("+");
}
}
}
@@ -23,7 +23,7 @@ namespace BrewMonster.UI
public virtual void Show(bool value)
{
BMLogger.LogError("AUIDialog::Show() not implemented i n gameObject.SetActive = " + value);
//BMLogger.LogError("AUIDialog::Show() not implemented i n gameObject.SetActive = " + value);
gameObject.SetActive(value);
m_bShow = value;
OnShowDialogue();
@@ -53,7 +53,6 @@ public class SubTypeButton : MonoBehaviour
public void SetAllButton(ShopUIManager manager)
{
Debug.Log("SetAllButton: Tat ca");
subTypeText.text = "Tat ca";
subTypeName = ""; // Empty for "All" button
shopUIManager = manager;
@@ -64,6 +64,14 @@ namespace BrewMonster
m_pCur += sizeof(short);
return value;
}
public ulong ReadULong()
{
BoundCheck(sizeof(ulong));
ulong value = System.BitConverter.ToUInt64(data, m_pCur);
m_pCur += sizeof(ulong);
return value;
}
public ushort ReadUShort()
{
BoundCheck(sizeof(ushort));