UE4 GamePlay框架學習

學習資料:https://zhuanlan.zhihu.com/p/22813908

新手上路,還需指正

 


GamePlay架構(一)Actor和Component

萬物皆UObject:元數據、反射生成、GC垃圾回收、序列化、編輯器可見,Class Default Object

Actor繼承了UObject,有了Replication(網絡複製),Tick,Spawn(生成)。其實Actor只是一個概念上的東西,通過添加組件使得其顯形在UE4世界中。

正因爲如此,Actor並不會自帶Transform,浪費內存空間,UE4的Bool都會用位域去儘可能利用空間。UE4將Transform封裝進了SceneComponent。大部分的Actor的(GET/SET)ActorLocation是一個封裝好的函數,內部實現是先去尋找RootComponent.

Actor通過組裝Component武裝自己的功能

Actor和Actor之間的父子關係本質是通過SceneComponent實現的(AttachToActor/AttachToComponent)

總結一下:Actor其實就是靈體,通過添加組件使得現形在世界場景中,Actor和Actor之間的父子關係是通過AttachToActor,Actor和組件是直接AttachToComponent,最終都是通過RootComponent去實現父子關係。


GamePlay架構(二)Level和World

一個World支持一個PersistentLevel,對應有多個Level,Level自帶一個ALevelScriptActor(關卡藍圖),可以在關卡中通過名字獲取Actor。一個Level對於一個AWorldSetting(書記官)。一個Level有多個Actors。

通過關卡流,可以構建龐大的開放世界。但每個Level有唯一的GameMode,通過關卡流加載關卡後,以哪個關卡爲主?其實是以當前關卡爲主

總結:Level是Actor的容器,同時劃分了World


GamePlay架構(三)WorldContext,GameInstance,Engine

WorldContext負責控制World之間的切換,也負責level的切換

 

有一個平行世界的概念,GAME模式和編輯器模式

思考:爲何Level的切換信息不放在World裏? 
因爲UE有一個邏輯,一個World只有一個PersistentLevel(見上篇),而當我們OpenLevel一個PersistentLevel的時候,實際上引擎做的是先釋放掉當前的World,然後再創建個新的World。所以如果我們把下一個Level的信息放在當前的World中,就不得不在釋放當前World前又拷貝回來一遍了。 
而LoadStreamLevel的時候,就只是在當前的World中載入對象了,所以其實就沒有這個限制了。

GameInstance是比WorldContext更高一級的類,不管Level如何切換,都不影響裏面的數據

Engine比Instance更高一級

StandLone Game:使用UGameEngine創建出唯一的World,因此直接用GameInstance保存

而對於編輯器來說,EditorWorld其實只是用來預覽,所以並不擁有OwningGameInstance,而PlayWorld裏的OwningGameInstance纔是間接保存了GameInstance。因爲UE4只允許一個World運行,因此GameInstance也是唯一的

總結:Object→Actor+Component→Level→World→WorldContext→GameInstance→Engine。至此,完成了所有“數據”,接下來討論具體的遊戲邏輯如何佈局


GamePlay架構(四)Pawn

Actor是由Component組成的一個個功能,真正的Component應該是可以無痛處的轉移到另一個項目,不參雜任何遊戲邏輯

因爲UE4是FPS起家,一個Pawn是棋子士兵,(和戰場上的士兵類似)其能夠移動,有物理碰撞,可以響應輸入和處理邏輯(Controller),Pawn擁有能力。Pawn就是木偶,Controller是提線人


GamePlay架構(五)Controller

MVC

controller是1:1,簡單明瞭

UE這裏其實想說的是,這些更新位置的操作還是讓我來爲你管理吧,我真的擔心你會用錯搞出什麼亂子來。順便再說些題外話,對於PlayerController來說,因爲玩家需要一個視角來觀察世界,所以常常PlayerController常常會扛着個攝像機出現(藍圖裏沒有,但是會運行時生成PlayerCameraManager和CameraActor),所以就算沒有角色可供操作,玩家也依然希望是可以視角漫遊觀察整個世界的(試試看把默認Level裏的PlayerStart刪掉後運行看看)。這個時候PlayerController常常會默認創建出一個ASpectatorPawn或者DefaultPawn(根據GameMode裏配置),我們雖然看不見Pawn,但依然可以觀察世界,靠得就是跟Controller關聯的旋轉和攝像機。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章