美文网首页
编辑器连线

编辑器连线

作者: JJJJJJJJJJC | 来源:发表于2019-07-14 18:53 被阅读0次
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();

    }
}

相关文章

  • 编辑器连线

    左边菜单

  • 连线

    夜里 微信长长的通话时间 承载着你我的牵绊 道一声晚安 电话却放在耳边 手机里传出的你的鼾声 是我的催眠曲 早晨时...

  • 连线

    何苦劳心去动念 伤筋费神人似颠 待到缘分确实到 月老自然来连线

  • 连线

    今天周五……明天再见……

  • 连线

    >>格 风 拔牙的时候有人举着手机现场直播龇牙咧嘴的7号椅位马克看着我脑袋从洛杉矶伸过来什么话也没说麻醉师举着针筒...

  • 连线

    今天是个连线的日子,家家姥爷开始想外孙啦。中午和美国工作的大外孙聊美国政局和疫情,晚上又是叮嘱英国的小外孙注意防护...

  • 连线

    又是一个加班的夜晚,老宋完成一天的工作后,照常点开了“击掌”App,这是一个语音聊天软件,他看不上那些什么陌*啊探...

  • 连线

    正准备午饭,滴滴声唤,微信里俩妞聚齐,只待朵来。接通,连线,虽没开视频,但感觉人就在眼前,真实又美好。 都不知聊了...

  • UIStoryboard 连线和不连线调转

    // self.performSegue(withIdent...

  • 云端连线

    你, 一会看我, 一会看云。 我觉得, 你看我时很远, 你看云时很近。 ...

网友评论

      本文标题:编辑器连线

      本文链接:https://www.haomeiwen.com/subject/nbeikctx.html