Unity3d 实现用LineRenderer画线 不依赖摄像机位置
用LineRenderer画线难点: 鼠标坐标和屏幕坐标之间的转换 我是弄了很多天才弄好的
跟大家分享一下
using UnityEngine; using System.Collections; using System.Collections.Generic; public class DrawLine: MonoBehavIoUr { private Event e; private int pointCnt = 0; public Color c1 = Color.red; public Color c2 = Color.blue; public GameObject obj; private LineRenderer lineRenderer; private LineRenderer[] lineRendArray; private Color[] color; public int maxLine = 5; private int index = 0; private bool flag = true; // 画线坐标之间的转换 20120330------------- private Vector3 screenPoint; private Vector3 scanPos; private Vector3 offset; // 20120330----------------------------------- void Start () { e = Event.current; scanPos = obj.transform.position; lineRenderer = (LineRenderer)obj.GetComponent("LineRenderer"); // lineRenderer = (LineRenderer)gameObject.AddComponent("LineRenderer"); lineRenderer.material = new Material (Shader.Find("Particles/Additive")); lineRenderer.SetColors(c1,c2); lineRenderer.SetWidth(0.02F,0.02F); lineRenderer.SetVertexCount(0); lineRendArray = new LineRenderer[maxLine]; color = new Color[8]; color[0] = Color.yellow; color[1] = Color.blue; color[2] = Color.cyan; color[3] = Color.gray; color[4] = Color.green; color[5] = Color.grey; color[6] = Color.magenta; color[7] = Color.red; } void Update() { if(e != null){ if (e.type == EventType.MouseDown){ //////////////20120330--------------------- ////坐标之间的转换 Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition); print("new mouse point: "+mousePos); screenPoint = Camera.main.WorldToScreenPoint(scanPos); offset = scanPos - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x,Input.mousePosition.y,screenPoint.z)); Vector3 curScreenPoint = new Vector3(Input.mousePosition.x,screenPoint.z); Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenPoint); // +offset; //////////////20120330----------------------- if(index < maxLine){ if(flag){ GameObject newObj; newObj = (GameObject)Instantiate(obj,obj.transform.position,obj.transform.rotation); lineRenderer = (LineRenderer)newObj.GetComponent("LineRenderer"); int n = Random.Range(1,8); c1 = color[n-1]; n = Random.Range(1,8); c2 = color[n-1]; lineRenderer.SetColors(c1,c2); lineRenderer.SetWidth(0.02F,0.02F); lineRendArray[index] = lineRenderer; } } else{ index = 0; flag = false; } pointCnt = 0; DrawRenderLine(lineRendArray[index],curPosition); index++; } if (e.type == EventType.MouseDrag){ ////// 20120330--------------------------- Vector3 curScreenPoint = new Vector3(Input.mousePosition.x,screenPoint.z); print("curScreenPoint: "+curScreenPoint); Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenPoint);// + offset; ////// 20120330----------------------------- if (index == 0) DrawRenderLine(lineRendArray[index],curPosition); else DrawRenderLine(lineRendArray[index-1],curPosition); } if (e.type == EventType.MouseUp){ } } } void OnGUI () { e = Event.current; } void DrawRenderLine(LineRenderer line,Vector3 vect3){ Vector3 newPos = vect3; line.SetVertexCount(++pointCnt); line.SetPosition(pointCnt-1,newPos); print("new point: "+newPos); } }