using UnityEngine; using System.Collections; using UnityEditor; using System.Collections.Generic; public class DrawLineWindow : EditorWindow { [MenuItem("Tools/测试")] public static void ShowWindow() { DrawLineWindow window = EditorWindow.GetWindow(typeof(DrawLineWindow)) as DrawLineWindow; window.Init(); } private Material lineMaterial; Vector3 p0, p1, p2; int count = 2; List<Rect> rectList = new List<Rect>(); private List<Vector3> lineInfo = new List<Vector3>();//放置点的列表 void Init() { rectList.Clear(); for (int i = 0; i < count; i++) { rectList.Add(new Rect(20, 20, 80, 100)); } } void OnGUI() { if (!lineMaterial) { lineMaterial = new Material(Shader.Find("Standard")); } BeginWindows(); for(int i = 0; i < count; i++) { rectList[i] = GUI.Window(i, rectList[i], DrawWindow, "Start"); } EndWindows(); lineInfo.Clear(); { p0 = new Vector3(rectList[0].x, rectList[0].y, 0); p1 = new Vector3((rectList[1].x + rectList[0].x) / 2.0f, rectList[0].y, 0);//根据需求设置 //p1 = new Vector3((rectList[1].x + rectList[0].x) / 2.0f, (rectList[1].y + rectList[0].y) / 2.0f, 0); p2 = new Vector3(rectList[1].x, rectList[1].y, 0); for (float t = 0; t < 1.0f; t += 0.0001f) { float x = (1 - t) * (1 - t) * p0.x + 2 * (1 - t) * t * p1.x + t * t * p2.x; float y = (1 - t) * (1 - t) * p0.y + 2 * (1 - t) * t * p1.y + t * t * p2.y; lineInfo.Add(new Vector3(x, y, 0)); } } GL.PushMatrix(); //保存当前Matirx lineMaterial.SetPass(0); //刷新当前材质 GL.LoadPixelMatrix();//设置pixelMatrix GL.Color(Color.black); GL.Begin(GL.LINES); int size = lineInfo.Count; for (int i = 0; i < size - 1; i++) { Vector3 start = lineInfo[i]; Vector3 end = lineInfo[i + 1]; //绘制线 DrawLine(start.x, start.y, end.x, end.y); } GL.End(); GL.PopMatrix();//读取之前的Matrix } void DrawWindow(int windowID) { GUILayout.Button("Start"); GUI.DragWindow(); } void DrawLine(float x1, float y1, float x2, float y2) { //绘制线段 GL.Vertex(new Vector3(x1, y1, 0)); GL.Vertex(new Vector3(x2, y2, 0)); } }