@@ -1,5 +1,6 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using DG.Tweening;
|
||||
using Ichni.RhythmGame;
|
||||
@@ -160,6 +161,124 @@ namespace Ichni.Editor
|
||||
EditorManager.instance.uiManager.inspector.SetInspector(connectedGameElement);
|
||||
|
||||
}
|
||||
public void MoveTab(bool isUp)
|
||||
{
|
||||
// 1. 基础合法性检查:根节点或孤立节点无法移动
|
||||
if (parentTab == null || connectedGameElement.parentElement == null)
|
||||
return;
|
||||
|
||||
// 获取当前层级的列表
|
||||
var tabList = parentTab.childTabList;
|
||||
int tabIndex = tabList.IndexOf(this);
|
||||
var elementList = connectedGameElement.parentElement.childElementList;
|
||||
int elemIndex = elementList.IndexOf(connectedGameElement);
|
||||
|
||||
// 计算目标索引
|
||||
int targetTabIndex = isUp ? tabIndex - 1 : tabIndex + 1;
|
||||
int targetElemIndex = isUp ? elemIndex - 1 : elemIndex + 1;
|
||||
|
||||
// 2. 边界检查:如果是第一个往上或最后一个往下,则返回
|
||||
if (targetTabIndex < 0 || targetTabIndex >= tabList.Count) return;
|
||||
if (targetElemIndex < 0 || targetElemIndex >= elementList.Count) return;
|
||||
|
||||
// 获取目标对象
|
||||
var targetTab = tabList[targetTabIndex];
|
||||
var targetElem = elementList[targetElemIndex];
|
||||
|
||||
// 3. 交换逻辑数据顺序(List 内部排序)
|
||||
tabList[tabIndex] = targetTab;
|
||||
tabList[targetTabIndex] = this;
|
||||
|
||||
elementList[elemIndex] = targetElem;
|
||||
elementList[targetElemIndex] = connectedGameElement;
|
||||
|
||||
// 4. 处理 UI Tab 的 Sibling Index(解决偏移问题的核心)
|
||||
List<Transform> thisSubTree = GetTabSubTreeTransforms(this);
|
||||
List<Transform> targetSubTree = GetTabSubTreeTransforms(targetTab);
|
||||
|
||||
if (thisSubTree.Count > 0 && targetSubTree.Count > 0)
|
||||
{
|
||||
if (isUp)
|
||||
{
|
||||
// 向上移:正序,插到目标分支的最上方
|
||||
int insertIndex = targetSubTree[0].GetSiblingIndex();
|
||||
for (int i = 0; i < thisSubTree.Count; i++)
|
||||
{
|
||||
thisSubTree[i].SetSiblingIndex(insertIndex + i);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// 向下移:逆序,依次插到目标分支最末尾的索引位置
|
||||
// 这样先移过去的会被后移过去的顶到后面,保持原有父子相对顺序
|
||||
int targetLastIndex = targetSubTree[targetSubTree.Count - 1].GetSiblingIndex();
|
||||
for (int i = thisSubTree.Count - 1; i >= 0; i--)
|
||||
{
|
||||
thisSubTree[i].SetSiblingIndex(targetLastIndex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 5. 处理场景 GameElement 的 Sibling Index(同理)
|
||||
List<Transform> thisElemSubTree = GetElementSubTreeTransforms(connectedGameElement);
|
||||
List<Transform> targetElemSubTree = GetElementSubTreeTransforms(targetElem);
|
||||
|
||||
if (thisElemSubTree.Count > 0 && targetElemSubTree.Count > 0)
|
||||
{
|
||||
if (isUp)
|
||||
{
|
||||
int insertIndex = targetElemSubTree[0].GetSiblingIndex();
|
||||
for (int i = 0; i < thisElemSubTree.Count; i++)
|
||||
{
|
||||
thisElemSubTree[i].SetSiblingIndex(insertIndex + i);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int targetLastIndex = targetElemSubTree[targetElemSubTree.Count - 1].GetSiblingIndex();
|
||||
for (int i = thisElemSubTree.Count - 1; i >= 0; i--)
|
||||
{
|
||||
thisElemSubTree[i].SetSiblingIndex(targetLastIndex);
|
||||
}
|
||||
}
|
||||
}
|
||||
//奇妙的特判阶段
|
||||
foreach (var i in parentTab.childTabList)
|
||||
{
|
||||
i.connectedGameElement.Refresh();
|
||||
}
|
||||
parentTab.connectedGameElement.Refresh();
|
||||
|
||||
if (parentTab.connectedGameElement is Track track)
|
||||
{
|
||||
track.trackPathSubmodule.pathNodeList =
|
||||
track.childElementList.OfType<PathNode>().ToList();
|
||||
track.trackPathSubmodule.SetPathPoints();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
// 获取tab及其所有子tab的transform(前序遍历)
|
||||
private List<Transform> GetTabSubTreeTransforms(HierarchyTab tab)
|
||||
{
|
||||
List<Transform> list = new List<Transform>();
|
||||
list.Add(tab.transform);
|
||||
foreach (var child in tab.childTabList)
|
||||
list.AddRange(GetTabSubTreeTransforms(child));
|
||||
return list;
|
||||
}
|
||||
|
||||
// 获取GameElement及其所有子元素的transform(前序遍历)
|
||||
private List<Transform> GetElementSubTreeTransforms(GameElement element)
|
||||
{
|
||||
List<Transform> list = new List<Transform>();
|
||||
if (element.transform != null)
|
||||
list.Add(element.transform);
|
||||
foreach (var child in element.childElementList)
|
||||
list.AddRange(GetElementSubTreeTransforms(child));
|
||||
return list;
|
||||
}
|
||||
public void ExpandOrFold()
|
||||
{
|
||||
ExpandOrFold(false);
|
||||
|
||||
Reference in New Issue
Block a user