UnityEditor编辑器窗口

第一步  : 引用我们的编辑器命名空间  UnityEditor

第二步 :继承编辑器窗口类EditorWindow

第三步:写一个菜单栏 [MenuItem("Tool/SkillEditor")]   紧接着在在下面写一个静态方法用于打开编辑器窗口

第四部:用内置的OnGUI方法写其窗口里的内容

方法:GUILayout.BeginVertical();//开启纵向

      GUILayout.EndVertical();//结束纵向

   GUILayout.BeginHorizontal();//开启横向 

     GUILayout.EndHorizontal(); //结束横向

   EditorGUILayout.LabelField("近战普攻:");//显示文字

     atkType = (AtkType)EditorGUILayout.EnumPopup("攻击类型:", atkType);//枚举类型下拉框

    atkType = EditorGUILayoutPopup("攻击类型:", atkType);//下拉框

     area = EditorGUILayout.FloatField("范围:",area);//输入框 类型有int float double string ..

   EditorGUILayout.Space(); //设置间距 参数像素

=============================================================== 下面一个例子

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using Newtonsoft.Json;

public enum Hore
{
刀客,
法师,
剑客,
弥勒佛
}
public enum AtkType
{
magic,
physics
}
public enum AtkMode
{
sky,
plane
}
public enum AtkType1
{
magic,
physics
}
public enum AtkMode1
{
sky,
plane
}
public enum SkillType
{
fullScreen,
cross,
ninegram,
verticalLine,
crossLine
}


/// <summary>
/// 用户数据
/// </summary>
public class UserData
{
public Hore hore;
public AtkType atkType;
public AtkMode atkMode;
public AtkType1 atkType1;
public AtkMode1 atkMode1;
public SkillType skillType;
public float area;
public float area1;
}
public class SkillEditor : EditorWindow
{
[MenuItem("Tool/SkillEditor")]
public static void Init()
{
//打开编辑器窗口
GetWindow<SkillEditor>().Show();
}
UserData data = new UserData();
Hore hore;
AtkType atkType;
AtkMode atkMode;
AtkType1 atkType1;
AtkMode1 atkMode1;
SkillType skillType;
float area;
float area1;
private void OnGUI()
{
GUILayout.BeginVertical();
//显示下拉框
GUILayout.BeginHorizontal();
hore = (Hore)EditorGUILayout.EnumPopup("选择角色:", hore);
data.hore = hore;
GUILayout.EndHorizontal();
//显示文字
GUILayout.BeginHorizontal();
EditorGUILayout.LabelField("近战普攻:");
GUILayout.EndHorizontal();
//显示输入框
GUILayout.BeginHorizontal();
area = EditorGUILayout.FloatField("范围:",area);
data.area = area;
atkType = (AtkType)EditorGUILayout.EnumPopup("攻击类型:", atkType);
data.atkType = atkType;
atkMode = (AtkMode)EditorGUILayout.EnumPopup("攻击方式:", atkMode);
data.atkMode = atkMode;
GUILayout.EndHorizontal();

GUILayout.BeginHorizontal();
EditorGUILayout.LabelField("远程技能:");
GUILayout.EndHorizontal();

GUILayout.BeginHorizontal();
skillType = (SkillType)EditorGUILayout.EnumPopup("类型:", skillType);
data.skillType = skillType;
GUILayout.EndHorizontal();

GUILayout.BeginHorizontal();
if(skillType == SkillType.ninegram || skillType == SkillType.fullScreen)
{
EditorGUILayout.LabelField("范围:0");
data.area1 = 0;
}
else
{
area1 = EditorGUILayout.FloatField("范围:", area1);
data.area1 = area1;
}
atkType1 = (AtkType1)EditorGUILayout.EnumPopup("攻击类型:", atkType1);
data.atkType1 = atkType1;
atkMode1 = (AtkMode1)EditorGUILayout.EnumPopup("攻击方式:", atkMode1);
data.atkMode1 = atkMode1;

GUILayout.EndHorizontal();
//显示按钮
GUILayout.BeginHorizontal();
if(GUILayout.Button("保存"))
{
Debug.Log("我是保存按钮");
//序列化json
string json = JsonConvert.SerializeObject(data);
System.IO.File.WriteAllText(Application.dataPath + "/Resources/Skill.json", json);
AssetDatabase.Refresh();
}
GUILayout.EndHorizontal();

 

GUILayout.EndVertical();
}
}

效果如下

 

posted @ 2023-03-22 10:19  old_Host  阅读(162)  评论(0编辑  收藏  举报