unity 繪製曲線,後退,與清除
1.新建camera,新建一個image,給image一個透明材質cam,新建render texture,render texture給camera 和image。
2.新建一個材質,當做劃線顏色使用。
3. 給camera一個程式碼。(一定要在camera上)在canvas增加兩個按鈕,後退和清除。
public Material mat;
private int number = 0;//繪製直線計數
private List<Vector3> lineinfo;//繪製曲線
private List<Vector3>[] line = new List<Vector3>[10000];//繪製線段的儲存
private Button houtui;
private Button qingchu;
void Start()
{
mat.color = Color.red;
number = 0;
//初始化滑鼠線段連結串列
for (int i = 0; i < line.Length; i++)
{
line[i] = new List<Vector3>();
}
houtui = GameObject.Find("後退").GetComponent<Button>();
houtui.onClick.AddListener(onHoutui);
qingchu = GameObject.Find("清除").GetComponent<Button>();
qingchu.onClick.AddListener(onQingchu);
}
void Update()
{
if (Fanwei.isEnter)
{
if (Input.GetMouseButtonDown(0))
{
number++;
}
//將每次滑鼠改變的位置儲存進連結串列
if (Input.GetMouseButton(0))
{
line[number].Add(Input.mousePosition);
}
}
}
private void OnPostRender()
{
if (!mat)
{
Debug.Log("請給材質!");
return;
}
//繪製曲線
mat.SetPass(0);//設定該材質通道,0為預設值
GL.LoadOrtho();//設定繪製2D影象
GL.Begin(GL.LINES);////表示開始繪製,繪製型別為線段
//最新線段
for (int i = 0; i < line[number].Count - 1; i++)
{
Vector3 start = line[number][i];
Vector3 end = line[number][i + 1];
//繪製線段
DrawLine(start.x, start.y, end.x, end.y);
DrawLine(start.x, start.y - 1, end.x, end.y - 1);
DrawLine(start.x, start.y - 2, end.x, end.y - 2);
DrawLine(start.x - 1, start.y, end.x - 1, end.y);
DrawLine(start.x - 2, start.y, end.x - 2, end.y);
}
//之前繪製的線段
for (int j = 0; j < number; j++)
{
for (int k = 0; k < line[j].Count - 1; k++)
{
Vector3 start = line[j][k];
Vector3 end = line[j][k + 1];
//繪製線段
DrawLine(start.x, start.y, end.x, end.y);
DrawLine(start.x, start.y - 1, end.x, end.y - 1);
DrawLine(start.x, start.y - 2, end.x, end.y - 2);
DrawLine(start.x - 1, start.y, end.x - 1, end.y);
DrawLine(start.x - 2, start.y, end.x - 2, end.y);
}
}
GL.End();
}
private void DrawLine(float x1, float y1, float x2, float y2)
{
//繪製線段,需要將螢幕中某個點的畫素座標除以螢幕寬或高
GL.Vertex(new Vector3(x1 / Screen.width, y1 / Screen.height, 0));
// 最高點;頂點;<數>(三角形、圓錐體等與底相對的)頂;
GL.Vertex(new Vector3(x2 / Screen.width, y2 / Screen.height, 0));
}
public void onHoutui()
{
if (number > 0)
{
line[number] = new List<Vector3>();
number--;
}
}
public void onQingchu()
{
number = 0;
for (int i = 0; i < line.Length; i++)
{
line[i] = new List<Vector3>();
}
}
4.確定繪製範圍,保證點選按鈕時不發生繪圖現象。在image上加程式碼。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class Fanwei : MonoBehaviour,IPointerEnterHandler,IPointerDownHandler,IPointerUpHandler,IPointerExitHandler {
public static bool isEnter=false ;
public void OnPointerDown(PointerEventData eventData)
{
isEnter = true;
}
public void OnPointerEnter(PointerEventData eventData)
{
isEnter = true;
}
public void OnPointerExit(PointerEventData eventData)
{
isEnter = false ;
}
public void OnPointerUp(PointerEventData eventData)
{
isEnter = false;
}
}