[聚合文章] 为Unity组件编写扩展

c# 2016-01-25 4 阅读

最近遇到一个需求,需要快速获取一个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();
    }
}

有几个地方需要解释给第一次写扩展的人说说。

  1. 扩展的格式就是如此,组件名加上Extension后缀,和枚举的扩展方法不同。里面的函数名、变量之类的,也要按照我代码中的格式来写。

  2. StringBuilder是推荐的字符串拼接方式,需要using System.Text;,可以提升字符串拼接性能,如果大量操作,用+号可能会有卡顿哦~我这里虽然没有大量操作,但是为了使用Insert函数就用了StringBuilder。

  3. Insert这里是为了将父节点的名字,插在路径前面,因为我们是从底向上找,但是最终结果需要的是父节点在前,子节点在后的字符串。

  4. 用一个指针指向当前节点,如果不是根节点,那么将父节点指向为当前节点,并拼接名字,然后用循环一直找到root节点为止。

就酱!

注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。