Unity3d自学记录 实现画板功能

要点

1.GL类的简单使用

2.Texture2D的简单使用

3.List的简单使用

 

实现功能

        利用鼠标左键进行绘图,写字,利用鼠标右键按下进行将绘出的图形记录到Quad对象上,Quad可根据当前屏幕宽高自动调节大小,达到不改变原图的目的。

附动图(伪动图系列)

Unity3d自学记录 实现画板功能_第1张图片

思路

       从一条线来说,利用List存下所有鼠标位置,先是在OnRenderObject(它是回调函数哦)里利用GL进行频繁刷新,按下鼠标右键,将一个个点根据视口坐标填充进一张Texture里,在Quad上进行渲染,再说多条线,List>这样就可以了。

代码实现 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PaintUI : MonoBehaviour
{
    [Tooltip("图案将被此载体渲染")]
    public Renderer m_rendered;

    [Range(50f,200f)]
    [Tooltip("线条连贯性(我还没过四级)")]
    public float m_lineSmooth;
    [Tooltip("是否保持图案原有纵横比")]
    public bool m_isKeepRatio;
    [Space(2)]
    [Header("颜色")]
    [Tooltip("绘画时显示的颜色")]
    public Color m_drawColor;
    [Tooltip("在material时的颜色")]
    public Color m_renderedColor;

    private List> m_vertexList;
    private void Start()
    {
        m_vertexList = new List>();
    }

    private void Update()
    {
        if(Input.GetMouseButtonDown(0))
        {
            List newList = new List();
            m_vertexList.Add(newList);
        }
        if(Input.GetMouseButton(0))
        {
            m_vertexList[m_vertexList.Count-1].Add(Camera.main.ScreenToViewportPoint(Input.mousePosition));
        }
        if(Input.GetMouseButtonDown(1))
        {
            PaintGraphics();
        }
    }

    public void OnRenderObject()
    {
        GL.Begin(GL.LINES);
        GL.LoadOrtho();
        GL.Color(m_drawColor);
        int vertexListCount = m_vertexList.Count;

        for(int i=0;i< vertexListCount; i++)
        {
            int vertexCount = m_vertexList[i].Count;
            for (int j=1;j< vertexCount;j++)
            {
                GL.Vertex3(m_vertexList[i][j-1].x, m_vertexList[i][j-1].y, 0);
                GL.Vertex3(m_vertexList[i][j].x, m_vertexList[i][j].y, 0);
            }
            
        }
        GL.End();
    }
    private void PaintGraphics()
    {
        Texture2D newTexture = new Texture2D(Screen.width,Screen.height);

        //设置像素点
        int vertexListCount = m_vertexList.Count;

        for (int i = 0; i < vertexListCount; i++)
        {
            int vertexCount = m_vertexList[i].Count;
            for (int j=1;j

enmmm,完毕                                                                                                                                                                                  

你可能感兴趣的:(Unity3d)