public class SkilEditormy : EditorWindow
{
private static SkillData skill; //技能数据
static List<string> anims = new List<string>(); //动画名称集合
private static List<SkillData> list; // 技能列表
//技能图标
private static Texture texture;
//buffer集合
static List<BufferData> bufferlist=new List<BufferData>();
private static List<string> buffernames = new List<string>();
//打开技能编辑器
[MenuItem("Tools/SkilEditormy")]
public static void Init()
{
//创建控技能数据
skill = new SkillData();
//加载json技能列表
TextAsset text = Resources.Load<TextAsset>("skill");
if (text == null) //判空
{
list = new List<SkillData>(); //空则新建
}
else
{
list = JsonConvert.DeserializeObject<List<SkillData>>(text.text); //不为空 读取
}
skill.id = list.Count;
//创建编辑器窗口
var win = GetWindow<SkilEditormy>();
//打开窗口
win.Show();
//设置默认图片
texture = Resources.LoadAll<Texture>("icon")[0];
for (int i = 0; i < bufferlist.Count; i++)
{
buffernames.Add(bufferlist[i].nick);
}
}
private int bufferid;
private GameObject effect;
private GameObject areaeffect;
private List<string> buffers = new List<string>();
private List<int> buffids = new List<int>();
private int buff;
private Vector2 v2;
private AnimationClip clip;
[System.Obsolete]
private void OnGUI()
{
//添加纵向布局
GUILayout.BeginVertical();
//显示文字
GUILayout.Label("技能id: " + skill.id);
//添加横向布局
GUILayout.BeginHorizontal();
//显示文字
GUILayout.Label("技能名称");
skill.nick = GUILayout.TextField(skill.nick, GUILayout.Width(200));
//结束纵向布局
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
GUILayout.Label("技能描述");
skill.des = GUILayout.TextField(skill.des, GUILayout.Width(200));
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
if (GUILayout.Button(texture, GUILayout.Width(50), GUILayout.Height(50)))
{
//打开指定的文件夹选择图片 返回地址
string path = EditorUtility.OpenFilePanel("选择图片", Application.dataPath + "/Resources/icon/", ".png");
string[] a = path.Split('/');
string[] b = a[a.Length - 1].Split('.');
texture = Resources.Load<Texture>("icon/" + b[0]);
}
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
GUILayout.Label("技能CD");
//添加float输入框
skill.cd = EditorGUILayout.FloatField(skill.cd, GUILayout.Width(200));
GUILayout.EndHorizontal();
//
GUILayout.BeginHorizontal();
GUILayout.Label("动作");
//添加下拉栏
clip = (AnimationClip)EditorGUILayout.ObjectField(clip, typeof(AnimationClip));
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
GUILayout.Label("前摇"); //或者吟诵
skill.delay = EditorGUILayout.FloatField(skill.delay, GUILayout.Width(200));
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
GUILayout.Label("发射间隔");
skill.interval = EditorGUILayout.FloatField(skill.interval, GUILayout.Width(200));
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
GUILayout.Label("施法距离");
skill.distance = EditorGUILayout.FloatField(skill.distance, GUILayout.Width(200));
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
GUILayout.Label("施法时间");
skill.casttime = EditorGUILayout.FloatField(skill.casttime, GUILayout.Width(200));
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
GUILayout.Label("轨迹");
skill.track = (Track)EditorGUILayout.EnumPopup(skill.track, GUILayout.Width(200));
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
GUILayout.Label("弹道效果路径");
effect = (GameObject)EditorGUILayout.ObjectField(effect,typeof(GameObject), GUILayout.Width(200));
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
GUILayout.Label("攻击范围");
skill.area = EditorGUILayout.FloatField(skill.area, GUILayout.Width(200));
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
GUILayout.Label("攻击范围形状");
skill.shape = (Shape)EditorGUILayout.EnumPopup(skill.shape, GUILayout.Width(200));
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
GUILayout.Label("持续时间");
skill.duration = EditorGUILayout.FloatField(skill.duration, GUILayout.Width(200));
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
GUILayout.Label("范围效果");
areaeffect = (GameObject)EditorGUILayout.ObjectField(areaeffect,typeof(GameObject), GUILayout.Width(200));
GUILayout.EndHorizontal();
v2 = GUILayout.BeginScrollView(v2);
buff = GUILayout.SelectionGrid(buff, buffers.ToArray(),1);
GUILayout.EndScrollView();
GUILayout.BeginHorizontal();
bufferid = EditorGUILayout.Popup(bufferid, buffernames.ToArray());
//添加文字按钮
if (GUILayout.Button("添加buffer",GUILayout.Width(200)))
{
buffers.Add(buffernames[bufferid]);
buffids.Add(bufferlist[bufferid].id);
}
GUILayout.EndHorizontal();
//添加文字按钮
if (GUILayout.Button("保存"))
{
string animpath = AssetDatabase.GetAssetPath(clip);
//赋值动画路径
skill.animpath = "Anim/" + GetName(animpath);
string effectapath = AssetDatabase.GetAssetPath(effect);
//赋值弹道路径
skill.effectpath = "Anim/" + GetName(effectapath);
string areaeffectpath = AssetDatabase.GetAssetPath(areaeffect);
//赋值弹道路径
skill.areaeffectpath = "Anim/" + GetName(areaeffectpath);
//技能列表写入json
list.Add(skill);
string json = JsonConvert.SerializeObject(list);
File.WriteAllText(Application.dataPath + "/Resources/Skill.json", json);
AssetDatabase.Refresh();
}
GUILayout.EndVertical();
}
public string GetName(string path)
{
string[] a = path.Split('/');
string[] b = a[a.Length - 1].Split('.');
return b[0];
}
}
技能编译
public enum Shape
{
fang,
yuan
}
public enum Track
{
直线,
弧线
}
public class SkillData
{
//技能id
public int id;
//技能名称
public string nick;
//技能描述
public string des;
//技能图标 (图片路径)
public string iconpath;
//技能cd
public float cd;
//技能动画
public string animpath;
//施法距离 0为近战 1为远程
public float distance;
//施法时间
public float casttime;
//技能轨迹
public Track track;
//弹道效果 路径
public string effectpath;
//攻击范围
public float area;
//范围形状
public Shape shape;
//技能前摇 延迟创建时间
public float delay;
//持续时间
public float duration;
//技能个数
public int num;
//攻击人数
public int objnum;
//技能间隔 0 时发射
public float interval;
//范围效果
public string areaeffectpath;
//buff数组
public string[] buffer;
//节能音效
public string soundpath;
}
技能数据