[UE4] 如何測試marketplace plugin的打包流程

posted in: UnrealEngine | 0

主要是靠RunUAT.bat中的BuildPlugin指令,如下: 用法,把所有的.uplugin檔案找出來餵進去: #export PLUGIN_BUILD_TARGET=”Android+HTML5+IOS+Mac+TVOS+Win32+Win64″ export PLUGIN_BUILD_TARGET=”Win32+Win64″ export PLUGIN_PACKAGE_ARCHIVE_DIR=”/your/plugin/temp/path/” for f in $( find . -type f -name ‘*.uplugin’); do export PLUGIN_FILE=”${PROJECT_ROOT}/${f}” UEBuildPlugin done 要注意IOS、Mac跟TVOS要在MacOS系統上做建置 相關引擎中souce code在這裡: Engine\Source\Programs\AutomationTool\Scripts\BuildPluginCommand.Automation.cs 我目前是把這段code整合進vsts中的CI建置流程中。  

[UE4開發日誌]VSTS CI Build與UE4 Automation Test整合

posted in: 開發日誌 | 0

剛剛成功將UE4的Test Automation的功能跟VSTS的CI build整合在一起了。總算能夠處理Test失敗的狀況並回報建置錯誤。雖然D3D Device抓不到只能用server mode跑,但基本上要做funtional test跟unit test看起來沒什麼問題。之後測試好好寫的話,看起來可以省掉不少做回歸測試的功夫。

[UE4]HorizonTweenPlugin新功能:MultiTween Event(ETA 4.19)

posted in: 開發日誌 | 0

這個週末為HorizonTweenPlugin添加了新功能:MutiTween Event。 這個功能有什麼用處呢? 之前這個Plugin想要一次做旋轉跟移動的TweenEvent的時候,我們需要各別為該物件各別添加Move、Rotate跟Scale…等等,用久了總覺得哪裡彆扭,而且BP Node越來越多看起來實在是很不舒爽。 這次實作的功能,讓我們可以很方便的在一個BP Node中一次加入多個Tween事件啦! 不多說,讓我們來看看展示影片,預計UE4.19時更新:https://www.youtube.com/watch?v=Tg0sqlCbAHU&feature=youtu.be

[UE4]UWorld與UGameInstance初始化

posted in: UnrealEngine, 開發日誌 | 2

今天有使用者在使用我的HorizonTween這套Plugin時發生了所綁定的回呼事件無法觸發的問題。深入去了解之後,發現了一個有趣的現象。 首先,他在UMyGameInstance::Init中做了類似於下面的回呼事件的綁定: 在遊戲開始後,期待著每次呼叫建立TweenEvent之後,就會回呼到這個事件中可以做一些遊戲邏輯的處理。 看起來這個劇本非常的完美,在Editor中測試也完美的運行,但是當我們實際上打包出來後就會發現:為什麼這邊的回呼綁定沒有被執行!? 首先,這邊的UHorizonTweenSystemLibrary::GetDefaultTweenSystem(this),其所產生的TweenSystem Actor,其實是跟著UWorld的生命週期走的,也就是說,當UWorld物件被引擎回收(Garbage Collection)時,這邊的TweenSystem Actor也會跟著被回收掉。當我們實際在UMyGameInstance::Init中下斷點後,就會發現一件有趣的事:   我們可以看到World所連結到的Map名字是Untitled,這代表什麼意思?也就是說,在UMyGameInstance::Init這個時間點,我們都還是處在引擎所暫時產生出來的『transition map』中,這個level所產生出來的world在實際的map載入之後就會被移除掉,意即剛剛在UMyGameInstance::Init所生成的任何Actor物件都會被馬上回收。 下面這張圖則是在LevelBlueprint中呼叫,我們可以發現,這次我們所產生的Actor就會存在於「正確」的world當中了(HorizonTweenDemo)。 因此我們知道: 千萬不能在UMyGameInstance::Init中Spawn任何的Actor,因為是沒用的,馬上就會被回收掉!

[UE4] HorizonDBPlugin update

posted in: UnrealEngine, 開發日誌 | 0

今天試著把之前做的UE4 DB Plugin在4.18上做了整修,之前是4.13做完之後就一直放著,目前總算是可以在4.18上運行了。基本上這套Plugin對soci( https://github.com/SOCI/soci )做了一層封裝,讓其可以在UE4中使用到其強大的ORM機制。重點是,在C++中宣告完類別之後,BP也能使用喔! 這套Plugin目前是免費開源狀態(Boost Software License – Version 1.0),有興趣的朋友趕快前往下載來試試吧:https://github.com/dorgonman/HorizonDatabaseDemo C++ UnitTest BP ScreenShot: https://github.com/dorgonman/HorizonDatabaseDemo/tree/master/Screenshot

[UE4]如何使用Visual studio Graphics Debugger來為shader除錯

posted in: UnrealEngine, 未分類 | 0

基本上官方推薦的shader除錯流程是使用Renderdoc這個Plugin來進行: https://github.com/Temaran/UE4RenderDocPlugin 這個Plugin在4.17的時候就已經整合進到Engine Plugin中了, 只要照著上面網址中的教學進行就能夠開起來。 只是,在用Visual Studio的時候會發現,裡面也有一個自帶的Graphics Debugger: 直接按下這個按鈕之後,引擎會直接噴下面的錯誤訊息: DX11 Feature level 10.0 is required to run the engine. 那麼我們到底該怎麼使這個工具呢? 我們需要修改ConsoleVariables.ini這個檔案(請手動新增在專案的Config資料夾下), 並插入以下內容: [Startup] r.GraphicsAdapter=0 0代表的就是使用第一個找到的Graphics Adapter,其在引擎中的詳細宣告如下: static TAutoConsoleVariable CVarGraphicsAdapter( TEXT(“r.GraphicsAdapter”), -1, TEXT(“User request to pick a specific graphics adapter (e.g. … Continued

[UE4]淺談UE4 Modules

對於大型軟體系統而言, 各別功能之間的相依性控管一直都不是個簡單的問題。 為了減少程式碼在管理上的複雜度, 導入Module這個概念,將整個系統拆分成各別獨立且互相緊密合作的單位, 變成了一個非常常見的設計手法。 其實就目前而言,C++還沒有一個真正意義上的「Module System」, 雖然在 C++20[1] 的標準中已經有加入Module相關機制的草案, 但很顯然的,UE4所使用的Module機制並不是對標準庫中該草案的實現。 作為一個走在技術前端的引擎,很多功能當然不會等到標準庫穩定後才導入。 UE4所實現的這套Module System並不依賴於編譯器的實作, 相對的,它在現有的C++標準庫的基礎上設計了自己的一套跨平台建構系統,Unreal Build Tool(UBT)。 這套建構系統,不僅可以控管每個Module載入的時機,並且也擁有許多編譯優化機制。 為了正確理解UE4中這套Module System的運作方式, 首先,我們必須要先理解到底什麼是「Module」。 在抽象概念上,所謂的Module,其實就是一些功能的「集合」。 在C++中,我們可以想成它是一堆 Translation Unit(或稱Compliation unit) [2] 所產生的.obj檔的集合;而這些.obj檔的集合,就是UE4中所定義的Module。   接著,UBT根據不同的編譯環境有以下幾個選擇: 將Module所包含的.obj檔編譯進到最後的.exe檔中。 將Module所包含的.obj檔做成Static Library(.lib)。 將Module所包含的.obj檔做成Dynamic Library(.dll)進而實現在Runtime時期動態載入功能。 UE4在預設情況下,若編譯的TargetType是Editor, 則TargetLinkType會設成Modular,意即所有的Module都會被做成(.dll); 若是TargetType是其他的型態,引擎則會視所編譯的Module是PluginModule還是GameModule進行不同的動作。 前者會被做成(.lib),後者則會直接編譯連結進到最後的exe檔中。 為什麼Editor要特別設定成Modular形態? … Continued

[UE4][WIP] HorizonUI 4.18.0預計新增加的功能,超連結

posted in: 開發日誌 | 0

HorizonUI Plugin Marketplace連結   關於超連結功能   基本上就是在每個文字區塊後面動態放置一個button,   其完整語法如下: <a href=”Seg1ClickMessage”  hoverColor=”#FFFF0055″ visitedColor=”#555555FF” filePath=”Blueprint’/Game/UMG/DialogueMsgTextTest/ButtonStyle/BP_DialogueBackgroundButtonStyle1.BP_DialogueBackgroundButtonStyle1′”> <text color=”#FF0000FF”> Test Click Seg1 </text> </a> <br /> <a href=”Seg2ClickMessage”  hoverColor=”#FFFF0055″ filePath=”Blueprint’/Game/UMG/DialogueMsgTextTest/ButtonStyle/BP_DialogueBackgroundButtonStyle2′”> <text color=”#00FF00FF”> Test Click Seg2 </text> </a> <br /> <a href=”Seg3ClickMessage”  hoverColor=”#FFFF0055″ filePath=”/Game/UMG/DialogueMsgTextTest/ButtonStyle/BP_DialogueBackgroundButtonStyle3″> … Continued

為UE4++加入程式碼:初探UObject

前面幾個章節談了許多引擎在設計上的「為什麼」,但實際上我們到底該怎麼為專案加入C++類別? 基本上你可以純手動在${PROJECT_NAME}\Source\${PROJECT_NAME}下面新增.h跟.cpp檔,只不過會比較費力;但若所繼承的類別是屬於引擎預設支援的類別,你也可以選擇使用Editor中的工具。由於用Editor建立出來的程式碼會自動的套用所選擇繼承類別的模版,因此可以省下不少功夫。 UObject是整個UE4引擎中的核心類別,大部份引擎中的功能都是繼承這個類別後再開始發展各別的系統。 首先,讓我們先來看看該怎麼繼承這個類別。 點選左上角的File->New C++ Class後就會跳出視窗選擇欲繼承的類別,然後照著Figure 1.10.1、Figure 1.10.2、Figure 1.10.3的指示將類別建立出來。 Figure 1.10.1 在Editor中選擇File->New C++ Class後彈出的畫面,這裡只會出現常用類別,請接著選取右上方的Show All Classes。 Figure 1.10.2 選取右上角的Show All Classes之後,就會顯示所有引擎支援的模版類別,接著選取Object,按下Next。 Figure 1.10.3 選取成Public後,.h檔跟.cpp檔就會自動被放到Public跟Private中對應的資料夾。這裡我們在Public下建了一個叫Basic的資料夾,因此建出的MyBasicObject.h會被放到Public\Basic,而MyBasicObject.cpp則會被放到Private\Basic下面。 按下Create Class按鈕後,引擎就會根據內部設定好的Template幫我們將新的類別置放到所選擇的資料夾下面。對於引擎類別的Template有興趣的讀者可以查看${EngineVersion}\Engine\Content\Editor\Templates\這個資料夾下面的檔案,基本上就是根據這些檔案做字串置換的動作而已。 接著我們就可以在Source資料夾下找到建立出來的檔案,見Code 1.10.1。 UObject類別宣告 1. #pragma once 2. #include “UObject/NoExportTypes.h” 3. #include “MyBasicObject.generated.h” 4. … Continued

[UE4] Visual Studio編譯選項

打開Visual Studio後,我們在專案的組態中可以發現有好幾種編譯組態可以選擇,見Figure 1.12.1、Figure 1.12.1。 Figure 1.12.1 從Epic Games Launcher下載的版本,預設有5種編譯組態可以選擇。 Figure 1.12.2 從Github上下載引擎版本自己編譯的話,則會發現多了非常多的編譯選項。 每一個編譯選項主要是由二個關鍵字所組成,第一部份是用來描述引擎跟我們遊戲專案要用什麼狀態來編譯,例如DebugGame、Development跟Shipping。第二部份則是要編譯目標,主要是對應到Source資料夾下的Target.cs。讓我們先看看以下幾個例子: DebugGame:會使用${ProjectName}.Target.cs(TargetType.Game)中的相關設定資訊進行編譯,產生標準的standalone執行檔,在unreal的架構中預設是listen server,意即這個執行程序既是server也是client,別人若知道該listen server的ip,就可以使用open指令加入遊戲,例如:open 192.168.xx.xx:7777。 DebugGame Editor:會使用${ProjectName}Editor.Target.cs(TargetType.Editor)中的相關設定資訊進行編譯,產生帶有Unreal Editor的執行檔。 選擇DebugGame Server:這個組態預設並不存在,當我們在Source下建立完${ProjectName}Server.Target.cs後就會出現,選擇後會使用${ProjectName}Server.Target.cs(TargetType.Server)中的相關設定資訊進行編譯,產生Dedicated Server執行檔。 DebugGame Client:這個組態預設並不存在,當我們在Source下建立完${ProjectName}Client.Target.cs(TargetType.Client)後就會出現,選擇後會使用${ProjectName}Client.Target.cs中的相關設定資訊進行編譯,移除所有server端的能力,產生純粹的客戶端執行檔。 藉由編譯方式跟編譯目標的組合,我們可以得到各種不同的建置組合以符合不同的使用情境。其中若是我們使用的是Github上引擎版本的話,還會多種Debug跟Test這二種建置方式,到底它們的用途是什麼?表格 1表格 2跟整理了所有的建置狀態跟建置目標: 表格 1 建置狀態,主要是用來決定產生的執行檔是不是要進行最佳化。 建置組態 – 狀態  描述 Debug 這個建置組態,會將整個「引擎」跟「Game Code」用最方便除錯的方式進行編譯,其中會包含所有的Debug Symbol,程式碼不會進行任何的最佳化,因此非常適合進行完整的斷點除錯。只是,由於我們必須將整個UE4的原始碼從Github上拉下來自己編譯,因此非常的耗時。從Epic Games … Continued