如果想在unity中显示图形,那么就需要MeshFilter(网格过滤器)和MeshRender(网格渲染器),二者缺一不可。在Unity中所有能看见的图像都是基于此生成的。在unity中绘制一个图形的前提是确认顶点位置,制定绘制顺序,这样才能看见对应的图像,unity中才有三角形绘制完整图像,所以一个图像会由若干个三角形组成。
三个顶点的渲染顺序决定了面的正反,正面可以触发碰撞等,反面则没有这种效果
三个点的顺序为顺时针就是正面,逆时针就是反面
一、画cube
通过上方的介绍我们知道,cube正方体的组成就是六个面的绘制,包括八个顶点
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class CreateMesh : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
Mesh mesh=new Mesh();
// //添加网格过滤器,网格渲染器,网格碰撞器。刚体
gameObject.AddComponent<MeshFilter>();
gameObject.AddComponent<MeshRenderer>();
gameObject.AddComponent<MeshCollider>();
gameObject.AddComponent<Rigidbody>();
VertexHelper vh = new VertexHelper();
//添加顶点
vh.AddVert(new Vector3(0, 1, 0), Color.white, new Vector2(0, 0));
vh.AddVert(new Vector3(0, 1, 1), Color.white, new Vector2(0, 1));
vh.AddVert(new Vector3(1, 1, 1), Color.white, new Vector2(1, 1));
vh.AddVert(new Vector3(1, 1, 0), Color.white, new Vector2(1, 0));
vh.AddVert(new Vector3(0, 0, 0), Color.white, new Vector2(0, 0));
vh.AddVert(new Vector3(0, 0, 1), Color.white, new Vector2(0, 1));
vh.AddVert(new Vector3(1, 0, 1), Color.white, new Vector2(1, 1));
vh.AddVert(new Vector3(1, 0, 0), Color.white, new Vector2(1, 0));
//绘制顺序
//上
vh.AddTriangle(0, 1, 2);
vh.AddTriangle(0,2,3);
//左
vh.AddTriangle(0, 5, 1);
vh.AddTriangle(0, 4, 5);
//正
vh.AddTriangle(0, 3, 4);
vh.AddTriangle(3, 7, 4);
//背
vh.AddTriangle(1, 5, 2);
vh.AddTriangle(2, 6, 5);
//右
vh.AddTriangle(3, 2, 6);
vh.AddTriangle(3, 6, 7);
//下
vh.AddTriangle(4, 6, 5);
vh.AddTriangle(4, 7, 6);
vh.FillMesh(mesh);
mesh.RecalculateNormals();
GetComponent<MeshRenderer>().material = Resources.Load<Material>("White");
GetComponent<MeshCollider>().convex = true;
GetComponent<MeshFilter>().mesh = mesh;
GetComponent<MeshCollider>().sharedMesh = mesh;
}
// Update is called once per frame
void Update()
{
}
}
二、画圆
画圆首先需要确认的就是圆心,因为花园的本质就是以圆心为起点向四周扩散,如下图
关于计算对应的顶点坐标
关于UV坐标计算
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class CreateSquare : MonoBehaviour
{
public int num = 50;
float angle;
public float r = 10;
// Start is called before the first frame update
void Start()
{
//根据顶点个数确认角度
angle = 2 * Mathf.PI / num;
Mesh mesh = new Mesh();
VertexHelper vh = new VertexHelper();
//添加圆心顶点
vh.AddVert(Vector3.zero, Color.white, new Vector2(0.5f, 0.5f));
for (int i = 0; i < num; i++)
{
//求出每个顶点的x,y值
float x = Mathf.Sin(angle * i) * r;
float y = Mathf.Cos(angle * i) * r;
//求出对应的UV坐标
float uvx = (x + r) / (2 * r);
float uvy = (y + r) / (2 * r);
//循环添加顶点和UV坐标
vh.AddVert(new Vector3(x, y, 0), Color.white, new Vector2(uvx, uvy));
//优先绘制最后一个点
if (i == 0)
{
vh.AddTriangle(0, num, 1);
}
else
{
vh.AddTriangle(0, i, i + 1);
}
}
vh.FillMesh(mesh);
transform.GetComponent<MeshFilter>().mesh = mesh;
transform.GetComponent<MeshCollider>().sharedMesh = mesh;
}
// Update is called once per frame
void Update()
{
}
}
三、画plane
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class CreateTerrains : MonoBehaviour
{
int num = 11;
// Start is called before the first frame update
void Start()
{
VertexHelper vh = new VertexHelper();
for (int i = 0; i < num; i++)
{
for (int j = 0; j < num; j++)
{
vh.AddVert(new Vector3(i, 0, j), Color.green,new Vector2((float)i/(num-1), (float)j / (num-1)));
if (i < (num-1) && j < (num-1))
{
vh.AddTriangle(i * num + j, i * num + j + 1, (i + 1) * num + j);
vh.AddTriangle(i * num + j + 1, (i + 1) * num + j + 1, (i + 1) * num + j);
}
}
}
Mesh mesh = new Mesh();
vh.FillMesh(mesh);
GetComponent<MeshFilter>().mesh = mesh;
GetComponent<MeshCollider>().sharedMesh = mesh;
}
// Update is called once per frame
void Update()
{
}
}