TomLooman_ActionRoguelike_第六章調(diào)試工具
該專欄用于保存對TomLooman的ActionRoguelike項目的學習筆記,學習過程中的思考與記錄不一定準確。
教程參考:https://github.com/tomlooman/ActionRoguelike
基于UE5.0的項目實現(xiàn):https://github.com/CarolBaggins2023/TomLooman_ActionRoguelike_Tutorial

2023_08_02
調(diào)試工具:調(diào)試C++和藍圖、相機的變化和十字準星、用于主動檢測的錯誤的assert
?
在SExplosiveBarrel.cpp中實現(xiàn)了爆炸時打印調(diào)試信息,包括打印在OutputLog里和打印在3D世界中。

UE_LOG的函數(shù)接口為UE_LOG(CategoryName, Verbosity, Format, ...),其中CategoryName是打印的類別,Verbosity是信息的詳細程度,F(xiàn)ormat是日志的消息內(nèi)容。
在UE中,輸出字符串要加TEXT(),其作用是保證在不同環(huán)境下字符串仍能輸出正確。需要注意的是,%s的內(nèi)容不能是FString,而要是const wchar_t*,可以通過在FString前加*
得到(如第二句)。
UE_LOG的輸出效果如下圖所示,


DrawDebugString能將調(diào)試信息直接打印在3D世界中,F(xiàn)String類型的變可由FString::Printf(TEXT())創(chuàng)建。
DrawDebugString
的輸出效果如下,由于我們代碼中調(diào)試信息的輸出位置是Hit.ImpactPoint,所以調(diào)試信息在爆炸點出現(xiàn)。

?
在藍圖中設(shè)置break point的方法

未運行時

運行中觸發(fā)斷點時

藍圖中的斷點也可以被disable

?
?
Camera在Character正后方時,Character會擋住一定的視野,所以我們想把Camera的位置調(diào)整到偏右側(cè)。
不能像下面那樣直接調(diào)整Camera,因為這樣會讓Camera和SpringArm的相對位置錯誤,導致出現(xiàn)Camera穿墻的情況。

正確的做法是在SpringArm中調(diào)整Camera的位置,如下

?
只是單純地調(diào)整Camera的位置的話,Character射出的子彈不再落在屏幕中心,而是會落在偏左的位置。原因和解決方案下面講。
現(xiàn)在我們先在屏幕上添加一個準心。方法是創(chuàng)建一個WidgetComponent(控件組件)的藍圖類,添加一個Panel和一個Image(Image的初始窗臺是白色矩形),并讓Image位于Panel的中心。
Widget組件允許我們在游戲場景中用Unreal Motion Graphics(UMG,虛幻示意圖形)來創(chuàng)建3D UI,可以與之交互。


然后在Character的藍圖中將這個Widget顯示在屏幕上,

效果如下,

?
?
UE中的Assertion(斷言)能夠提醒我們哪里的程序出現(xiàn)了問題。Assertion相當于用if語句判斷指針是否非空,但用if語句判斷后要顯式地讓代碼停止運行或中斷程序,而Assertion會根據(jù)使用的斷言自動決定是繼續(xù)程序還是中斷程序。
UE中的Assertion包括check、verify和ensure(ensure在觸發(fā)斷言時不會終止程序,而是通知崩潰報告器,此時編輯器會卡頓一段時間)。