using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public enum 节点类型
{
动作,组件,条件,装饰器
}
/// <summary>
/// 保存窗口box的id
/// </summary>
public class 节点
{
public int 自己 = -1;
public int 其他 = -1;
}
public class test : EditorWindow {
private static GUIStyle style = null;
static string 资源名称 = "xxx.asset";
static string 输出路径 = @"Assets\资源";
static int 节点数 = 0;
int 父窗口id = -1;
/// <summary>
/// 保存窗口的Rect位置信息
/// </summary>
List<Rect> 区域列表;
List<节点> 节点连线;
Event 当前事件;
public test()//构造函数
{
区域列表 = new List<Rect>();
节点连线 = new List<节点>();
}
[MenuItem("AI/测试")]//创建窗口......这并不是构造函数啊
public static test 测试()
{
test 新窗口 = EditorWindow.GetWindow<test>();
新窗口.name = "测试";
return 新窗口;
}
private void OnGUI()
{
当前事件 = Event.current;
if(当前事件.type==EventType.ContextClick)//右键事件
{
右击创建菜单();
}
if(当前事件.type==EventType.MouseDrag)//鼠标拖拽事件
{
绘制鼠标线();
}
左边菜单.显示左边菜单();
加载所有线();
加载所有节点(节点数);
//显示();
}
void 加载所有线()
{
if (区域列表.Count <= 1)
return;
Handles.BeginGUI();
for(int i=0;i<节点连线.Count;i++)
{
int 自身索引 = 节点连线[i].自己;
int 其他索引 = 节点连线[i].其他;
if(自身索引!=-1&&其他索引!=-1)
{
绘制一条线(区域列表[自身索引], 区域列表[其他索引]);
}
}
Handles.EndGUI();
}
void 绘制一条线(Rect r1,Rect r2)
{
Color color = Color.green;
Handles.DrawBezier(r1.center, r2.center, new Vector2(r1.xMax + 50f, r1.center.y),
new Vector2(r2.xMin - 50f, r2.center.y), color, null, 5f);
}
void 加载所有节点(int num)
{
if (num < 0)
return;
BeginWindows();
for(int i=0;i<num;i++)
{
//创建box
区域列表[i] = GUI.Window(i, 区域列表[i], 窗口函数, "盒子" + i);
}
EndWindows();
}
void 窗口函数(int winID)
{
if(GUILayout.RepeatButton("链接"))//制作重复按钮。只要用户按住,按钮就会返回“真”。这个按钮会持续反复执行代码。.用于生产拖拽连接线
{
Debug.Log("只要用户按住,按钮就会返回“真”。这个按钮会持续反复执行代码。.用于生产拖拽连接线");
父窗口id = winID;
}
GUI.DragWindow();//制作一个可拖拽的窗口
}
void 绘制鼠标线()
{
for(int i=0;i<区域列表.Count;i++)
{
if(区域列表[i].Contains(当前事件.mousePosition)&&父窗口id!=-1&&父窗口id!=i)//如果x和y点是点此矩形内的组件,则返回true.
{//松开鼠标是,鼠标停留的窗口不是自身.
节点 node = new 节点();
node.自己 = i;//i是被链接的
node.其他 = 父窗口id;
节点连线.Add(node);
父窗口id = -1;
Debug.Log("链接完成");
break;
}
}
}
public void 右击创建菜单()
{
if (GUILayout.Button("创建", GUILayout.Width(200)))
{
}
GenericMenu 生成菜单 = new GenericMenu();
生成菜单.AddItem(new GUIContent("添加节点/动作"), false, 菜单点击回调, 节点类型.动作);
生成菜单.AddItem(new GUIContent("添加节点/组件"), false, 菜单点击回调, 节点类型.组件);
生成菜单.AddItem(new GUIContent("添加节点/条件"), false, 菜单点击回调, 节点类型.条件);
生成菜单.AddItem(new GUIContent("添加节点/装饰器"), false, 菜单点击回调, 节点类型.装饰器);
生成菜单.ShowAsContext();//右键单击时在鼠标下显示菜单。
当前事件.Use();
}
public void 菜单点击回调(object obj)
{
节点类型 菜单类型 = (节点类型)obj;
switch(菜单类型)
{
case 节点类型.动作:
{
更新区域列表(++节点数);
}
break;
case 节点类型.条件:
break;
case 节点类型.组件:
break;
case 节点类型.装饰器:
break;
default:
break;
}
Debug.Log("选择菜单 = " + 菜单类型);
}
void 更新区域列表(int num)
{
if(num>区域列表.Count)
{
Rect rect = new Rect(当前事件.mousePosition.x, 当前事件.mousePosition.y, 100, 100);
区域列表.Add(rect);
}
}
static void 显示()
{
GUILayout.Space(10);
style = new GUIStyle();
style.fontStyle = FontStyle.Bold;
style.normal.textColor = Color.green;
//GUILayout.Label("一个label....create by oneLei!\n" + "xx@163.com");
}
}
左边菜单
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class 左边菜单 {
private static Vector2 滚动位置;
private static bool 动作 = true;//标识是否展开
static bool 组件 = true;
static bool 装饰 = true;
static bool 条件 = true;
public static void 显示左边菜单()
{
EditorGUILayout.BeginVertical();
滚动位置 = EditorGUILayout.BeginScrollView(滚动位置, GUILayout.Width(200));
动作 = EditorGUILayout.Foldout(动作, "动作折叠");//默认是否展开
if(动作)
{
for(int i=0;i<9;i++)
{
GUILayout.Button("按钮" + i, GUILayout.Width(200));
}
}
组件 = EditorGUILayout.Foldout(组件, "组件折叠");
if(组件)
{
for (int i = 0; i < 9; i++)
GUILayout.Button("按钮" + i, GUILayout.Width(200));
}
条件 = EditorGUILayout.Foldout(条件, "条件折叠");
if (条件)
{
for (int i = 0; i < 9; i++)
GUILayout.Button("按钮" + i, GUILayout.Width(200));
}
装饰 = EditorGUILayout.Foldout(装饰, "装饰折叠");
if (装饰)
{
for (int i = 0; i < 9; i++)
GUILayout.Button("按钮" + i, GUILayout.Width(200));
}
EditorGUILayout.EndScrollView();
EditorGUILayout.EndVertical();
}
}
网友评论