Unity 自动生成代码工具(包括定义和获取)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/n_moling/article/details/80913556

        前几天偶然在朋友那看到一个人写了这么一个功能,就尝试着自己做了下,可以生成当前选中物体的定义和路径获取代码到剪切板。

详细代码如下:

/************************************************************
  FileName: MyHierarchyMenu.cs
  Author:末零       Version :1.0          Date: 2018-7-4
  Description:代码生成插件
************************************************************/
using UnityEditor;
using UnityEngine;

public class MyHierarchyMenu: MonoBehaviour {

    private static string str;

    [MenuItem("MyTools/GameObject")]
    static void SetGameObject()
    {
        SetName("GameObject", "obj_");
    }

    [MenuItem("MyTools/Transform")]
    static void SetTransform()
    {
        SetName("Transform", "tra_");
    }

    [MenuItem("MyTools/Button")]
    static void SetButton()
    {
        SetName("Button", "btn_");
    }

    [MenuItem("MyTools/Text")]
    static void SetText()
    {
        SetName("Text", "tex_");
    }

    [MenuItem("MyTools/Image")]
    static void SetImage()
    {
        SetName("Image", "img_");
    }

    [MenuItem("MyTools/Input Field")]
    static void SetInputField()
    {
        SetName("InputField", "ipt_");
    }

    /// <summary>
    /// 取得要定义的组件
    /// </summary>
    /// <param name="name">组件类型名</param>
    /// <param name="prefix">前缀</param>
    static void SetName(string name, string prefix)
    {
        str = "";
        Transform[] transforms = Selection.transforms;
    
        foreach (Transform item in transforms)
        {
            str += "private " + name + " " + prefix + item.name.Replace(" ", "") + ";\n";
        }

        foreach (Transform item in transforms)
        {
            str += "//" + prefix + item.name.Replace(" ", "") + " = " + "GameObject.Find(\"" + GetPath(item) + "\");\n";
        }

        TextEditor te = new TextEditor();
        te.text = str;
        te.OnFocus();
        te.Copy();
    }

    /// <summary>
    /// 获取路径
    /// </summary>
    /// <param name="tra">所选物体</param>
    /// <returns>路径</returns>
    static string GetPath(Transform tra)
    {
        string path = tra.name;

        while (tra.parent != null)
        {
            path = tra.parent.name + "/" + path;
            tra = tra.parent;
        }

        return path;
    }

    [InitializeOnLoadMethod]
    static void StartInitializeOnLoadMethod()
    {
        EditorApplication.hierarchyWindowItemOnGUI += OnHierarchyGUI;
    }

    static void OnHierarchyGUI(int instanceID, Rect selectionRect)
    {
        if (!Event.current.alt)
            return;

        if (Event.current != null && selectionRect.Contains(Event.current.mousePosition)
            && Event.current.button == 1 && Event.current.type <= EventType.mouseUp)
        {
            GameObject selectedGameObject = EditorUtility.InstanceIDToObject(instanceID) as GameObject;
            //这里可以判断selectedGameObject的条件
            if (selectedGameObject)
            {
                Vector2 mousePosition = Event.current.mousePosition;
                EditorUtility.DisplayPopupMenu(new Rect(mousePosition.x, mousePosition.y, 0, 0), "MyTools", null);
                Event.current.Use();
            }
        }
    }
}

特别说明:        

        右键生成菜单部分参考雨松大佬的教程(点击打开链接

        因为没有找到相关扩展右键菜单的功能,所以直接用的雨松大佬的代码新建,对此,关于与原有菜单冲突问题,采用alt按键规避,具体见代码。

猜你喜欢

转载自blog.csdn.net/n_moling/article/details/80913556