Unity自带编辑器扩展

首先需要新建一个Editor文件夹,如果编辑器扩展的文件未放入文件夹会导致Unity无法编译,使功能失效。

使用Unity自带的编辑器扩展工具

(打开路径:Window/UI Tookit/UI Bulider)

现在可以使用Unity自带的可视化工具建立窗口了,注意的是如果要使用更加复杂的功能可以点击根目录,选Editor Extension Authoring按钮可以解锁更多功能窗口。想做好看整齐的样式右上角可以选择新建USS文件类似与html和css的关系。保存uxml文件后(就是做的可视化窗口)开始代码部分

using System.Collections;
using System.Collections.Generic;

//注意引用的文件正确
using UnityEditor;
using UnityEditor.UIElements;
using UnityEngine;
using UnityEngine.UIElements;

namespace GameDevTV.Tasks
{

    public class TaskList_Editor : EditorWindow   //继承EditorWindow,
    {
        //声明根节点
        VisualElement container;
        //VisualElement类是一个基础类,是构成的所有可视化元素的基类;

        //声明存放路径
        public const string path = "Assets/GameDev.tv Assets/TaskList/Editor/EditorWindow/";

        //声明不同组件,以方便操作
        TextField taskText;
        Button addTaskButton;
        ScrollView taskListScrollview;
        ObjectField savedTasksObjectFiwld;
        Button loadTaskButton;
        TaskListSO tasklistso;


        //在菜单栏创建调用按钮为静态方法
        [MenuItem("任务/任务栏")]
        public static void ShowWindow()
        {
            TaskList_Editor window = GetWindow<TaskList_Editor>("任务");
        }

        //
        public void CreateGUI()//在填EditorWIndow的rootVisualElment掉用
        {
            container = rootVisualElement;  //根节点绑定

            //找到创建的uxml
            VisualTreeAsset origine = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>(path + "TaskList_Editor.uxml");

            //添加到根节点
            container.Add(origine.Instantiate());

            //找到创建的uss文件
            StyleSheet stysheet = AssetDatabase.LoadAssetAtPath<StyleSheet>(path + "TaskList_Editor.uss");

            //添加到根节点
            container.styleSheets.Add(stysheet);


            //通过Name找到你创建的每个组件
            taskText = container.Q<TextField>("taskText");
            taskText.RegisterCallback<KeyDownEvent>(AddTask);
            addTaskButton = container.Q<Button>("AddButton");
            taskListScrollview = container.Q<ScrollView>("taskList");
            savedTasksObjectFiwld = container.Q<ObjectField>("saveTasksObjectField");
            loadTaskButton = container.Q<Button>("loadTaskButton");


            //给按钮绑定事件
            addTaskButton.clicked += AddTask;
            loadTaskButton.clicked += LoadTask;

            //给选择框选择类型
            savedTasksObjectFiwld.objectType = typeof(TaskListSO);
        }


        //按钮的事件
        void AddTask()
        {
            if (!string.IsNullOrEmpty(taskText.value))//如果字符串不为空
            {
                taskListScrollview.Add(CreatTask(taskText.value));//添加选择框
                SaveTask(taskText.value);//保存
                taskText.value = "";//把输入框置为空
                taskText.Focus();//使焦点到输入框,方便连续输入添加
            }
        }

       

        //按钮的事件
        void AddTask(KeyDownEvent e)
        {
            if (Event.current.Equals(Event.KeyboardEvent("Return")))
            {
                AddTask();
            }
        }

        //按钮的事件 加载SO文件数据
        void LoadTask()
        {
            tasklistso = savedTasksObjectFiwld.value as TaskListSO;
            if(tasklistso != null)
            {
                taskListScrollview.Clear();
                List<string> tasks = tasklistso.GetTasks();
                foreach (string task in tasks) 
                {
                    taskListScrollview.Add(CreatTask(task));
                }
            }
        }

        //保存修改
        void SaveTask(string task)
        {
            tasklistso.AddTask(task);
            EditorUtility.SetDirty(tasklistso);
            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();
        }

        //创建选择框的方法
        Toggle CreatTask(string tasktext)
        {
            Toggle taskItem = new Toggle();
            taskItem.text = tasktext;
            return taskItem;
        }
    }

}


SO文件代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace GameDevTV.Tasks
{
    //使其可以在菜单中被选择创建
    [CreateAssetMenu(menuName ="Task List",fileName ="New Task List")]
    public class TaskListSO : ScriptableObject
    {
        [SerializeField] List<string> task = new List<string>();

        public List<string> GetTasks()
        {
            return task;    
        }

        public void AddTask(string s_task)
        {
            task.Add(s_task);
        }

        public void AddTask(List<string> SaveTask)
        {
            task.Clear();
            task = SaveTask;
        }
    }

}


然后点击上方菜单即可使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值