首先需要新建一个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;
}
}
}
然后点击上方菜单即可使用