生活随笔
收集整理的這篇文章主要介紹了
Unity网格合并_材质合并
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
寫在前面:
從優(yōu)化角度,Mesh需要合并。
從換裝的角度(這里指的是換形狀、換組成部件的換裝,而不是掛點(diǎn)型的換裝),都需要網(wǎng)格合并、材質(zhì)合并。如果是人物的換裝,那么需要合并SkinnedMeshRenderer,并重刷對應(yīng)的骨骼列表。
?
示例:
1,新建兩個Cube,和一個Cylinder。分別作為坦克的底盤(Cube_chassis)、炮塔(Cube_turret)、炮管(Cylinder_gun)。如下圖所示。
?
2,為了測試換裝,我們加入三個材質(zhì)球,調(diào)整一下顏色,然后分別賦給底盤(Cube_chassis)、炮塔(Cube_turret)、炮管(Cylinder_gun)。
?
3,把炮塔(Cube_turret)和炮管(Cylinder_gun),變成底盤(Cube_chassis)的子物體。也就是說,新的模型,是以底盤為基礎(chǔ)的。
?
4,用CombineMeshes方法,合并mesh。并且用代碼把【材質(zhì)】也一起“合并”了。把下面的Combine_Test.cs文件,拖拽到底盤(Cube_chassis)上,之后運(yùn)行。
?
[csharp]?view plain?copy
?
using?UnityEngine;??using?System.Collections;????public?class?Combine_Test?:?MonoBehaviour?{????????//?Use?this?for?initialization??????void?Start?()??????{??????????//----------------?先獲取材質(zhì)?-------------------------??????????//獲取自身和所有子物體中所有MeshRenderer組件??????????MeshRenderer[]?meshRenderers?=?GetComponentsInChildren<MeshRenderer>();????????????//新建材質(zhì)球數(shù)組??????????Material[]?mats?=?new?Material[meshRenderers.Length];????????????for?(int?i?=?0;?i?<?meshRenderers.Length;?i++)?{??????????????//生成材質(zhì)球數(shù)組???????????????mats[i]?=?meshRenderers[i].sharedMaterial;?????????????}??????????//----------------?合并?Mesh?-------------------------??????????//獲取自身和所有子物體中所有MeshFilter組件??????????MeshFilter[]?meshFilters?=?GetComponentsInChildren<MeshFilter>();????????????CombineInstance[]?combine?=?new?CombineInstance[meshFilters.Length];?????????????for?(int?i?=?0;?i?<?meshFilters.Length;?i++)?{??????????????combine[i].mesh?=?meshFilters[i].sharedMesh;??????????????//矩陣(Matrix)自身空間坐標(biāo)的點(diǎn)轉(zhuǎn)換成世界空間坐標(biāo)的點(diǎn)???????????????combine[i].transform?=?meshFilters[i].transform.localToWorldMatrix;??????????????meshFilters[i].gameObject.SetActive(false);??????????}???????????//為新的整體新建一個mesh??????????transform.GetComponent<MeshFilter>().mesh?=?new?Mesh();???????????//合并Mesh.?第二個false參數(shù),?表示并不合并為一個網(wǎng)格,?而是一個子網(wǎng)格列表??????????transform.GetComponent<MeshFilter>().mesh.CombineMeshes(combine,?false);??????????transform.gameObject.SetActive(true);????????????//為合并后的新Mesh指定材質(zhì)?------------------------------??????????transform.GetComponent<MeshRenderer>().sharedMaterials?=?mats;???????}????????????//?Update?is?called?once?per?frame??????void?Update?()?{????????????????}??}??
5,運(yùn)行效果如下。可以看到,Mesh和材質(zhì),都很好的得到了合并。坦克已經(jīng)由零件,變成一個整體了!
?
但是,大家會發(fā)現(xiàn)這個模型,產(chǎn)生了一些變形!難道是這樣不對,或者是bug么?不,其實(shí)不用擔(dān)心。這是因?yàn)榍懊嬗玫腃ube、Cylinder 等模擬底盤炮塔,手動調(diào)節(jié)了他們的縮放比例放造成的。如果以某個組件為根物體,那么它的縮放比例,直接影響合并后生成的新物體。各個部件的縮放比都會按它走!。
也就是說,如果你想合并后不變形,就不要更改根物體的縮放比例。
?
?
?
參考:
?
關(guān)鍵函數(shù),就是下面這個合并網(wǎng)格的函數(shù)了:
CombineMeshes(CombineInstance[]combine, boolmergeSubMeshes?= true, booluseMatrices?= true);
?
Unity官網(wǎng),關(guān)于網(wǎng)格合并的例子:
http://docs.unity3d.com/ScriptReference/Mesh.CombineMeshes.html?
?
程序員俱樂部-Unity3d網(wǎng)格合并:
http://www.cxyclub.cn/n/54078/
轉(zhuǎn)載于:https://my.oschina.net/u/2874878/blog/736632
總結(jié)
以上是生活随笔為你收集整理的Unity网格合并_材质合并的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。