首先貼上效果圖
上面兩個圖就是使用Unity的Mesh畫出的正五邊形和正八變形。
無論是研究過Mesh還是隻是有所聽說,應該都聽過網格,上面兩個圖形就是利用來網格的特性來實現的。
首先講一下Mesh原理
無論渲染什麼圖形,就需要用到mesh將圖形的形狀展示出來,Unity中所有圖形都是三角面組成,例如一個正方形
一個正方形是由定點組成的兩個三角片組成(三角形a和b),012組成三角形a,023組成三角形b,由此組成了一個正方形。注意,三角形的三個頂點排列必須是順時針,如果是逆時針,在反面纔會看到。
多邊形也是類似原理,如圖
代碼
public Button DrawPolygonButton;
public InputField countInput;
[HideInInspector]
public GameObject drawGo;
[HideInInspector]
public MeshFilter meshFilter;
[HideInInspector]
public MeshRenderer meshRenderer;
int count;
void Awake(){
DrawPolygonButton.transform.GetChild (0).GetComponent<Text> ().text = "DrawPolygon";
DrawPolygonButton.onClick.AddListener (DrawPolygon);
countInput.onValueChanged.AddListener ((string a) => {
if (!string.IsNullOrEmpty(a)){
count = System.Convert.ToInt32(a);
}
});
}
Mesh PrepareMesh(){
drawGo = new GameObject ("DrawWithMesh");
drawGo.transform.SetParent (transform);
drawGo.transform.localPosition = Vector3.zero;
drawGo.transform.localScale = Vector3.one;
meshRenderer = drawGo.AddComponent<MeshRenderer> ();
meshRenderer.material = mat;
meshFilter = drawGo.AddComponent<MeshFilter> ();
Mesh mesh = meshFilter.mesh;
mesh.Clear();
return mesh;
}
void DrawPolygon(){
int circle_count = count;
Mesh mesh = PrepareMesh ();
Vector3[] vertices = new Vector3[circle_count + 1];
vertices[0] = Vector3.zero;
float pre_rad = Mathf.Deg2Rad * 360 / circle_count;
for (int i = 0; i < circle_count; i++) {
float deg = -i * pre_rad;
float x = Mathf.Cos (deg);
float y = Mathf.Sin (deg);
vertices [i + 1] = new Vector3 (x, y, 0) * 3;
}
mesh.vertices = vertices;
int[] triangles = new int[circle_count * 3];
for (int i = 0; i < triangles.Length; i+=3) {
int first = 0;
int second = i / 3 + 1;
int third = second + 1;
if (third > circle_count) {
third = 1;
}
triangles [i] = first;
triangles [i + 1] = second;
triangles [i + 2] = third;
}
mesh.triangles = triangles;
}
如果要畫圓形,則適量增加count數量就行
其他
更多Blog請見:https://yiyuan1130.github.io/
Github地址:https://github.com/yiyuan1130