unity 使用GL在场景绘制网格(二)可以自定义网格中心点

工具:unity2018.4.2,vs2017

一、先上效果

二、代码

脚本挂载在摄影机上

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

public class CreateGrids : MonoBehaviour
{
    #region 字段
    //整个网格的大小
    public float MeshSize = 10;
    //单个网格的大小
    public float CellSize = 0.5f;
    //网格颜色
    public Color LineColor;
    //网格材质
    public Material LineMat;
    //网格中心点
    public Vector3 MeshCenter = Vector3.zero;

    //网格线的起始与终止点
    List<Vector3[]> m_linePoints = new List<Vector3[]>();
    #endregion

    #region unity回调
    // Start is called before the first frame update
    void Start()
    {
        Initialized();
    }

    //绘制网格
    void OnPostRender()
    {
        LineMat.SetPass(0);

        GL.PushMatrix();

        GL.Begin(GL.LINES);
        for (int i = 0; i < m_linePoints.Count; i++)
        {
            GL.Vertex(m_linePoints[i][0]);
            GL.Vertex(m_linePoints[i][1]);
        }
        GL.End();

        GL.PopMatrix();
    }

    #endregion

    #region 方法
    void Initialized()
    {
        m_linePoints.Clear();

        LineMat.SetColor("_Color", LineColor);

        //计算单排网格数量
        int cellCount = (int)(MeshSize / CellSize);

        //计算横线的顶点
        for (int i = 0; i < cellCount / 2; i++)
        {
            //左上
            Vector3[] points1 = new Vector3[2];
            points1[0] = new Vector3(MeshCenter.x, MeshCenter.y, MeshCenter.z + CellSize * i);
            points1[1] = new Vector3(MeshCenter.x - MeshSize / 2, MeshCenter.y, MeshCenter.z + CellSize * i);

            //左下
            Vector3[] points2 = new Vector3[2];
            points2[0] = new Vector3(MeshCenter.x, MeshCenter.y, MeshCenter.z - CellSize * i);
            points2[1] = new Vector3(MeshCenter.z - MeshSize / 2, MeshCenter.y, MeshCenter.z - CellSize * i);

            //右上
            Vector3[] points3 = new Vector3[2];
            points3[0] = new Vector3(MeshCenter.x, MeshCenter.y, MeshCenter.z + CellSize * i);
            points3[1] = new Vector3(MeshCenter.x + MeshSize / 2, MeshCenter.y, MeshCenter.z + CellSize * i);

            //右下
            Vector3[] points4 = new Vector3[2];
            points4[0] = new Vector3(MeshCenter.x, MeshCenter.y, MeshCenter.z - CellSize * i);
            points4[1] = new Vector3(MeshCenter.z + MeshSize / 2, MeshCenter.y, MeshCenter.z - CellSize * i);

            m_linePoints.Add(points1);
            m_linePoints.Add(points2);
            m_linePoints.Add(points3);
            m_linePoints.Add(points4);
        }

        //计算竖线的顶点
        for (int i = 0; i < cellCount / 2; i++)
        {
            //左上
            Vector3[] points1 = new Vector3[2];
            points1[0] = new Vector3(MeshCenter.x - CellSize * i, MeshCenter.y, MeshCenter.z);
            points1[1] = new Vector3(MeshCenter.x - CellSize * i, MeshCenter.y, MeshCenter.z + MeshSize / 2);

            //左下
            Vector3[] points2 = new Vector3[2];
            points2[0] = new Vector3(MeshCenter.x - CellSize * i, MeshCenter.y, MeshCenter.z);
            points2[1] = new Vector3(MeshCenter.x - CellSize * i, MeshCenter.y, MeshCenter.z - MeshSize / 2);

            //右上
            Vector3[] points3 = new Vector3[2];
            points3[0] = new Vector3(MeshCenter.x + CellSize * i, MeshCenter.y, MeshCenter.z);
            points3[1] = new Vector3(MeshCenter.x + CellSize * i, MeshCenter.y, MeshCenter.z + MeshSize / 2);

            //右下
            Vector3[] points4 = new Vector3[2];
            points4[0] = new Vector3(MeshCenter.x + CellSize * i, MeshCenter.y, MeshCenter.z);
            points4[1] = new Vector3(MeshCenter.x + CellSize * i, MeshCenter.y, MeshCenter.z - MeshSize / 2);

            m_linePoints.Add(points1);
            m_linePoints.Add(points2);
            m_linePoints.Add(points3);
            m_linePoints.Add(points4);
        }
    }
    #endregion
}

三、demo地址

https://github.com/huangyuanyuan666/SceneGrids.git

如果有问题,欢迎提问,一两个月内基本都会给与回答。

 

额外记录下github通用命令行

防止忘记还要到处找。。。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值