Unity3D動態對象優化代碼分享
阿新 • • 發佈:2017-12-14
transform mil etc sts style like icop 基本 轉載
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
/// <summary>
/// 動態對象優化
/// </summary>
public class DynamicOptimization : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
/// <summary>
/// 動態對象優化
/// </summary>
/// <param name=”gameObject”>物體</param>
public void DynamicObjectOptimization(GameObject gameObject)
{
//SkinnedMeshRenderer:蒙皮網格渲染器—獲取所有帶有網格渲染器的物體(包含子物體)
SkinnedMeshRenderer[] smr = gameObject.GetComponentsInChildren<SkinnedMeshRenderer>();
//CombineInstance:用來描繪網格合並的結構,結合網格有利於性能最優化
List<CombineInstance> listCom = new List<CombineInstance>();
//所有材質集合
List<Material> listMat = new List<Material>();
//物體的基本信息集合
List<Transform> listTrans = new List<Transform>();
for(int i=0;i<smr.Length;i++)
{
//獲取材質信息
listMat.AddRange(smr[i].materials);
//物體信息—bones:用於蒙皮網格的骨骼列表
listTrans.AddRange(smr[i].bones);
//獲取共享網格的信息
for(int k=0;k<smr[i].sharedMesh.subMeshCount;k++)
{
//合並實例
CombineInstance ci = new CombineInstance();
//獲取網格信息
ci.mesh = smr[i].sharedMesh;
//獲取網格的索引信息
ci.subMeshIndex = k;
//添加
listCom.Add(ci);
}
//刪除
Destroy(smr[i].gameObject);
}
//獲取物體上的渲染器信息
SkinnedMeshRenderer smRenderer = gameObject.GetComponent<SkinnedMeshRenderer>();
//判斷是否包含有網格渲染器,如果沒有則進行添加
if(smRenderer==null)
{
smRenderer = gameObject.AddComponent<SkinnedMeshRenderer>();
}
//蒙皮網格
smRenderer.sharedMesh = new Mesh();
//骨骼列表
smRenderer.bones = listTrans.ToArray();
//材質
smRenderer.materials = new Material[] { listMat[0] };
//獲取物體的信息
smRenderer.rootBone = gameObject.transform;
//合並網格(CombineMeshes)函數的第二個參數是設置是否將多個子網格合並成一張實際的網格。
//一個實際的網格只能施加一個材質,所以只有被合並的所有網格原來使用的就是同一個材質(即共享材質)時,
//將它們真正合並才能正確應用材質。否則應該將該參數置為false,表示不實際合並這些sub mesh,
//而是將它們作為被合並後Mesh對象的sub mesh。
smRenderer.sharedMesh.CombineMeshes(listCom.ToArray(), true);
}
}
Unity3D動態對象優化代碼分享
本文地址: http://www.paobuke.com/develop/c-develop/pbk23117.html
C#靜態變量與實例變量實例分析C# 數組實例介紹(圖文)WinForm中DefWndProc、WndProc與IMessageFilter的區別 C#中實現屏蔽Ctrl+C的方法
具體解釋請仔細看註釋裏已經講解的很細致了,這裏就不多廢話了
代碼如下:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
/// <summary>
/// 動態對象優化
/// </summary>
public class DynamicOptimization : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
/// <summary>
/// 動態對象優化
/// </summary>
/// <param name=”gameObject”>物體</param>
public void DynamicObjectOptimization(GameObject gameObject)
{
//SkinnedMeshRenderer:蒙皮網格渲染器—獲取所有帶有網格渲染器的物體(包含子物體)
SkinnedMeshRenderer[] smr = gameObject.GetComponentsInChildren<SkinnedMeshRenderer>();
//CombineInstance:用來描繪網格合並的結構,結合網格有利於性能最優化
List<CombineInstance> listCom = new List<CombineInstance>();
//所有材質集合
List<Material> listMat = new List<Material>();
//物體的基本信息集合
List<Transform> listTrans = new List<Transform>();
for(int i=0;i<smr.Length;i++)
{
//獲取材質信息
listMat.AddRange(smr[i].materials);
//物體信息—bones:用於蒙皮網格的骨骼列表
listTrans.AddRange(smr[i].bones);
//獲取共享網格的信息
for(int k=0;k<smr[i].sharedMesh.subMeshCount;k++)
{
//合並實例
CombineInstance ci = new CombineInstance();
//獲取網格信息
ci.mesh = smr[i].sharedMesh;
//獲取網格的索引信息
ci.subMeshIndex = k;
//添加
listCom.Add(ci);
}
//刪除
Destroy(smr[i].gameObject);
}
//獲取物體上的渲染器信息
SkinnedMeshRenderer smRenderer = gameObject.GetComponent<SkinnedMeshRenderer>();
//判斷是否包含有網格渲染器,如果沒有則進行添加
if(smRenderer==null)
{
smRenderer = gameObject.AddComponent<SkinnedMeshRenderer>();
}
//蒙皮網格
smRenderer.sharedMesh = new Mesh();
//骨骼列表
smRenderer.bones = listTrans.ToArray();
//材質
smRenderer.materials = new Material[] { listMat[0] };
//獲取物體的信息
smRenderer.rootBone = gameObject.transform;
//合並網格(CombineMeshes)函數的第二個參數是設置是否將多個子網格合並成一張實際的網格。
//一個實際的網格只能施加一個材質,所以只有被合並的所有網格原來使用的就是同一個材質(即共享材質)時,
//將它們真正合並才能正確應用材質。否則應該將該參數置為false,表示不實際合並這些sub mesh,
//而是將它們作為被合並後Mesh對象的sub mesh。
smRenderer.sharedMesh.CombineMeshes(listCom.ToArray(), true);
}
}
以上就是本文所述的全部內容了,希望大家能夠喜歡
除聲明外,跑步客文章均為原創,轉載請以鏈接形式標明本文地址Unity3D動態對象優化代碼分享
本文地址: http://www.paobuke.com/develop/c-develop/pbk23117.html
相關內容
詳解C#中的System.Timers.Timer定時器的使用和定時自動清理內存應用C#實現的Excel文件操作類實例詳解c#讀取XML的實例代碼C#中Dictionary的作用及用法講解C#靜態變量與實例變量實例分析C# 數組實例介紹(圖文)WinForm中DefWndProc、WndProc與IMessageFilter的區別
Unity3D動態對象優化代碼分享