1. 程式人生 > >unity 中帶貼圖以及動畫的模型檔案轉為 lowpoly 風格的方法

unity 中帶貼圖以及動畫的模型檔案轉為 lowpoly 風格的方法

本篇講述的是使用程式碼來修改的方法,其實unity已經給我們提供了設定的方法:Normals選擇Calculate,Smoothing Angle調整為0即可。

原文章中主要是沒有提到UV以及骨骼與定點的繫結方法。

由於實現lowpoly的風格其實就是將原來的1個點複製為多個點,所以我們只要在複製定點的過程中將相應的頂點屬性一同複製即可。

這裡直接給出完整程式碼:

using UnityEngine;
using UnityEditor;

public class LowPolyTool : MonoBehaviour {
    //製作Unity頂部選單欄
    [MenuItem("LowPolyTool/LowPoly")]
    static void LowPoly()
    {
        Transform[] transforms = Selection.transforms;

        for (int i = 0; i < transforms.Length; i++){
            LowPoly(transforms[i]);
        }

    }

    static void LowPoly(Transform t){

        MeshFilter meshFilter = t.GetComponent<MeshFilter>();  
        Mesh mesh = meshFilter.sharedMesh;  

        Vector3[] oldVerts = mesh.vertices;//儲存當前Mesh頂點  
        int[] triangles = mesh.triangles;//三角索引陣列  
        Vector2[] olduvs = mesh.uv;
        BoneWeight[] oldBoneWeights = mesh.boneWeights;

        Vector3[] verts = new Vector3[triangles.Length];//用於儲存新的頂點資訊 
        Vector2[] uvs = new Vector2[triangles.Length];//用於儲存新的uv資訊 
        BoneWeight[] boneWeights = new BoneWeight[triangles.Length];//用於儲存新的骨骼資訊 

        for (int i = 0; i < triangles.Length; i++)
        {
            verts[i] = oldVerts[triangles[i]];
            uvs[i] = olduvs[triangles[i]];
            boneWeights[i] = oldBoneWeights[triangles[i]];
            triangles[i] = i;
        }


        mesh.vertices = verts;//更新Mesh頂點  
        mesh.triangles = triangles;//更新索引 
        mesh.uv = uvs;//更新uv資訊
        mesh.boneWeights = boneWeights;//更新骨骼資訊

        mesh.RecalculateBounds();//重新計算邊界  
        mesh.RecalculateNormals();//重新計演算法線  
    }

}

將指令碼放到任意Editor資料夾中,會在選單欄看到LowPolyTool/LowPoly選賢,將模型檔案拖入場景中並選中,點選LowPoly既可。

注意這裡會直接修改原模型檔案的資料,所以在修改之前請做好備份。

效果:


這裡我只是隨便找了一個模型,實際上模型的頂點數越少實現出來的效果會越好,就是所謂的低模。