unity3d中提供了場景scene的概念,scene就是一組相關聯的遊戲物件的乙個集合,通常每個集合就是乙個場景,但是也有可能只是乙個場景的一部分!
場景中的遊戲物件是任意的,可以是hud的ui元件,場景地圖,模型等等
unity3d提供了一些切換場景的規則和方法(例如在切換場景時不銷毀某些gameobject,同步,非同步載入場景api),但是並沒有提供乙個通用的場景管理的模組(想要做到「通用」是很難的)
在實際開發中,有些開發者摒棄了scene模組,即整個遊戲只有乙個scene,然後自己實現一套「視窗」物件以及「視窗」管理模組,以達到場景管理和通訊的目的,這樣的好處在於更靈活的控制場景物件;同樣,壞處也很明顯,即工作量會很大!
我在開發中也做了一套簡單的場景管理模組,其主要功能包括:
1.使用乙個棧來儲存玩家在遊戲中場景的載入先後關係(方便back功能實現以及記錄當前場景id)
2.提供切換場景,壓棧場景,出棧場景方法
3.提供非同步載入場景,並提供載入進度(用以顯示loading條)
unity3d將元件設計模式發揮的淋漓盡致,很多開發者都可以方便靈活的製作各種外掛程式,如果足夠抽象,便可以為其它專案很方便的使用!scene manager就是其中乙個,官網位址
scene manager提供了2個場景的概念:screen和level
screen:即相互之間沒有關聯的場景模組(例如登陸場景,主選單場景,遊戲場景之間的關係),其之間並沒有嚴格的先後關係,更接近於unity3d中scene的概念
level:即遊戲場景中的關卡模組,有一定的先後關係,並且邏輯相同,scene manager為level提供了一些關卡關係的方法,包括當前關卡,上乙個關卡,關卡狀態,參考 smlevelprogress 類
這2個場景的概念在unity3d看來都是scene的意義,之所以這樣區分是為了將scene的概念更細化!
其提供了下圖的編輯介面,我們只需要建立乙個sceneconfiguration來編輯遊戲中所有scene的類別和關係
一旦scene configuration建立完成之後,即可以在第乙個「screen場景」中建立出單例類smgameenvironment例項,其
其構造方法中完成對smscenemanager與smlevelprogress例項的建立:
(注意一定要在screen場景中例項化smgameenvironment,如果是level場景,則有可能對各個level之間的關係有錯誤)
smscenemanager提供切換場景的介面(包括載入場景,載入關卡,載入第乙個關卡)
smlevelprogress用以儲存level之間的關係(包括當前level,上一level,當前level狀態)
smtransition及其子類,提供了很多方便的切換場景(包括screen和level)動畫效果,包括 淡入淡出,閃爍,**等等
(這些動畫效果都作為prefab儲存在scenemanager/resources/transitions/下)
smtransition作為基類,提供了是否非同步載入場景,實際呼叫unity3d api切換場景方法,但主要提供了乙個動畫的模板方法dotransition(),**如下:
[csharp]view plain
copy
print?
protected
virtual
ienumerator dotransition()
// wait another frame...
yield return
0;
// 第二部分:保證smtransition物件不被銷毀(完成後續動畫)
state = smtransitionstate.hold;
dontdestroyonload(gameobject);
// wait another frame...
yield return
0;
ienumerator loadlevel = doloadlevel();
while
(loadlevel.movenext())
// wait another frame...
yield return
0;
// 第三部分:新場景載入動畫
state = smtransitionstate.in;
prepare();
time = 0;
while
(process(time))
// wait another frame...
yield return
0;
destroy(gameobject);
}
在smtransition的子類中,分別實現prepare()虛方法和process(float elapsedtime)抽象方法
例如 smfadetransition 類中,通過傳入引數elapsedtime與配置淡入淡出引數duration計算得到當前進度,正交化進度,得到當前遮蓋的alpha值,並在ongui繪製,**如下:
[csharp]view plain
copy
print?
protected
override
bool
process(
float
elapsedtime)
progress = smtransitionutils.smoothprogress(0, duration, effecttime);
return
elapsedtime
}
[csharp]view plain
copy
print?
public
void
ongui()
其它smtransition子類也通過process(float elapsedtime)實現切換動畫效果!
ps: 在非同步載入場景中,scene manager中並沒有提供乙個獲取當前載入進度的介面,需要自己實現,在smtransition類中
[csharp]view plain
copy
print?
protected
virtual
yieldinstruction loadlevel() else
}
eclipse外掛程式管理
預設的外掛程式是在 eclipse home plugins目錄中的 在 eclipse home 下建立乙個pluginsnew的目錄 比如 e opensource eclipse pluginsnew 那麼就在 eclipse home pluginsnew 目錄下建立xyz目錄,目錄裡面是e...
許可權管理外掛程式
本質上,乙個可以訪問的url等於乙個許可權 使用者表class user models.model name models.charfield max length 32 pwd models.charfield max length 32 roles models.manytomanyfield ...
JMeter 外掛程式管理
jmeter管理的外掛程式包括了jmeter plugins.org上常用的外掛程式以及各種第三方外掛程式和jmeter核心外掛程式。jmeter外掛程式管理器主要管理外掛程式安裝,解除安裝,公升級等操作。安裝外掛程式管理 3 啟動jmeter,在視窗選項選單下回出現乙個 plugins manag...