参考链接:http://blog.csdn.net/zuoyamin/article/details/9287507
对于自定义mesh,有三点很重要:
1.顶点个数=三角形数+2;三角形顶点数=3*三角形数
2.顶点创建的顺序最好是顺时针或者逆时针创建的,这样可以大大地减少算法的复杂度
3.顶点绘制的顺序必须是顺时针或者逆时针绘制的,这样才能正确地绘制以顶点为边界点的图形,顶点绘制的顺序参考mesh.triangles
using UnityEngine;
using System.Collections;
[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]
public class CustomMesh : MonoBehaviour {
}
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
//使用前最好先锁定Inspector面板!
[CustomEditor(typeof(CustomMesh))]
public class CustomMeshEditor : Editor {
private List<Vector3> vertices = new List<Vector3>();
private int[] triangles;
void OnSceneGUI()
{
CustomMesh customMesh = (CustomMesh)target;
for (int i = 0; i < vertices.Count; i++)
{
Handles.PositionHandle(vertices[i], Quaternion.identity);
Handles.Label(vertices[i], i.ToString());
}
if (vertices.Count > 1)
{
Handles.DrawPolyLine(vertices.ToArray());
Handles.DrawLine(vertices[vertices.Count - 1], vertices[0]);
}
//在OnSceneGUI()中只能通过Handles来绘制新视图
//如果你想引入GUI的元素哪么就需要使用BeginGUI()和EndGUI()组合的使用。
Handles.BeginGUI();
GUILayout.BeginArea(new Rect(0, 0, 100, 100));
if (GUILayout.Button("创建点"))
{
vertices.Add(customMesh.transform.position);
}
if (GUILayout.Button("撤销点"))
{
vertices.RemoveAt(vertices.Count - 1);
}
if (GUILayout.Button("导出mesh"))
{
Mesh mesh = new Mesh();
int triangleAmount = vertices.Count - 2;
triangles = new int[3 * triangleAmount];
//根据三角形的个数,来计算绘制三角形的顶点顺序(索引)
//顺序必须为顺时针或者逆时针
for (int i = 0; i < triangleAmount; i++)
{
triangles[3 * i] = 0;//固定第一个点
triangles[3 * i + 1] = i + 1;
triangles[3 * i + 2] = i + 2;
}
mesh.vertices = vertices.ToArray();
mesh.triangles = triangles;
AssetDatabase.CreateAsset(mesh, "Assets/CustomMesh.asset");
}
GUILayout.EndArea();
Handles.EndGUI();
}
}
///
实例(属性图的制作):
using UnityEngine;
using System.Collections.Generic;
[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]
public class CreatePentagon : MonoBehaviour {
public Transform[] verticesTra;//赋值顺序为顺时针或者逆时针
public float[] proportion;//比例
void Start()
{
List<Vector3> vertices = new List<Vector3>();
for (int i = 0; i < verticesTra.Length; i++)
{
Vector3 pos = (verticesTra[i].position - transform.position) * proportion[i];
vertices.Add(pos);
}
DrawPentagon(vertices);
}
void DrawPentagon(List<Vector3> vertices)
{
Mesh mesh = new Mesh();
int triangleAmount = vertices.Count - 2;
int[] triangles = new int[3 * triangleAmount];
//根据三角形的个数,来计算绘制三角形的顶点顺序(索引)
//顺序必须为顺时针或者逆时针
for (int i = 0; i < triangleAmount; i++)
{
triangles[3 * i] = 0;//固定第一个点
triangles[3 * i + 1] = i + 1;
triangles[3 * i + 2] = i + 2;
}
mesh.vertices = vertices.ToArray();
mesh.triangles = triangles;
GetComponent<MeshFilter>().mesh = mesh;
}
}