最近遇到一个需求,需要快速获取一个GameObject在Hierarchy面板中的路径。在谷歌上左搜右搜,就是找不到,使用的关键词是Hierarchy、GameObject、Path、Relationship等。后来想起来,前几天在宣雨松的微博上看到一个小Tip,附上链接,再次感谢雨松大大。
这几行代码,写到一个Editor文件中,就可以在鼠标选中某个游戏对象时,打印出它的路径,Let me show you the code!
using UnityEngine;
using UnityEditor;
using System.Collections;
public class ToolKit : EditorWindow {
// Use this for initialization
[InitializeOnLoadMethod]
static void Start () {
Selection.selectionChanged = delegate {
Debug.Log(Selection.activeGameObject.transform.GetPath());
//这里我做了改动
};
}
}
紫薇请等一下!=ε=ε=ε=┏(゜ロ゜;)┛
为什么我这里没有GetPath()
函数呀?
嚯嚯嚯,这个是我的扩展啦!
我曾经大量使用枚举的扩展函数,比如我需要用枚举定义所有的技能,每个技能有一个名称,我一般写成扩展。
public enum Skill{
Fuck
}
static class SkillMethods{
public static string GetName(this Skill type){
return "我干";
}
}
这样我需要的时候,直接用Skill.Fuck.GetName()
就可以啦,我自己觉得蛮方便的……可维护性很强。
那么再来看下GetPath
函数的需求,虽然Transform不能获取路径,但是可以找到父节点,还可以找到root,这就很方便啦,只要从底向上,把所有名字用\连接起来就可以了~自己动手丰衣足食呐!
上代码!
public static class TransformExtension {
public static string GetPath(this Transform trans){
Transform current = trans;
StringBuilder path = new StringBuilder(current.name);
while(true){
if(current != trans.root){
current = current.parent;
path.Insert(0, current.name + "/");
}else{
break;
}
}
return path.ToString();
}
}
有几个地方需要解释给第一次写扩展的人说说。
扩展的格式就是如此,组件名加上Extension后缀,和枚举的扩展方法不同。里面的函数名、变量之类的,也要按照我代码中的格式来写。
StringBuilder是推荐的字符串拼接方式,需要
using System.Text;
,可以提升字符串拼接性能,如果大量操作,用+号可能会有卡顿哦~我这里虽然没有大量操作,但是为了使用Insert函数就用了StringBuilder。Insert这里是为了将父节点的名字,插在路径前面,因为我们是从底向上找,但是最终结果需要的是父节点在前,子节点在后的字符串。
用一个指针指向当前节点,如果不是根节点,那么将父节点指向为当前节点,并拼接名字,然后用循环一直找到root节点为止。
就酱!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。