AssetBundle系列 場景資源之解包(二)

2022-02-08 06:54:55 字數 3501 閱讀 1651

(1)載入場景

場景非同步載入的**比較簡單,如下所示:

private

ienumerator loadlevelcoroutine()

(2)載入場景物件

主要包含以下細分步驟:

public

class

xmlscenegameobjectprop

public

string

name;

public

string

group;

//transform資訊

public

float

posx, posy, posz;

public

float

rotx, roty, rotz;

public

float

scalex, scaley, scalez;

//mesh列表,乙個模型可以包含多個meshrenderer

public listlstmesh = new list();

}

xml解析的主體**如下所示:

private

void

parsechildnode(xmlelement xmlgroup, xmlelement xmlchild)

//tranform節點

xmlnode xmltransform = xmlchild.selectsinglenode("

transform");

//meshrenderer節點

xmlnode xmlmeshrenderer = xmlchild.selectsinglenode("

meshrenderer");

if (xmltransform != null && xmltransform is

xmlelement)

if (xmlmeshrenderer != null && xmlmeshrenderer is

xmlelement)

xmlnode xmlcolor = node.selectsinglenode("

color");

if (xmlcolor != null && xmlcolor is

xmlelement)

newchild.lstmesh.add(mesh);}}

lstgameobjectprop.add(newchild);

}

b、載入場景物件asset

同時開啟多個coroutine進行www的loadfromcacheordownload操作,經測試開啟的www執行緒越多,速度會越快,但是需要考慮實際的機器或平台的承載能力。

如果一定要在此處從網上download資源的話,執行緒數最好設為5個,很多平台有自己的限制,比如有的網頁瀏覽器只能同時開6個等等......

//

同時開啟的coroutine的數目

private

const

int threadnum = 100

;

//記錄每個載入執行緒的進度,只有每個執行緒都加在結束了,場景載入才算完成

private

int arrthreadproggress = new

int[threadnum];

//載入完成後的回掉

public

delegate

void

loadfinishdelegate();

public loadfinishdelegate onloadfinish = null;

//private list lstres = new list();

//是否載入完畢的標記

private

bool hasfinished = false

;

private

void

loadasset()

}private ienumerator loadassetcoroutine(int

threadindex)

arrthreadproggress[threadindex] +=threadnum;

}//if (isloadfinished() && hasfinished == false

)

}}

上面的黑體標出的**是是實際的載入**,具體實現已經在帖子「assetbundle系列——資源的載入、簡易的資源管理器」中講解過了,此處不再贅述。

c、例項化場景物件

//

例項化 gameobject goins = gameobject.instantiate(asset) as

gameobject;

goins.name =goprop.name;

//設定父節點

gameobject gogroup = null

; dicgroupgameobject.trygetvalue(goprop.group,

outgogroup);

if (gogroup != null

) goins.transform.parent =gogroup.transform;

else

goins.transform.parent =goroot.transform;

//設定transform

goins.transform.position = new

vector3(goprop.posx, goprop.posy, goprop.posz);

goins.transform.eulerangles = new

vector3(goprop.rotx, goprop.roty, goprop.rotz);

goins.transform.localscale = new

vector3(goprop.scalex, goprop.scaley, goprop.scalez);

//設定shader、lightmap

int index = 0

;

int meshcount =goprop.lstmesh.count;

foreach (meshrenderer mr in goins.gameobject.getcomponentsinchildren(true

))

}index++;

}}

本帖主要是關於assetbundle的處理方法,關於物體材質的例項化邏輯,有很多種做法,我這只是提供了其中一種做法。其中有一點需要注意的,就是material和sharedmaterial的區別,上面例項化中的**,我用的是sharedmaterial來設定,使用material是有問題的,因為每一次對material的賦值會導致生成乙個materil的instance產生。

小明爬坑系列 AssetBundle實戰

一.建立assetbundle檔案 將asset資料進行assetbundle的 如下 1 using unityengine 2using system.collections 3using system.collections.generic 4using system.io 5using un...

新版AssetBundle使用

ab流程 友情提示 設定assetbundle 從上述的說明感覺這個new出來的是乙個空資料夾識,在設定資源時這個資料夾的名字作為了標識來使用。而remove unused names按鈕就是一鍵刪除空資料夾。生成assetbundle public class createassetbundles...

AssetBundle資源載入

一 第一種載入方式本地相對路徑資源載入 assetbundle ab assetbundle.loadfromfile assetbundle sphere.unity3d 本地載入相對路徑載入 載入ab包 gameobject cube ab.loadasset sphere 獲取ab包 inst...