【Unity 插件推薦】UniMeshCombiner 網格合併大師,優化效能必備神器!

目錄

前言

 

今天要推薦的是 UniMeshCombiner,一款專為 Unity 開發者設計的高效網格合併工具,能夠將場景中大量的 Mesh 結構合併成單一物件,藉此大幅減少 Draw Call 數量,優化遊戲效能!

無論是【大型場景的建模】、【角色配件整合】,還是動態物件的效能調整,UniMeshCombiner 都能提供【穩定】又【靈活】的解決方案。

如果你曾因場景中物件過多導致【FPS 驟降】或【效能瓶頸】,那麼 UniMeshCombiner 將會是你不可或缺的效能優化利器!

UniMeshCombiner 網格合併大師,優化效能必備神器!

 

 

Unity UniMeshCombiner 插件介紹

 

UniMeshCombiner 的核心理念,是透過合併【Mesh】與【材質】,有效降低 Unity 引擎在渲染過程中的資源消耗。

與傳統手動合併不同,UniMeshCombiner 提供【更直觀的介面】與【自動化流程】,開發者只需簡單操作,即可快速完成場景優化。

同時,插件支援多種使用模式,包含【靜態物件合併】與【動態合併】,並能靈活控制合併後的材質設定,避免因合併而犧牲【畫質】或【特效表現】。

UniMeshCombiner 插件示意圖

 

功能特色

  1. 靈活的控制功能
    支援選擇性合併,可針對場景中指定【物件】或【群組】進行優化,並且提供【自動材質合併】與【UV 調整】,確保【合併後的效果】與【原始畫面】一致。
  2. 智能化設計與高效工作流
    內建直觀的編輯器工具,讓開發者能以可視化方式調整合併設定,且與 Unity 的【Prefab】、【LOD】系統高度相容,避免破壞現有工作流。
  3. 高效性能與穩定性
    大幅減少 Draw Call 數量,有效提升【FPS】與【整體渲染效率】,適用於【大型場景】或【行動裝置專案】,確保遊戲在多平台都能穩定運行。

 

適用場景

  1. 大型場景優化
    在【開放世界】或【室內外場景】中,快速合併靜態物件,減輕 GPU 負擔。
  2. 角色與配件整合
    將角色不需更換的配件,如【盔甲】、【裝飾物】合併為單一 Mesh,降低 Draw Call,【減輕渲染壓力】並【保持外觀一致】。
  3. 行動裝置遊戲
    對於硬體效能有限的【手機】與【平板】遊戲,能顯著改善效能流暢度。
【Unity 插件推薦】UniMeshCombiner 網格合併大師,優化效能必備神器!

 

 

Unity UniMeshCombiner 插件下載安裝

 

github 網址:UniMeshCombiner

 

下載 unitypackage 包,導入專案裡即可。

這個插件其實很簡單,總共只有一個腳本。

這個插件其實很簡單,總共只有一個腳本。

 

using System.Collections.Generic;

using System.IO;

using UnityEditor;

using UnityEngine;

namespace UniMeshCombiner

{

   public class UniMeshCombinerWindow : EditorWindow

   {
       private DefaultAsset _exportDirectory = null;

       private GameObject _combineTarget = null;

       private bool _exportMesh;

       [MenuItem("Window/UniMeshCombiner")]

       static void Open()

       {

           GetWindow<UniMeshCombinerWindow>("UniMeshCombiner").Show();

       }

       void OnGUI()

       {

           _combineTarget =

(GameObject)EditorGUILayout.ObjectField("CombineTarget", _combineTarget, typeof(GameObject), true);

           _exportMesh = EditorGUILayout.Toggle("Export Mesh", _exportMesh);

           _exportDirectory = (DefaultAsset) EditorGUILayout.ObjectField("Export Directory", _exportDirectory, typeof(DefaultAsset), true);

           if (GUILayout.Button("Combine"))

           {

               if (_combineTarget == null)

               {

                   return;

               }

               CombineMesh();

           }

       }

       void CombineMesh()

       {

           var meshFilters = _combineTarget.GetComponentsInChildren<MeshFilter>();

           var combineMeshInstanceDictionary = new Dictionary<Material, List<CombineInstance>>();

           foreach (var meshFilter in meshFilters)

           {

               var mesh = meshFilter.sharedMesh;

               var vertices = new List<Vector3>();

               var materials = meshFilter.GetComponent<Renderer>().sharedMaterials;

               var subMeshCount = meshFilter.sharedMesh.subMeshCount;

               mesh.GetVertices(vertices);

               for (var i = 0; i < subMeshCount; i++)

               {

                   var material = materials[i];

                   var triangles = new List<int>();

                   mesh.GetTriangles(triangles, i);

                   var newMesh = new Mesh

                   {

                       vertices = vertices.ToArray(), triangles = triangles.ToArray(), uv = mesh.uv, normals = mesh.normals

                   };

                   if (!combineMeshInstanceDictionary.ContainsKey(material))

                   {

                       combineMeshInstanceDictionary.Add(material, new List<CombineInstance>());

                   }

                   var combineInstance = new CombineInstance

                       {transform = meshFilter.transform.localToWorldMatrix, mesh = newMesh};

                   combineMeshInstanceDictionary[material].Add(combineInstance);

               }

           }

           _combineTarget.SetActive(false);

           foreach (var kvp in combineMeshInstanceDictionary)

           {

               var newObject = new GameObject(kvp.Key.name);

               var meshRenderer = newObject.AddComponent<MeshRenderer>();

               var meshFilter = newObject.AddComponent<MeshFilter>();

               meshRenderer.material = kvp.Key;

               var mesh = new Mesh();

               mesh.CombineMeshes(kvp.Value.ToArray());

               Unwrapping.GenerateSecondaryUVSet(mesh);

               meshFilter.sharedMesh = mesh;

               newObject.transform.parent = _combineTarget.transform.parent;

               if (!_exportMesh || _exportDirectory == null)

               {

                   continue;

               }

               ExportMesh(mesh, kvp.Key.name);

           }

       }

       void ExportMesh(Mesh mesh, string fileName)

       {

           var exportDirectoryPath = AssetDatabase.GetAssetPath(_exportDirectory);

           if (Path.GetExtension(fileName) != ".asset")

           {

               fileName += ".asset";

           }

           var exportPath = Path.Combine(exportDirectoryPath, fileName);

           AssetDatabase.CreateAsset(mesh, exportPath);

       }

   }

}

 

Unity UniMeshCombiner 使用實例

 

導入模型

我們隨便在 Unity 的商店,導入一輛車的模型:Modern Cartoon Car Ferruccio

 

可以看到,模型是由幾個部分組成的。

可以看到,模型是由幾個部分組成的。

 

選擇 Windo -> UniMeshCombiner 以開啟 UniMeshCombiner 窗口

選擇 Windo -> UniMeshCombiner 以開啟 UniMeshCombiner 窗口

 

選擇 Windo -> UniMeshCombiner 以開啟 UniMeshCombiner 窗口

 

將前面的車模型設定為 Combine Target Filed (合併目標),如果要匯出網格資產,請選取 Export Mesh Toggle 和 Select Directory,最後按下Combie 按鈕!

將前面的車模型設定為 Combine Target Filed (合併目標),如果要匯出網格資產,請選取 Export Mesh Toggle 和 Select Directory,最後按下Combie 按鈕!

 

結果,可以看到車子從多個部分合成了 3 個部分。

結果,可以看到車子從多個部分合成了 3 個部分。

 

那為什麼是 3 個部分呢?因為 UniMeshCombiner 是依材質合併網格,我們的模型有 3 個材質。

那為什麼是 3 個部分呢?因為 UniMeshCombiner 是依材質合併網格,我們的模型有 3 個材質。

 

 

Unity UniMeshCombiner 網格合併大師相關網站 & 插件下載點

 

【UniMeshCombiner】

Github 網址:UniMeshCombiner

Gitee 網址:UniMeshCombiner

————————————————

 

更多好用插件:【Unity 好用插件推薦】持續更新,一起讓遊戲開發事半功倍!

 

 

 

本文原創(或整理)於亞洲電玩通,未經作者與本站同意不得隨意引用、轉載、改編或截錄。

特約作家簡介

X
A
Y
B
JamXu的頭像
JamXu
10年遊戲研發
20年遊戲玩家
30年遊戲人生

經中華網龍遊戲 企劃進入遊戲圈,然後被雷打到去學 程式前後端又學了點 設計帶帶幾個研發團隊,見證了 3D 渲染技術及遊戲引擎互相進步,也見證了研發代理的更迭與博弈遊戲的興起,再毅然研究起 SEO 網路行銷社群廣告投放,深信自研自賣才是最大贏家,期望能為台灣研發重回輝煌時光貢獻一點力量。如果你也有 遊戲夢,歡迎交流認識。


支持贊助 / DONATE

 

亞洲電玩通只是很小的力量,但仍希望為復甦台灣遊戲研發貢獻一點動能,如果您喜歡亞洲電玩通的文章,或是覺得它們對您有幫助,歡迎給予一些支持鼓勵,不論是按讚追蹤或是贊助,讓亞洲電玩通持續產出,感謝。

亞洲電玩通AsiaGameMaster - Steam 遊戲鑑賞家
亞洲電玩通AsiaGameMaster - FB 粉絲專頁
亞洲電玩通AsiaGameMaster - IG 粉絲專頁
亞洲電玩通AsiaGameMaster - Twitter
亞洲電玩通AsiaGameMaster - Yoytube 粉絲專頁
亞洲電玩通AsiaGameMaster - Tiktok

BTC

亞洲電玩通AsiaGameMaster - BTC 鏈贊助地址

bc1psp8nnerlepv56nyfha6mqwnp3yr7qqjdw44c6qt5lx5r2urma7fqykxvwj

 

ETH

亞洲電玩通AsiaGameMaster - ETH 鏈贊助地址

0xB2231557bc418201922DD7C2673ec97E67E35F83

 

TRON

tron-qrcode亞洲電玩通AsiaGameMaster - TRON 鏈贊助地址

TAomNj4L6vMJuaJmbWUdmT1uAWYPf9vDjp

延伸閱讀