2025-09-08 14:51:28 +08:00
|
|
|
|
using SuperTreeView;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using System.Xml.Serialization;
|
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
using UnityEngine.UI;
|
|
|
|
|
|
using ZXKFramework;
|
2025-09-08 17:37:12 +08:00
|
|
|
|
namespace DongWuYiXue.DaoNiaoShu
|
2025-09-08 14:51:28 +08:00
|
|
|
|
{
|
|
|
|
|
|
public class TData_R
|
|
|
|
|
|
{
|
|
|
|
|
|
public List<TData_1> data_1s = new();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public class TData_1
|
|
|
|
|
|
{
|
|
|
|
|
|
public List<TData_2> data_2s = new();
|
|
|
|
|
|
public string name;
|
|
|
|
|
|
public string data;
|
|
|
|
|
|
}
|
|
|
|
|
|
public class TData_2
|
|
|
|
|
|
{
|
|
|
|
|
|
public string name;
|
|
|
|
|
|
public string data;
|
|
|
|
|
|
}
|
|
|
|
|
|
public class TreeViewPanel : UIBase
|
|
|
|
|
|
{
|
|
|
|
|
|
public override string GroupName => "TreeViewPanel";
|
|
|
|
|
|
public override string Name => "TreeViewPanel";
|
|
|
|
|
|
|
|
|
|
|
|
public TreeView mTreeView;
|
|
|
|
|
|
int mCurSelectedItemId = 0;
|
|
|
|
|
|
UIDynamicMover uIDynamicMover;
|
|
|
|
|
|
public ScrollRect scrollRect;
|
|
|
|
|
|
//Action<string> onclick;
|
|
|
|
|
|
bool isDestroy;
|
|
|
|
|
|
public override void Init(IUIManager uictrl)
|
|
|
|
|
|
{
|
|
|
|
|
|
base.Init(uictrl);
|
|
|
|
|
|
scrollRect = transform.FindFirst<ScrollRect>("TreeScrollView");
|
|
|
|
|
|
mTreeView = transform.FindFirst<TreeView>("TreeView");
|
|
|
|
|
|
uIDynamicMover = transform.FindFirst<UIDynamicMover>("arrBtn");
|
|
|
|
|
|
mTreeView.OnItemCustomEvent = OnItemCustomEvent;
|
|
|
|
|
|
mTreeView.OnItemExpandBegin = OnItemExpandBegin;
|
|
|
|
|
|
mTreeView.OnItemCollapseBegin = OnItemCollapseBegin;
|
|
|
|
|
|
}
|
|
|
|
|
|
public void BuildButton(TData_R data_R)
|
|
|
|
|
|
{
|
|
|
|
|
|
//onclick = callBack;
|
|
|
|
|
|
mTreeView.InitView();
|
|
|
|
|
|
foreach (var item1 in data_R.data_1s)
|
|
|
|
|
|
{
|
|
|
|
|
|
TreeViewItem t1 = mTreeView.AppendItem("ItemPrefab1");
|
|
|
|
|
|
t1.GetComponent<ItemPrefab1>().SetItemInfo(item1.name, item1.data);
|
|
|
|
|
|
foreach (var item2 in item1.data_2s)
|
|
|
|
|
|
{
|
|
|
|
|
|
TreeViewItem t2 = t1.ChildTree.AppendItem("ItemPrefab2");
|
|
|
|
|
|
t2.GetComponent<ItemPrefab2>().SetItemInfo(item2.name, item2.data);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
mTreeView.CollapseAllItem();
|
|
|
|
|
|
}
|
|
|
|
|
|
private void OnItemCollapseBegin(TreeViewItem item)
|
|
|
|
|
|
{
|
|
|
|
|
|
ItemPrefab1 st = item.GetComponent<ItemPrefab1>();
|
|
|
|
|
|
st.SetExpandStatus(false);
|
|
|
|
|
|
}
|
|
|
|
|
|
private void OnItemExpandBegin(TreeViewItem item)
|
|
|
|
|
|
{
|
|
|
|
|
|
ItemPrefab1 st = item.GetComponent<ItemPrefab1>();
|
|
|
|
|
|
st.SetExpandStatus(true);
|
|
|
|
|
|
}
|
|
|
|
|
|
private void OnItemCustomEvent(TreeViewItem item, SuperTreeView.CustomEvent @event, object arg3)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (GetModel<Main.GameModel>().modeType == ModeType.KaoHe) return;
|
|
|
|
|
|
if (@event == SuperTreeView.CustomEvent.ItemClicked)
|
|
|
|
|
|
{
|
|
|
|
|
|
Debug.Log(arg3);
|
|
|
|
|
|
OnItemSelect(item);
|
|
|
|
|
|
Game.Instance.uiManager.ShowUI<LoadingPanel>();
|
|
|
|
|
|
GameManager.Instance.fsm.PlayClip("<22><><EFBFBD><EFBFBD>");
|
|
|
|
|
|
GameManager.Instance.sceneDataHandler.LoadSceneDataFromJson(GetModel<Main.GameModel>().mainData.folder + "/SaveData/" + (string)arg3 + ".json", () =>
|
|
|
|
|
|
{
|
|
|
|
|
|
GameManager.Instance.fsm.ChangeState((string)arg3);
|
|
|
|
|
|
Game.Instance.uiManager.CloseUI<LoadingPanel>();
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
private void OnItemSelect(TreeViewItem item)
|
|
|
|
|
|
{
|
|
|
|
|
|
ItemPrefab2 st = item.GetComponent<ItemPrefab2>();
|
|
|
|
|
|
if (mCurSelectedItemId > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (item.ItemId == mCurSelectedItemId)
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
TreeViewItem curSelectedItem = mTreeView.GetTreeItemById(mCurSelectedItemId);
|
|
|
|
|
|
if (curSelectedItem != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
curSelectedItem.GetComponent<ItemPrefab2>().IsSelected = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
mCurSelectedItemId = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
st.IsSelected = true;
|
|
|
|
|
|
mCurSelectedItemId = item.ItemId;
|
|
|
|
|
|
}
|
|
|
|
|
|
public void Locate(string name1, string name2)
|
|
|
|
|
|
{
|
|
|
|
|
|
mTreeView.CollapseAllItem();
|
|
|
|
|
|
ItemPrefab1[] itemPrefab1s = mTreeView.GetComponentsInChildren<ItemPrefab1>();
|
|
|
|
|
|
ItemPrefab1 itemPrefab1 = null;
|
|
|
|
|
|
for (int i = 0; i < itemPrefab1s.Length; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (itemPrefab1s[i].TextName.text == name1)
|
|
|
|
|
|
{
|
|
|
|
|
|
Nevigate(itemPrefab1s[i].GetComponent<RectTransform>());
|
|
|
|
|
|
itemPrefab1s[i].GetComponent<TreeViewItem>().Expand();
|
|
|
|
|
|
itemPrefab1s[i].IsSelected = true;
|
|
|
|
|
|
itemPrefab1 = itemPrefab1s[i];
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if (itemPrefab1 != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
ItemPrefab2[] itemPrefab2s = itemPrefab1.GetComponentsInChildren<ItemPrefab2>();
|
|
|
|
|
|
for (int i = 0; i < itemPrefab2s.Length; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (itemPrefab2s[i].TextName.text == name2)
|
|
|
|
|
|
{
|
|
|
|
|
|
OnItemSelect(itemPrefab2s[i].GetComponent<TreeViewItem>());
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
//Nevigate(itemPrefab1s[i].GetComponent<RectTransform>());
|
|
|
|
|
|
}
|
|
|
|
|
|
public void Nevigate(RectTransform item)
|
|
|
|
|
|
{
|
|
|
|
|
|
// InverseTransformPoint: Transforms position from world space to local space, <20><>TransformPoint<6E><74><EFBFBD><EFBFBD><EFBFBD>෴
|
|
|
|
|
|
// <20>ⲽ<EFBFBD><E2B2BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD> item<65><6D>viewport<72><74>localPositionת<6E><D7AA><EFBFBD><EFBFBD>ͬһ<CDAC><D2BB><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5>£<EFBFBD><C2A3><EFBFBD><EFBFBD>ܼ<EFBFBD><DCBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ƶ<EFBFBD><C6B6>IJ<EFBFBD>ֵ
|
|
|
|
|
|
// <20><>ͼ1
|
|
|
|
|
|
Vector3 itemCurrentLocalPostion = scrollRect.GetComponent<RectTransform>().InverseTransformPoint(ConvertLocalPosToWorldPos(item));
|
|
|
|
|
|
Vector3 itemTargetLocalPos = scrollRect.GetComponent<RectTransform>().InverseTransformPoint(ConvertLocalPosToWorldPos(scrollRect.viewport));
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ƶ<EFBFBD><C6B6>ľ<EFBFBD><C4BE><EFBFBD>
|
|
|
|
|
|
Vector3 diff = itemTargetLocalPos - itemCurrentLocalPostion;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>item<65><6D><EFBFBD><EFBFBD>viewport<72><74><EFBFBD><EFBFBD>ʱ verticalNormalizedPosition = 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ horizontalNormalizedPosition = 0<><30><EFBFBD><EFBFBD>ͼ2
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ƶ<EFBFBD><C6B6>ľ<EFBFBD><C4BE><EFBFBD>ռ<EFBFBD>ıȣ<C4B1><C8A3><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ƶ<EFBFBD><C6B6>ľ<EFBFBD><C4BE><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD>ȵİٷֱȣ<D6B1><C8A3><EFBFBD>ͼ3
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> viewport <20><>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD>ʾһ<CABE><D2BB>item<65>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD>dz<EFBFBD><C7B3><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ƫ<EFBFBD>ƣ<EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>verticalNormalizedPosition = 0<><30><EFBFBD><EFBFBD>һ<EFBFBD><D2BB> item <20><><EFBFBD><EFBFBD> viewport<72><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>һ<EFBFBD>ξ<EFBFBD><CEBE><EFBFBD><EFBFBD>ģ<EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>ȥ<EFBFBD><C8A5><EFBFBD>ξ<EFBFBD><CEBE>룬diff.y - offset<65><74><EFBFBD>ټ<EFBFBD><D9BC><EFBFBD> newNormalizedPosition<6F><6E><EFBFBD><EFBFBD>ͼ4
|
|
|
|
|
|
var newNormalizedPosition = new Vector2(
|
|
|
|
|
|
diff.x / (scrollRect.content.GetComponent<RectTransform>().rect.width - scrollRect.viewport.rect.width),
|
|
|
|
|
|
diff.y / (scrollRect.content.GetComponent<RectTransform>().rect.height - scrollRect.viewport.rect.height)
|
|
|
|
|
|
);
|
|
|
|
|
|
// <20><>ʱ normalizedPosition - <20><>Ҫ<EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD>ռ<EFBFBD><D5BC>newNormalizedPosition<6F><6E><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>յ<EFBFBD>λ<EFBFBD><CEBB>normalizedPosition
|
|
|
|
|
|
newNormalizedPosition = scrollRect.GetComponent<ScrollRect>().normalizedPosition - newNormalizedPosition;
|
|
|
|
|
|
|
|
|
|
|
|
newNormalizedPosition.x = Mathf.Clamp01(newNormalizedPosition.x);
|
|
|
|
|
|
newNormalizedPosition.y = Mathf.Clamp01(newNormalizedPosition.y);
|
|
|
|
|
|
// Ҳ<><D2B2><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD>ˮƽ<CBAE><C6BD><EFBFBD><EFBFBD> horizontalNormalizedPosition<6F><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD> verticalNormalizedPosition
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD> normalizedPosition <20><><EFBFBD><EFBFBD>ͬʱ<CDAC><CAB1><EFBFBD><EFBFBD> horizontalNormalizedPosition<6F><6E> verticalNormalizedPosition
|
|
|
|
|
|
// normalizedPosition.x == horizontalNormalizedPosition
|
|
|
|
|
|
// normalizedPosition.y == verticalNormalizedPosition
|
|
|
|
|
|
// normalizedPosition == new Vector2(horizontalNormalizedPosition, verticalNormalizedPosition)
|
|
|
|
|
|
scrollRect.GetComponent<ScrollRect>().normalizedPosition = newNormalizedPosition;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><D0B7><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>type1,scrollview<65><77><EFBFBD><EFBFBD>ʾtype1<65>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>type2<65><32>scrollview<65><77><EFBFBD><EFBFBD>ʾtype2<65>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD>Ҫ<EFBFBD>ڸ<EFBFBD>
|
|
|
|
|
|
// normalizedPosition <20><>ֵǰ<D6B5>ȸ<EFBFBD>ֵ (0, 0)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1> normalizedPosition <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD> type <20>е<EFBFBD>
|
|
|
|
|
|
// normalizedPosition<6F><6E><EFBFBD><EFBFBD><EFBFBD>³<EFBFBD>bug
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Pivot<6F><74>ֵ<EFBFBD><D6B5>Ӱ<EFBFBD>죬Pivot<6F><74><EFBFBD><EFBFBD>(0.5<EFBFBD><EFBFBD>0.5)ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(0.5, 0.5)<29>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD> target.parent.TransformPoint(localPosition)
|
|
|
|
|
|
private Vector3 ConvertLocalPosToWorldPos(RectTransform target)
|
|
|
|
|
|
{
|
|
|
|
|
|
var pivotOffset = new Vector3(
|
|
|
|
|
|
(0.5f - target.pivot.x) * target.rect.size.x,
|
|
|
|
|
|
(0.5f - target.pivot.y) * target.rect.size.y,
|
|
|
|
|
|
0f);
|
|
|
|
|
|
|
|
|
|
|
|
var localPosition = target.localPosition + pivotOffset;
|
|
|
|
|
|
// TransformPoint: Transforms position from local space to world space
|
|
|
|
|
|
return target.parent.TransformPoint(localPosition);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void LockAllBtn()
|
|
|
|
|
|
{
|
|
|
|
|
|
//ItemPrefab1[] itemPrefab1s = mTreeView.GetComponentsInChildren<ItemPrefab1>(true);
|
|
|
|
|
|
//for (int i = 0; i < itemPrefab1s.Length; i++)
|
|
|
|
|
|
//{
|
|
|
|
|
|
// itemPrefab1s[i].LockClick();
|
|
|
|
|
|
//}
|
|
|
|
|
|
ItemPrefab2[] itemPrefab2s = mTreeView.GetComponentsInChildren<ItemPrefab2>(true);
|
|
|
|
|
|
for (int i = 0; i < itemPrefab2s.Length; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
itemPrefab2s[i].LockClick();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void UnLockAllBtn()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (mTreeView == null) return;
|
|
|
|
|
|
ItemPrefab2[] itemPrefab2s = mTreeView.GetComponentsInChildren<ItemPrefab2>(true);
|
|
|
|
|
|
for (int i = 0; i < itemPrefab2s.Length; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
itemPrefab2s[i].UnlockClick();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
private void OnDestroy()
|
|
|
|
|
|
{
|
|
|
|
|
|
isDestroy = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|