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(); } 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(true); for (int i=1; i(true)) { child.RefreshSelf(); } if (transform.parent && transform.parent.TryGetComponent(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}"); } } }