前言
Mesh类是Unity用脚本创建和修改3D模型的重要脚本类。
本文以自定义编译器菜单的方式,实现了Unity创建正二十面体的功能扩展。
博文首发:http://blog.csdn.net/duzixi
添加了各种Shader材质球+Halo的效果图:
关于Mesh编程相关内容网上有很多资料,这里就不再赘述了。
步骤一:
创建Editor文件夹(若有就不用),将以下源代码保存为MyEditor.cs文件,存入文件夹中。
源代码:
-
-
-
-
-
-
- using UnityEngine;
- using UnityEditor;
- using System.Collections;
-
- public class MyEditor : EditorWindow {
-
-
-
- static Mesh mesh;
- static Vector3[] Vs;
- static Vector2[] UVs;
- static Vector3[] normals;
- static Vector4[] tangents;
- static int[] Ts;
-
-
- [MenuItem("GameObject/Create Other/正二十面体", false, -30)]
- static void CreateRegular(){
-
- Vs = new Vector3[12];
-
-
- float m = Mathf.Sqrt(50 - 10 * Mathf.Sqrt(5)) / 10;
- float n = Mathf.Sqrt(50 + 10 * Mathf.Sqrt(5)) / 10;
-
-
- Vs[0] = new Vector3( m, 0, n);
- Vs[1] = new Vector3( m, 0,-n);
- Vs[2] = new Vector3(-m, 0, n);
- Vs[3] = new Vector3(-m, 0,-n);
- Vs[4] = new Vector3( 0, n, m);
- Vs[5] = new Vector3( 0,-n, m);
- Vs[6] = new Vector3( 0, n,-m);
- Vs[7] = new Vector3( 0,-n,-m);
- Vs[8] = new Vector3( n, m, 0);
- Vs[9] = new Vector3(-n, m, 0);
- Vs[10] = new Vector3( n,-m, 0);
- Vs[11] = new Vector3(-n,-m, 0);
-
-
- Ts = new int[] {6,4,8, 9,4,6, 6,3,9, 6,1,3, 6,8,1,
- 8,10,1, 8,0,10, 8,4,0, 4,2,0, 4,9,2,
- 9,11,2, 9,3,11, 3,1,7, 1,10,7, 10,0,5,
- 0,2,5, 2,11,5, 3,7,11, 5,11,7, 10,5,7};
-
-
- Vector3[] newVs = new Vector3[Ts.Length];
- for (int i = 0; i < newVs.Length; i++) {
- Debug.Log(Vs[Ts[i]]);
- newVs[i] = Vs[Ts[i]];
- }
- Vs = newVs;
- UVs = new Vector2[Vs.Length];
- normals = new Vector3[Vs.Length];
- tangents = new Vector4[Vs.Length];
-
-
- for (int i = 0; i < Ts.Length - 2; i+=3) {
- Vector3 normal = Vector3.Cross(Vs[i + 1] - Vs[i], Vs[i + 2] - Vs[i]);
- for (int j = 0; j < 3; j++) {
- Ts[i + j] = i + j;
- normals[i + j] = normal;
- }
- }
-
-
- for (int i = 0; i < Vs.Length; i++) {
- tangents[i] = new Vector4(-1, 0, 0, -1);
- UVs[i] = new Vector2(Vs[i].x, Vs[i].y);
- }
-
-
- CreateObjectByMesh("Icosahedron");
- }
-
-
- static void CreateObjectByMesh(string name) {
- GameObject regular = new GameObject();
- regular.name = name;
- regular.AddComponent<MeshFilter>();
- regular.AddComponent<MeshRenderer>();
-
- mesh = new Mesh();
- mesh.vertices = Vs;
- mesh.triangles = Ts;
- mesh.uv = UVs;
- mesh.normals = normals;
- mesh.tangents = tangents;
- regular.GetComponent<MeshFilter>().mesh = mesh;
- }
-
- }
步骤二:
在菜单中选择
GameObject -> Create Other -> 正二十面体
创建正二十面体游戏对象。
步骤三:
可根据喜好添加材质,选择Shander以及其他效果。
后语
正二十面体的实现有一个比较特别的地方,就是顶点数组创建了两次。
因为空间上的规律比较难搞,所以第一次是手动录入的。
但是考虑到要计算好多点法线,第二次顶点数组是根据第一次三角形顶点序列自动生成的。
此外,本例的UV坐标和切线没有太多的处理,贴图相关的功能还有待改善。