發表文章

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

UE4 除錯技巧分享 (二)

圖片
上一篇介紹了兩個除錯小技巧 這一篇會比較著重在中斷點的部份。 技巧分享 這篇的複雜度稍高,而且技巧互相有關連,建議按照順序看。 環境 先稍微介紹一下本篇的環境。 開發平台的部分是Windows + Visual Studio 2017; 引擎是UE4.23。 照理說引擎版本沒什麼差,不過為了保險還是提一下。 從BP中斷點找出完整的Call Stack 在使用編輯器的時候,我們常常會使用BP中斷點來追查執行順序,如同C++的中斷點一樣。 但是如果這個事件是從C++來的話,在BlueprintDebugger是無法得知的,如下圖所示。 其實我們是有辦法知道的,在BP中斷點停住的狀態下,回去Visual Studio,假設UE4 process已經是attach的狀態,按Debug->BreakAll (如圖),這時候就可以看到Call Stack了。 通常CallStack分頁會看到一大串,好像很嚇人,這時候不要慌不要著急,看到Slate那種的都略過一直往下捲。慢慢的看你應該會找到認識的函式,如下圖所示。 以這張圖為例子,就可以知道BP的Tick是從C++的Actor::Tick內呼叫ReceiveTick來的。 有時候你會看到CallStack極短,長的像這樣: 這是因為斷點剛好停在別的Thread,這時候只要去Visual Studio的Debug->Windows->Threads將Thread分頁叫出,然後跳到MainThread就可以了。 從C++中斷點找出BP呼叫的來源 前一個技巧是BP斷點想知道從哪個C++呼叫進來的。這個技巧是要說明如何從C++斷點找出是哪個BP呼叫來的。這個技巧特別重要,因為就算是Packaged Game也可以抓出BP來源。 假設我現在中斷點停在C++的程式碼,有兩種方法可以試 方法1.  到Visual Studio的Watch視窗內輸入 {,,UE4Editor-Core}::PrintScriptCallstack() 或是 ::PrintScriptCallstack() Debug Editor的話則是輸入 {,,UE4Editor-Core-Win64-Debug}::PrintScriptCallstack()  然後去Visual Studio的Output視窗就會看到印出來的BP Call Stac

UE4 除錯技巧分享 (一)

圖片
俗話說的好 給他魚吃不如教他釣魚 今天要分享幾個我平常在用的技巧 心理建設 如果你是有程式背景,但是正在用blueprint(BP)開發。 那我會建議你要先幫自己做好心裡建設。 你在用的是開發原始碼的引擎, 遇到問題時應該儘量往引擎內部追, 不要馬上就找繞過(workaround)的方法或求救。 那樣作你很快就會想放棄,因為無法進步,遇到問題無法自救。 硬體設備 雖說是技巧心得,理論上要跟硬體無關,但是這個真的要講一下。 想追code一定要準備好2個螢幕以上,至少一個螢幕是UE4 Editor,另一個是Visual Studio。 單螢幕的話光是切換視窗就亂掉了。 技巧分享 這裡面的技巧應該比較零散,所以可以跳著看。 不寫Code就直接顯示變數值在螢幕上 如果問我只能寫一條的話,我一定選這一條。 這個是我第一常用的技巧了,大部分我們想到要得知某一個值,就是跑去Actor或是Component的Tick裡面下PrintString,這樣資訊就會顯示在畫面上。如下圖。 可是有的時候bug是機率出現的,好不容易bug發生了,想看某個值是否異常,但是當下卻沒有埋PrintString,難道只能放棄了嗎? 其實沒有,引擎提供了強大的console command "DisplayAll",讓我們可以直接拿到變數值並顯示於螢幕。如圖。 DisplayAll的使用方法是: DisplayAll [ClassName] [PropertyName] 大小寫無分別,所以可以不管大小寫。 ClassName的部份,可分為C++與BP class兩種。 如果你要追查的class是C++ class,那麼直接輸入C++的名稱就好, 但是要去除第一個字。例如 AActor應該輸入Actor 想知道movement移動速度的最大值可下 displayall charactermovementcomponent maxwalkspeed 如果你要追查的class是BP,那麼你要輸入[BP的名稱_C], 舉例來說 有一個BP名稱為BP_CodeTraceActor 裡面有一個變數是value 那麼要輸入的是 DisplayAll BP_CodeTraceActor_c value PropertyName的部份,只要這個變數有被定義為UPROPERTY,就可以拿到值。BP所有的

UE4 GameplayAbilityTask介紹

圖片
簡介 本篇介紹的是UE4引擎的Gameplay Ability System(GAS)中的AbilityTask系列。 不知道什麼是GAS的話可以參考先前的文章 GameplayAbilities System介紹 (一) https://yekdniwue.blogspot.com/2018/08/gameplayabilities-sytem.html GameplayAbilities System介紹 (二) https://yekdniwue.blogspot.com/2018/09/gameplayabilities-system.html UE4 GameplayAbilitySystem - GameplayEffect & GameplayCue 如何設定參數 https://yekdniwue.blogspot.com/2019/06/GameplayEffectAndCue.html Gameplay AbilityTask介紹 AbilityTask建立了大量的範例,作為示範,很多ASC內部的系統與其他系統的溝通都做在AbilityTask內。 而AbilityTask則是要在Gameplay Ability內串流程的時候使用,AbilityTask節點不會出現在一般的Blueprint(BP)內 所以當了解完如何使用ASC,如何創造一個GameplayAbility,以及GameplayEffect後。 應該先試著了解GameplayTask,可以對ASC能夠做到的事情,如何做事情有更深刻的了解。 以下是引擎提供的Tasks,這些都可以在 Engine\Plugins\Runtime\GameplayAbilities\Source\GameplayAbilities\Private\Abilities\Tasks\ 裡面找到 RootMotion ApplyRootMotion_Base ApplyRootMotionConstantForce ApplyRootMotionJumpForce

在多人遊戲環境變更角色移動速度 (二)

圖片
簡介 在前一篇我已經介紹一個完整的範例,說明如何製作一個支援網路的功能,如何做測試,跟如何驗證這個做好的功能在網路延遲的環境是否能正常運作。 前一個做法確定是不行的,玩家會感到畫面不流暢,因此本篇要介紹如何正確地修改移動相關的功能,讓Server端能夠信任Client發送的指令,避免Server頻繁的矯正Client的位置。 這篇其實會比較偏向程式碼實作,敘述會少很多。簡單來說就是看code比較快啦。 當初是從CharacterMovementComponent的Crouch挖出來的。 所以如果想要自己試試看的話,可以去挖出引擎有關Crouch的程式來看。 跟之前一樣,裡面的程式碼都是我經過精簡過了,多餘的實作項目我盡可能的都沒列在裡面,所以最好還是按照順序看完,以免出錯。 再繼續往下看之前,請確認以下的詞你都知道是什麼意思: 1. Replicated Property 2. ROLE Authority 3. ROLE Simulated Proxy 4. ROLE AutonomousProxy 礙於篇幅的關係,這邊不會多做介紹。如果有不熟悉的項目,請先前往 https://docs.unrealengine.com/en-US/Gameplay/Networking/Actors/Roles/index.html 惡補一下。 為角色新增移動模式 要製作這種由玩家的操作改變移動速度的作法,其實要用到的是MovementMode的切換。也就是製作一個新的MovementModeStrafe,然後玩家按鍵的時候進到這個MovementMode,放開的時候回到預設的MovementMode。 為了達到這個目的,我們總共需要新增兩個C++ class,以及一個BP class,所以就是5個檔案。 1. CustomCharacter 2. CustomMoveComponent 3. BP_CustomCharacter 而移動速度的改變,核心做法是override GetMaxSpeed,如果角色正在Strafe狀態,MaxSpeed就回傳 Super::GetMaxSpeed()*strafeSpeedRatio CustomCharacter實作 大致上要實作的項目 CustomCharacter要能接受玩家的輸入,所以跟之前的作法一樣,要開出Strafe以及U