如何递归获取每个项目的级别?
How to get the levels for each item recursive?
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEditorInternal;
using UnityEngine;
public class GetChildsEditorWindow : EditorWindow
{
public Transform transform;
int levelsMin = 3, levelsMax = 4;
static int currentLevel;
List<Transform> allChildren = new List<Transform>();
static int oldLevel = 0;
Vector2 scrollPos;
public int levelNum = 0;
public int totalLevels = 0;
// Add menu named "My Window" to the Window menu
[MenuItem("Get Childs/Get")]
static void Init()
{
oldLevel = currentLevel;
// Get existing open window or if none, make a new one:
GetChildsEditorWindow window = (GetChildsEditorWindow)EditorWindow.GetWindow(typeof(GetChildsEditorWindow), false, "Get Childs");
window.Show();
}
private void OnGUI()
{
GUILayout.Space(20);
transform = EditorGUILayout.ObjectField("Transform to get childs", transform, typeof(Transform), true) as Transform;
EditorGUI.BeginDisabledGroup(transform == null);
currentLevel = (int)EditorGUILayout.Slider("Slider", currentLevel, levelsMin, levelsMax);
EditorGUI.EndDisabledGroup();
if (allChildren != null && allChildren.Count > 0)
{
EditorGUILayout.BeginHorizontal();
scrollPos =
EditorGUILayout.BeginScrollView(scrollPos, GUILayout.Width(400), GUILayout.Height(400));
for (int i = 0; i < allChildren.Count; i++)
{
allChildren[i] = EditorGUILayout.ObjectField("Transform " + i.ToString(), allChildren[i], typeof(Transform), true) as Transform;
}
EditorGUILayout.EndScrollView();
EditorGUILayout.EndHorizontal();
}
if (oldLevel != currentLevel)
{
if (transform != null)
{
allChildren = new List<Transform>();
IterateOverChild(transform, currentLevel, levelsMax);
oldLevel = currentLevel;
}
}
if(GUILayout.Button("GEt it"))
{
IterateOverChild(transform, 1);
Debug.Log(currentLevel);
}
}
public void IterateOverChild(Transform original, int currentLevel, int maxLevel)
{
if (currentLevel > maxLevel) return;
for (var i = 0; i < original.childCount; i++)
{
Debug.Log($"{original.GetChild(i)}");
allChildren.Add(original.GetChild(i));
IterateOverChild(original.GetChild(i), currentLevel + 1, maxLevel);
}
}
public void IterateOverChild(Transform original, int currentLevel)
{
for (var i = 0; i < original.childCount; i++)
{
Debug.Log($"{original.GetChild(i)}");
allChildren.Add(original.GetChild(i));
IterateOverChild(original.GetChild(i), currentLevel + 1);
}
}
}
我想自动获取每个对象的所有关卡深度并在编辑器中显示它window。
例如:
Object 1 is at level 0
Onject 2 is at level 3
Object 3 is at level 0
但我遇到了一些问题:
代码现在第二个方法IterateOverChild显示在最后3层总共但是有4层。以及如何显示每个对象他所在的级别?
在屏幕截图中红色箭头为 1 级绿色箭头为 2 级黄色 3 级和蓝色 4 级:
我在第 1 级看到两个游戏对象 GameObject 和 GameObject (1),然后在第 2 级看到 2 个游戏对象,在第 3 级看到两个对象,最后一个在第 4 级。这就是我对关卡逻辑的看法。
我想更新 ui 编辑器 window 面板,其中包含对象和每个对象在每个对象附近的级别,以显示级别编号。 (我给对象命名为 Level 1 Level 2 Level 3 Level 4 只是为了用我对级别的逻辑来命名它们)。
如何获取任何变换的级别?
这个方法完全显示了水平。只需将所需的转换放入参数中即可:
public static int ObjectLevel(Transform current, int level = 0)
{
if (current.parent) return ObjectLevel(current.parent, ++level);
return level;
}
一行类似的方法:
public static int ObjectLevel(Transform current, int level = 0) => current.parent ? ObjectLevel(current.parent, ++level) : level;
一个例子...
这里显示所有游戏对象的等级:
public void Start()
{
foreach (var _transform in GameObject.FindObjectsOfType<Transform>())
{
var level = ObjectLevel(_transform);
_transform.name += ", level: " + level;
}
}
结果:
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEditorInternal;
using UnityEngine;
public class GetChildsEditorWindow : EditorWindow
{
public Transform transform;
int levelsMin = 3, levelsMax = 4;
static int currentLevel;
List<Transform> allChildren = new List<Transform>();
static int oldLevel = 0;
Vector2 scrollPos;
public int levelNum = 0;
public int totalLevels = 0;
// Add menu named "My Window" to the Window menu
[MenuItem("Get Childs/Get")]
static void Init()
{
oldLevel = currentLevel;
// Get existing open window or if none, make a new one:
GetChildsEditorWindow window = (GetChildsEditorWindow)EditorWindow.GetWindow(typeof(GetChildsEditorWindow), false, "Get Childs");
window.Show();
}
private void OnGUI()
{
GUILayout.Space(20);
transform = EditorGUILayout.ObjectField("Transform to get childs", transform, typeof(Transform), true) as Transform;
EditorGUI.BeginDisabledGroup(transform == null);
currentLevel = (int)EditorGUILayout.Slider("Slider", currentLevel, levelsMin, levelsMax);
EditorGUI.EndDisabledGroup();
if (allChildren != null && allChildren.Count > 0)
{
EditorGUILayout.BeginHorizontal();
scrollPos =
EditorGUILayout.BeginScrollView(scrollPos, GUILayout.Width(400), GUILayout.Height(400));
for (int i = 0; i < allChildren.Count; i++)
{
allChildren[i] = EditorGUILayout.ObjectField("Transform " + i.ToString(), allChildren[i], typeof(Transform), true) as Transform;
}
EditorGUILayout.EndScrollView();
EditorGUILayout.EndHorizontal();
}
if (oldLevel != currentLevel)
{
if (transform != null)
{
allChildren = new List<Transform>();
IterateOverChild(transform, currentLevel, levelsMax);
oldLevel = currentLevel;
}
}
if(GUILayout.Button("GEt it"))
{
IterateOverChild(transform, 1);
Debug.Log(currentLevel);
}
}
public void IterateOverChild(Transform original, int currentLevel, int maxLevel)
{
if (currentLevel > maxLevel) return;
for (var i = 0; i < original.childCount; i++)
{
Debug.Log($"{original.GetChild(i)}");
allChildren.Add(original.GetChild(i));
IterateOverChild(original.GetChild(i), currentLevel + 1, maxLevel);
}
}
public void IterateOverChild(Transform original, int currentLevel)
{
for (var i = 0; i < original.childCount; i++)
{
Debug.Log($"{original.GetChild(i)}");
allChildren.Add(original.GetChild(i));
IterateOverChild(original.GetChild(i), currentLevel + 1);
}
}
}
我想自动获取每个对象的所有关卡深度并在编辑器中显示它window。
例如:
Object 1 is at level 0
Onject 2 is at level 3
Object 3 is at level 0
但我遇到了一些问题:
代码现在第二个方法IterateOverChild显示在最后3层总共但是有4层。以及如何显示每个对象他所在的级别?
在屏幕截图中红色箭头为 1 级绿色箭头为 2 级黄色 3 级和蓝色 4 级:
我在第 1 级看到两个游戏对象 GameObject 和 GameObject (1),然后在第 2 级看到 2 个游戏对象,在第 3 级看到两个对象,最后一个在第 4 级。这就是我对关卡逻辑的看法。
我想更新 ui 编辑器 window 面板,其中包含对象和每个对象在每个对象附近的级别,以显示级别编号。 (我给对象命名为 Level 1 Level 2 Level 3 Level 4 只是为了用我对级别的逻辑来命名它们)。
如何获取任何变换的级别?
这个方法完全显示了水平。只需将所需的转换放入参数中即可:
public static int ObjectLevel(Transform current, int level = 0)
{
if (current.parent) return ObjectLevel(current.parent, ++level);
return level;
}
一行类似的方法:
public static int ObjectLevel(Transform current, int level = 0) => current.parent ? ObjectLevel(current.parent, ++level) : level;
一个例子...
这里显示所有游戏对象的等级:
public void Start()
{
foreach (var _transform in GameObject.FindObjectsOfType<Transform>())
{
var level = ObjectLevel(_transform);
_transform.name += ", level: " + level;
}
}