当前位置:网站首页>【Unity】编辑器扩展-02-拓展Hierarchy视图
【Unity】编辑器扩展-02-拓展Hierarchy视图
2022-07-31 07:52:00 【韩天衣】
【Unity】编辑器扩展-02-拓展Hierarchy视图
拓展菜单
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class Script_04 : MonoBehaviour
{
//Hierarchy视图菜单本质上是窗体上的GameObject下的子菜单,只需要注意路径即可,同理之前的也是一样Project视图菜单是Asset的子菜单,如果没有已知路径就会自建新根菜单
[MenuItem("GameObject/My Create/Cube",false,0)]
static void CreatePlayer()
{
GameObject.Instantiate(Resources.Load("Prefabs/Cube"));
}
}
拓展布局
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class Script_05
{
[InitializeOnLoadMethod]
static void InitializeOnLoadMethod()
{
EditorApplication.hierarchyWindowItemOnGUI += delegate (int instanceID,Rect selectionRect)
{
if (Selection.activeObject && instanceID == Selection.activeObject.GetInstanceID())
{
float width = 50f;
float height = 15f;
selectionRect.x += (selectionRect.width - width);
selectionRect.width = width;
selectionRect.height = height;
if (GUI.Button(selectionRect, "click"))
{
Debug.LogFormat("click:{0}",Selection.activeObject.name);
}
}
};
}
}
重写菜单
我们已经知道了可以在原有菜单的基础上进行扩展,那么我们也可以完全抛弃原有菜单,完全自定义自己的菜单。
基本原理就是判断情况并陈列自己的菜单
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class Script_06
{
[MenuItem("Window/Test/Player")]
static void Test()
{
}
[MenuItem("Window/Test/Enemy")]
static void Test1()
{
}
[MenuItem("Window/Test/UI")]
static void Test2()
{
}
[InitializeOnLoadMethod]
static void StartInitializeOnLoadMethod()
{
EditorApplication.hierarchyWindowItemOnGUI += OnHierarchyGUI;
}
static void OnHierarchyGUI(int instanceID,Rect selectionRect)
{
if (Event.current != null && selectionRect.Contains(Event.current.mousePosition) && Event.current.button == 1)
{
GameObject selectedGameObject = EditorUtility.InstanceIDToObject(instanceID) as GameObject;
if (selectedGameObject)
{
Vector2 mousePosition = Event.current.mousePosition;
EditorUtility.DisplayPopupMenu(new Rect(mousePosition.x,mousePosition.y,0,0),"Window/Test",null);
Event.current.Use();
}
}
}
}
覆盖菜单
我们还可以重写系统自带的菜单行为。例如,我觉得Unity创建的Image组件不好,那么可以复写他的行为。
创建Image组件时,会自动勾选RaycastTarget。如果图片不需要处理点击事件,则带来了额外开销。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEngine.UI;
public class Script_07
{
[MenuItem("GameObject/UI/Image")]
static void CreateImage()
{
if (Selection.activeTransform)
{
if (Selection.activeTransform.GetComponentInParent<Canvas>())
{
Image image = new GameObject("Image").AddComponent<Image>();
image.raycastTarget = false;
image.transform.SetParent(Selection.activeTransform,false);
Selection.activeTransform = image.transform;
}
}
}
}
边栏推荐
- 安装部署KubeSphere管理kubernetes
- MySQL installation to the last step in the write the configuration file failed?And after the installation steps
- Read Elephant Swap in one article, why does it bring such a high premium to ePLATO?
- C语言三子棋(井字棋)小游戏
- Flutter Paystack 所有选项实现
- How to Install MySQL on Linux
- vscode输出中文乱码问题
- [Interview: Concurrency 38: Multithreading: Thread Pool] Basic concepts of the ThreadPoolExecutor class
- Open Source | Commodity Recognition Recommender System
- NK - RTU980 burning bare-metal program
猜你喜欢
随机推荐
[MySQL exercises] Chapter 3 Common data types in MySQL
[MySQL exercises] Chapter 4 · Explore operators in MySQL with kiko
日志导致线程Block的这些坑,你不得不防
7/28-7/29 期望+思维+后缀数组+ST表
《如何戒掉坏习惯》读书笔记
Collation and sharing of related classic papers and datasets in the field of deep learning communication
How on one machine (Windows) to install two MYSQL database
R语言 第一部分
【云原生&微服务五】Ribbon负载均衡策略之随机ThreadLocalRandom
Linux redis6.2.6 configuration file
"C language game" entry-level chess game (robot enhanced version)
如何在一台机器上(windows)安装两个MYSQL数据库
C语言三子棋(井字棋)小游戏
MySQL安装教程
SSM整合案例分析(详解)
动态顺序表的增删查改(C语言实现)
【插值与拟合】
Install the deployment kubernetes KubeSphere management
sqli-labs(less-11)
MySql 5.7.38下载安装教程 ,并实现在Navicat操作MySql