版权声明:本文为博主原创文章,未经博主允许不得转载。 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按键规避,具体见代码。