国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

Unity換裝系統(tǒng)(2)

2019-11-09 13:42:26
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
引言上一篇介紹了替換mesh數(shù)據(jù)的換裝方法。本次繼續(xù)介紹換裝系統(tǒng),換裝系統(tǒng)除了替換外觀,通常還要考慮到性能的因素。本篇主要介紹通過(guò)CombineMeshes對(duì)skinnenMesh進(jìn)行合并,達(dá)到對(duì)性能進(jìn)行優(yōu)化的目的。CombineMeshes該接口是將不同的mesh合并到同一個(gè)mesh中以達(dá)到優(yōu)化性能的目的。其函數(shù)原型如下:public void CombineMeshes(CombineInstance[] combine, bool mergeSubMeshes = true, bool useMatrices = true);當(dāng)mergeSubMeshes 為true時(shí),表示將不同的mesh合并為同一個(gè)mesh,當(dāng)待合并的mesh共享同一個(gè)材質(zhì)時(shí),將該選項(xiàng)置為true,可以獲得更好的性能。如果mergeSubMeshes 不同的mesh將被合并為不同的sub-mesh。官方文檔:CombineMeshes實(shí)現(xiàn)原理
using UnityEngine;using System.Collections;using System.Collections.Generic;public class CombineMesh : MonoBehaviour{    void OnGUI()    {        if (GUI.Button(new Rect(0, 0, 200, 30), "CombineMeshes"))        {            CombineMeshes();        }    }    public void CombineMeshes()    {        SkinnedMeshRenderer[] smr = gameObject.GetComponentsInChildren<SkinnedMeshRenderer>();        List<CombineInstance> combineInstances = new List<CombineInstance>();        List<Material> materials = new List<Material>();        List<Transform> bones = new List<Transform>();        for (int i = 0; i < smr.Length; i++)        {            materials.AddRange(smr[i].materials);            bones.AddRange(smr[i].bones);            // 收集待合并的對(duì)象信息            for (int k = 0; k < smr[i].sharedMesh.subMeshCount; k++)            {                CombineInstance ci = new CombineInstance();                ci.mesh = smr[i].sharedMesh;                ci.subMeshIndex = k;                combineInstances.Add(ci);            }            // 刪除原有模型的對(duì)象(如果有還原外觀的需求,也可以暫時(shí)將對(duì)象的活動(dòng)狀態(tài)設(shè)置為false,代碼如下)            // smr[i].gameObject.SetActive(false);            Destroy(smr[i].gameObject);        }        // 創(chuàng)建新的SkinnedMeshRenderer,合并后的mesh數(shù)據(jù)都在該對(duì)象下        SkinnedMeshRenderer combinedSMR = gameObject.GetComponent<SkinnedMeshRenderer>();        if (combinedSMR == null)        {            combinedSMR = gameObject.AddComponent<SkinnedMeshRenderer>();        }        combinedSMR.sharedMesh = new Mesh();        combinedSMR.bones = bones.ToArray();        combinedSMR.materials = materials.ToArray();        combinedSMR.rootBone = gameObject.transform;        // 由于合并mesh的material數(shù)據(jù)不統(tǒng)一,因此第二項(xiàng)參數(shù)不能設(shè)置為true        combinedSMR.sharedMesh.CombineMeshes(combineInstances.ToArray(), false, false);    }}運(yùn)行結(jié)果:可以看到合并后人物的各個(gè)部件都合并到新創(chuàng)建的skinnenMeshRenderer下了,Unity Editor中Statistics中visible skinned meshes的數(shù)量也由9個(gè)變成了1個(gè)。總結(jié)分析性能方面會(huì)由于skinned mesh renderer的減少而減輕cpu的負(fù)擔(dān),而在代碼中然而在導(dǎo)入模型資源時(shí),需要將read/write enabled打鉤。而該選項(xiàng)會(huì)增加內(nèi)存的占用,mesh為了可以在代碼中進(jìn)行修改,需要保留一份拷貝而駐留內(nèi)存。官方的說(shuō)明如下:Read/Write EnabledIf enabled, Mesh data is kept in memory so that a custom script can read and change it. Disabling this option saves memory, because Unity can unload a copy of Mesh data in the game. However, in certain cases when the Mesh is used with a Mesh Collider, this option must be enabled. 
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 河源市| 乌拉特中旗| 池州市| 岳西县| 日土县| 鄂州市| 赣州市| 永州市| 鄂尔多斯市| 特克斯县| 顺平县| 宜君县| 恩施市| 都昌县| 牡丹江市| 海口市| 池州市| 晋城| 海晏县| 庆阳市| 淳安县| 大荔县| 天津市| 珲春市| 大渡口区| 井陉县| 泰和县| 清丰县| 黄梅县| 横峰县| 若羌县| 阆中市| 辽中县| 都兰县| 桃江县| 平泉县| 威宁| 奈曼旗| 固阳县| 无锡市| 九江市|