發表文章

目前顯示的是 8月, 2018的文章

GameplayAbilities System介紹 (一)

圖片
Gameplay Abilities System(GAS)是UE4內建但是預設沒開啟的一個plugin,並且有在Epic Games自己出的Paragon以及Fornite兩款遊戲使用。因為兩款遊戲都是網路對戰類型的遊戲,所以GAS的設計是有考慮低網路傳輸以及網路預測的。GAS也開出了許多blueprint(bp)編輯的介面,讓設計可以在bp層完成所有的技能開發。因為系統設計非常活的關係,使用GAS幾乎可以達到各種設計的需求,並且許多常用的功能都已經內建在GAS裡面。 使用已完成的GAS系統其實不難,技能定義好,技能的效果定義好,很快就可以完成一個技能。在大量製作上會非常快速。 但是理解GAS以及要擴充GAS功能的難度就很高了,由於GAS可塑性非常好,要完成一件事可以用很多種方法達成,但是只有少部分方法是效率最好,網路傳輸最少的,要找到這一條方法就需要大量的時間研究才辦的到。 如果想更深入了解Gameplay Abilities System,在官方4.20發表的時候也一併公布了ActionRPG的專案範例,可以去Unreal Launcher下載來研究。 為什麼要用GAS系統,以下有幾點原因可供參考: 1. Unreal原生支援並有兩款已上市遊戲使用 2. 記憶體、效率、網路傳輸都是官方有調整過 3. 支援Client預測與後續相關要處理的事情 4. 可塑性高,大部分的設計都可以用內建的功能做到 很不錯的英文介紹投影片:[ 連結 ] 技術需求 在目前的UE4版本,GAS是沒辦法運作在純bp專案的,所以在繼續往下看之前,要先具備C++的基本知識,電腦環境也要安裝Visual Studio才能正確啟用GAS。或是直接從ActionRPG開始,用基本已建立好的角色型態做實驗。 GameplayAbilitySystem設定 在Unreal的plugin上啟用 Edit->Plugins->Built-In->Gameplay 勾選Enabled。重開Unreal。 打開Visual studio專案,打開[專案名稱].Build.cs, 新增以下程式碼: PublicDependencyModuleNames.AddRange(new string[] {

UE4驗證網路版本的程式碼

在開發多人遊戲的時候總是會遇到client沒辦法連上server的情況。例如有人沒有更新,或是開錯目錄的執行檔等等。這篇文章稍微提一下UE4如何驗證不同版本的機制以及程式碼在哪邊處理這些事情,以及如何從log判斷是不是版本有問題。 EngineBaseTypes.h 有個ENetworkFailure::NetChecksumMismatch的enum 定義。 而PackageMapClient.cpp 有一些程式碼會檢查讀取物件的NetworkChecksum,如果判斷不對就會送出NetChecksumMismatch事件。 client會因為上面原因,造成spawn actor失敗,接著就會送NMT_ActorChannelFailure給server,此時server就會關掉對這個玩家的連線。送NMT_ActorChannelFailure的程式碼在 DataChannel.cpp 從client會看到的log: LogNetPackageMap: Warning: GetObjectFromNetGUID: Network checksum mismatch. FullNetGUIDPath: [57]/Game/xxxxx.[55]xxxxx.[53]PersistentLevel.[131]xxxxx, 2365598466, 229775609 LogNet: Warning: UActorChannel::ProcessBunch: SerializeNewActor failed to find/spawn actor. Actor: None, Channel: 30 (LogNet可能預設不會輸出訊息,可能要透過修改參數或是用console command 輸入Log LogNet All來看) server會看到的log: Server connection received: ActorChannelFailure 所以server 或是client看到上述的訊息的話,就可以知道可能兩邊版本有問題,總之還是記得client跟server都要用相同的build比較不容易出這個狀況。