在Game面板中实现类似于Scene面板中Grid Visual的显示效果。
以下为鼠标操作,也可以在Scene中拖动Camera的Y轴展示相同效果。
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(Camera))]
public class DrawGroundGrid : MonoBehaviour
{
[SerializeField]
private float _disNear = 3.0f;
[SerializeField]
private float _disMiddle = 15.0f;
private Transform _cameraTR;
private Material _lineMaterial;
private List<Vector3> _listNearPoints;
private float _nearAlpha = 1.0f;
private List<Vector3> _listMiddlePoints;
private float _middAlpha = 1.0f;
private List<Vector3> _listFarPoints;
void Start()
{
_cameraTR = GetComponent<Transform>();
//材质球Shader,会影响透明度
_lineMaterial = new Material(Shader.Find("Unlit/ProfileAnalyzerShader"));
_listNearPoints = new List<Vector3>();
_listMiddlePoints = new List<Vector3>();
_listFarPoints = new List<Vector3>();
//GroundGrid长宽为1000*1000
for (int i = -1000; i < 1001; i++)
{
if (i % 10 != 0)
{ //最小网格
_listNearPoints.Add(new Vector3(i, 0, 1000));
_listNearPoints.Add(new Vector3(i, 0, -1000));
_listNearPoints.Add(new Vector3(1000, 0, i));
_listNearPoints.Add(new Vector3(-1000, 0, i));
}
else if (i % 100 != 0)
{//中间网格
_listMiddlePoints.Add(new Vector3(i, 0, 1000));
_listMiddlePoints.Add(new Vector3(i, 0, -1000));
_listMiddlePoints.Add(new Vector3(1000, 0, i));
_listMiddlePoints.Add(new Vector3(-1000, 0, i));
}
else
{//最大网格
_listFarPoints.Add(new Vector3(i, 0, 1000));
_listFarPoints.Add(new Vector3(i, 0, -1000));
_listFarPoints.Add(new Vector3(1000, 0, i));
_listFarPoints.Add(new Vector3(-1000, 0, i));
}
}
}
private void LateUpdate()
{//最小网格透明度 立方的目的是为了加快渐变效果
_nearAlpha = (float)Math.Min(Math.Pow(_disNear / _cameraTR.position.y, 3.0f), 1);
if (_nearAlpha < 0.1f)
{//当最小网格不可见时 开始计算中间网格透明度
_nearAlpha = 0;
_middAlpha = (float)Math.Min(Math.Pow(_disMiddle / _cameraTR.position.y, 3.0f), 1);
_middAlpha = _middAlpha < 0.1f ? 0 : _middAlpha;
}
else
{
_middAlpha = 1;
}
}
/// <summary>Camera 系统方法</summary>
private void OnPostRender()
{
GL.PushMatrix();
_lineMaterial.SetPass(0);
GL.Begin(GL.LINES);
GL.Color(new Color(0.5f, 0.5f, 0.5f, 1));
for (int i = 0; i < _listFarPoints.Count - 1; i++)
{
GL.Vertex(_listFarPoints[i]);
GL.Vertex(_listFarPoints[i + 1]);
i++;
}
GL.Color(new Color(0.5f, 0.5f, 0.5f, _middAlpha));
for (int i = 0; i < _listMiddlePoints.Count - 1; i++)
{
GL.Vertex(_listMiddlePoints[i]);
GL.Vertex(_listMiddlePoints[i + 1]);
i++;
}
GL.Color(new Color(0.5f, 0.5f, 0.5f, _nearAlpha));
for (int i = 0; i < _listNearPoints.Count - 1; i++)
{
GL.Vertex(_listNearPoints[i]);
GL.Vertex(_listNearPoints[i + 1]);
i++;
}
GL.End();
GL.PopMatrix();
}
}