(1)載入場景
場景非同步載入的**比較簡單,如下所示:
privateienumerator loadlevelcoroutine()
(2)載入場景物件
主要包含以下細分步驟:
publicclass
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解析的主體**如下所示:
privatevoid
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...