日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unity网格合并_材质合并

發布時間:2024/4/14 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity网格合并_材质合并 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

寫在前面:

從優化角度,Mesh需要合并。

從換裝的角度(這里指的是換形狀、換組成部件的換裝,而不是掛點型的換裝),都需要網格合并、材質合并。如果是人物的換裝,那么需要合并SkinnedMeshRenderer,并重刷對應的骨骼列表。

?

示例:

1,新建兩個Cube,和一個Cylinder。分別作為坦克的底盤(Cube_chassis)、炮塔(Cube_turret)、炮管(Cylinder_gun)。如下圖所示。

?

2,為了測試換裝,我們加入三個材質球,調整一下顏色,然后分別賦給底盤(Cube_chassis)、炮塔(Cube_turret)、炮管(Cylinder_gun)。

?

3,把炮塔(Cube_turret)和炮管(Cylinder_gun),變成底盤(Cube_chassis)的子物體。也就是說,新的模型,是以底盤為基礎的。

?

4,用CombineMeshes方法,合并mesh。并且用代碼把【材質】也一起“合并”了。把下面的Combine_Test.cs文件,拖拽到底盤(Cube_chassis)上,之后運行。

?

[csharp]?view plain?copy

?

  • using?UnityEngine;??
  • using?System.Collections;??
  • ??
  • public?class?Combine_Test?:?MonoBehaviour?{??
  • ??
  • ????//?Use?this?for?initialization??
  • ????void?Start?()??
  • ????{??
  • ????????//----------------?先獲取材質?-------------------------??
  • ????????//獲取自身和所有子物體中所有MeshRenderer組件??
  • ????????MeshRenderer[]?meshRenderers?=?GetComponentsInChildren<MeshRenderer>();????
  • ????????//新建材質球數組??
  • ????????Material[]?mats?=?new?Material[meshRenderers.Length];????
  • ????????for?(int?i?=?0;?i?<?meshRenderers.Length;?i++)?{??
  • ????????????//生成材質球數組???
  • ????????????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)自身空間坐標的點轉換成世界空間坐標的點???
  • ????????????combine[i].transform?=?meshFilters[i].transform.localToWorldMatrix;??
  • ????????????meshFilters[i].gameObject.SetActive(false);??
  • ????????}???
  • ????????//為新的整體新建一個mesh??
  • ????????transform.GetComponent<MeshFilter>().mesh?=?new?Mesh();???
  • ????????//合并Mesh.?第二個false參數,?表示并不合并為一個網格,?而是一個子網格列表??
  • ????????transform.GetComponent<MeshFilter>().mesh.CombineMeshes(combine,?false);??
  • ????????transform.gameObject.SetActive(true);??
  • ??
  • ????????//為合并后的新Mesh指定材質?------------------------------??
  • ????????transform.GetComponent<MeshRenderer>().sharedMaterials?=?mats;???
  • ????}??
  • ??????
  • ????//?Update?is?called?once?per?frame??
  • ????void?Update?()?{??
  • ??????????
  • ????}??
  • }??

  • 5,運行效果如下。可以看到,Mesh和材質,都很好的得到了合并。坦克已經由零件,變成一個整體了!

    ?

    但是,大家會發現這個模型,產生了一些變形!難道是這樣不對,或者是bug么?不,其實不用擔心。這是因為前面用的Cube、Cylinder 等模擬底盤炮塔,手動調節了他們的縮放比例放造成的。如果以某個組件為根物體,那么它的縮放比例,直接影響合并后生成的新物體。各個部件的縮放比都會按它走!。

    也就是說,如果你想合并后不變形,就不要更改根物體的縮放比例。

    ?

    ?

    ?

    參考:

    ?

    關鍵函數,就是下面這個合并網格的函數了:

    CombineMeshes(CombineInstance[]combine, boolmergeSubMeshes?= true, booluseMatrices?= true);

    ?

    Unity官網,關于網格合并的例子:

    http://docs.unity3d.com/ScriptReference/Mesh.CombineMeshes.html?

    ?

    程序員俱樂部-Unity3d網格合并:

    http://www.cxyclub.cn/n/54078/

    轉載于:https://my.oschina.net/u/2874878/blog/736632

    總結

    以上是生活随笔為你收集整理的Unity网格合并_材质合并的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。