unity编译器扩展功能—窗体(终结篇)

在写完上两篇博客之后 这篇博客是最后一篇关于unity编译器的扩展功能了
大家如果有兴趣 可以查看前两篇博客的有关操作
有些重复的东西我就不再写了
又来上两篇的基础 这个应该不难理解

public class MyWindow:EditorWindow 
{
    [MenuItem("Window/My Window")]
    static void ShowWindow()
    {
        MyWindow mywindow = EditorWindow.GetWindow<MyWindow>();
        mywindow.Show();//显示
    }
    private string names = "";
    private void OnGUI()
    {
        GUILayout.Label("这是我的窗口");
        names = GUILayout.TextField(names);


        if (GUILayout.Button("创建"))//点击创建按钮
        {
            GameObject go = new GameObject(names);
            Undo.RegisterCreatedObjectUndo(go, "Create GameObject");
            //注册操作记录 可撤销
        }
    }
}

这个代码的作用是产生一个窗体
可以一键创建物体
在这里插入图片描述
我们可以结合自己的知识 做出各种想要的效果

在下边我给大家制作一个可以一键创建和删除Hierarchy面板中物体的脚本 大家可以在开发中自己操作

其中的删除是输入名称之后遍历左右的物体 然后把名称是输入名称的无敌都删除(可撤回)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.Linq;

public class MyWindow:EditorWindow 
{
    List<GameObject> lists = new List<GameObject>();//存放面板全部的物体

    [MenuItem("Window/My Window")]
    static void ShowWindow()
    {
        MyWindow mywindow = EditorWindow.GetWindow<MyWindow>();
        mywindow.Show();//显示
    }
    private string Createnames = "";
    private string Deletename = "";
    private void OnGUI()
    {
        GUILayout.Label("快捷操作面板");//标签显示的文字
        GUILayout.Label("输入创建物体名称");
        Createnames = GUILayout.TextField(Createnames);
        
        if (GUILayout.Button("创建"))//点击创建按钮
        {
            GameObject go = new GameObject(Createnames);
            Undo.RegisterCreatedObjectUndo(go, "Create GameObject");
            //注册操作记录 可撤销

        }
        GUILayout.Space(20);//插入空格
        GUILayout.Label("输入删除物体名称");
        Deletename = GUILayout.TextField(Deletename);//输入要删除的名称

        ////////获取面板中所有的游戏物体
        var allTransforms = Resources.FindObjectsOfTypeAll(typeof(Transform));
        //返回全部对象(类型)
        var previousSelection = Selection.objects;
        Selection.objects = allTransforms.Cast<Transform>().Where(x => x != null)
        .Select(x => x.gameObject)
         //如果你只想获取所有在Hierarchy中被禁用的物体,反注释下面代码
         //.Where(x => x != null && !x.activeInHierarchy)
         .Cast<UnityEngine.Object>().ToArray();

        var selectedTransforms = Selection.GetTransforms(SelectionMode.Editable | SelectionMode.ExcludePrefab);
        Selection.objects = previousSelection;

        lists = selectedTransforms.Select(tr => tr.gameObject).ToList();
        
        if (GUILayout.Button("删除"))
        {
            foreach(var go in lists)
            {
                if (go.name == Deletename)
                {
                    Undo.DestroyObjectImmediate(go);
                }
            }
        }
    }
}

在这里插入图片描述
反正我觉的挺好用的 哈哈
祝大家学习工作顺利啦

发布了52 篇原创文章 · 获赞 47 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44302602/article/details/103669330
今日推荐