1. 程式人生 > >unity 繪製曲線,後退,與清除

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;
    }


}