acecase 发表于 2022-12-19 18:56

Unity 屏幕绘制


111.gif

/** * ========================================== * FileName: TestDrawLine.cs * Author:   #Author# * CreatTime:#CreateTime# * ========================================== */using System.Collections;using System.Collections.Generic;using System.IO;using System.Xml.Serialization;using UnityEngine;//注意脚本需要挂载到摄像机上面public class TestDrawLine : MonoBehaviour{    Vector3 curPos;    List<List<Vector3>> lineData = new List<List<Vector3>>();    List<Vector3> posList = new List<Vector3>();    int interval;    //public Transform cube;    public Material lineMaterial;    void CreateLineMaterial()    {      if (!lineMaterial)      {            Shader shader = Shader.Find("Unlit/ColorShader");            //Shader shader = Shader.Find("Hidden/Internal-Colored");            lineMaterial = new Material(shader);            //lineMaterial.hideFlags = HideFlags.HideAndDontSave;            ////设置参数            //lineMaterial.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);            //lineMaterial.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);            ////设置参数            //lineMaterial.SetInt("_Cull", (int)UnityEngine.Rendering.CullMode.Off);            ////设置参数            //lineMaterial.SetInt("_ZWrite", 0);      }    }    private void OnPostRender()    {      DrawLine();    }    void OnGUI()    {      Event e = Event.current;      if (e != null)      {            if (e.type == EventType.MouseDown)            {                            }            if (e.type == EventType.MouseDrag)            {                if (Vector3.Distance(curPos, Input.mousePosition) > interval)                {                  curPos = Input.mousePosition;                  Vector3 end = new Vector3(curPos.x / Screen.width, curPos.y / Screen.height, 0);                  posList.Add(end);                }            }            if (e.type == EventType.MouseUp)            {                List<Vector3> l = Clone<List<Vector3>>(posList);                if (l.Count > 0)                {                  lineData.Add(l);                }                posList.Clear();                curPos = Vector3.zero;            }      }    }    void DrawLine()    {      GL.PushMatrix();      GL.LoadOrtho();      if (lineMaterial != null)      {            lineMaterial.SetPass(0);      }      GL.Begin(GL.LINES);      GL.Color(Color.red);      for (int j = 0; j < lineData.Count; j++) {            List<Vector3> line = lineData;            for (int i = 0; i < line.Count - 1; I++)            {                Vector3 pos = line;                GL.Vertex3(pos.x, pos.y, pos.z);                GL.Vertex3(line.x, line.y, line.z);            }      }      for (int i = 0; i < posList.Count - 1; I++)      {            Vector3 pos = posList;            GL.Vertex3(pos.x, pos.y, pos.z);            GL.Vertex3(posList.x, posList.y, posList.z);      }      GL.End();      GL.PopMatrix();    }    public void WithDraw() {      if (lineData.Count > 0) {            lineData.RemoveAt(lineData.Count - 1);      }    }    public static T Clone<T>(T RealObject)    {      using (System.IO.Stream stream = new MemoryStream())      {            XmlSerializer serializer = new XmlSerializer(typeof(T));            serializer.Serialize(stream, RealObject);            stream.Seek(0, SeekOrigin.Begin);            return (T)serializer.Deserialize(stream);      }    }}
页: [1]
查看完整版本: Unity 屏幕绘制