場景管理外掛程式

2021-06-23 05:20:06 字數 3440 閱讀 4388

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...