1. 程式人生 > >unity編輯器拓展七——指令碼建立模型

unity編輯器拓展七——指令碼建立模型

描述:

    其實這個教程到處都是,我真正想做的是把模型分成N個等分,實現動態載入。但是在網上搜索了很久,也沒有搜尋

到合適的方法,要麼就是不寫清楚,捨不得把程式碼全部放出來。要麼就是自帶地形的切割,最想要的是,t4m 刷完後直

接將模型分成N分,所以只能苦逼的從最mesh最基礎的開始學吧。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System;

public class CreatMesh : Editor {


    [MenuItem("tool/creatMesh")]
    static void CreaMesh()
    {
         creatVertAadTriangels();

    }

    //建立頂點 三角面
    static void creatVertAadTriangels()
    {

        /*mesh屬性
         * 長寬
         * 段數
         */
        Vector2 size = new Vector3(10, 10); //長寬(因為是平面,所以就xy了 不要高度了)
        Vector2 segment =new Vector2 (10,10);//xy段數
        


        /*mesh組成部分
         * 頂點
         * uv
         * 三角形索引
         * 法線
         */
        Vector3[] verters;//頂點陣列
        Vector2[] uv;//uv陣列
        int[] triangles; //三角形索引



        //1.頂點陣列賦值
        int countVert = Mathf.FloorToInt ((segment.x + 1) * (segment.y + 1)); //根據長寬計算出總的頂點數 轉換成int型別
        float w = size.x / segment.x; //計算每一段的寬度
        float h = size.y / segment.y; //計算每一段的長度

        int index01 = 0;
        verters = new Vector3[countVert];
        uv = new Vector2[countVert];
        for (int i = 0; i < segment.y + 1; i++)
        {
            for (int j = 0; j < segment.x + 1; j++)
            {
                verters[index01] = new Vector3(j * w, 0, i * h); //建立每個點 (按照xy的段數距離)並且給頂點陣列賦值

                
             
                float u = j / segment.x;   //每個點在u上面的位置
                float v = i / segment.y;   //每個點在v上面的位置

                uv[index01] = new Vector2(u, v); //將每個點的uv加到uv數組裡面
               

                index01++;
            }
        }


        Vector2[] uv02 = new Vector2[] {new Vector2(0,0), new Vector2(0.5f, 0), new Vector2(1, 0), new Vector2(0, 1), new Vector2(0.5f, 1), new Vector2(1, 1), };



        //3.三角形
        int countVertTri = Mathf.FloorToInt ( segment.x * segment.y * 6); //三角形頂點總數:每1*1段有兩個三角形組成  兩個三角形有6個點(包含公用的兩個點),所有總點數 是段數*6

        int index02 = 0;
        triangles = new int[countVertTri];
        for (int i = 0; i < segment.y; i++)
        {
            for (int j = 0; j < segment.x; j++)
            {
                //順時針
                int role = Mathf.FloorToInt (segment.x) + 1; //x方向頂點數
                int self = j + (i * role);       // i=0 j=0的時候 第0行第0個點  i=0 j=1的時候 第0行第1個點
                int next = j + ((i + 1) * role); // i=0 j=0的時候 第1行第0個點  i=0 j=1的時候 第1行第1個點

                //第一個正方形
                //順時針
                //第一個三角形
                triangles[index02] = self;         //i=0 j=0的時候  第0行0個點
                triangles[index02 + 1] = next;     //i=0 j=0的時候  第1行0個點
                triangles[index02 + 2] = next + 1; //i=0 j=0的時候  第1行1個點


                //第二個三角形
                triangles[index02 + 3] = self;     //i=0 j=0的時候  第0行0個點
                triangles[index02 + 4] = next + 1; //i=0 j=0的時候  第1行1個點
                triangles[index02 + 5] = self + 1; //i=0 j=0的時候  第0行1個點
         //一次可以實現6個點的排序,兩個三角形 拼成一個正方形
                //隨著j index的增加 繪製第一行的所有正方形 隨著i的增加 一行一行的向上繪製
                index02 += 6;
            }
        }

       


    //渲染
    //新建mesh,並對它的屬性賦值
    Mesh me = new Mesh();
        me.vertices = verters; //mesh頂點賦值
        me.triangles = triangles; //mesh三角形索引賦值
        me.uv = uv;
        me.RecalculateNormals(); //自動新增法線資訊
        //新建材質球
        Material ma = new Material(Shader.Find("Diffuse"));

        //新建模型,將mesh跟material給他賦值
        GameObject  m_gameObject = new GameObject("m_newOBJ");//新建一個gameobject
        m_gameObject.AddComponent<MeshFilter>().sharedMesh = me; //增加meshFilter元件
        m_gameObject.AddComponent<MeshRenderer>().sharedMaterial = ma;//增加MeshRenderer元件
    }

}