斯坦福UE4C++課程P17-P22調(diào)試工具
這一章主要是說作業(yè)和debug工具
作業(yè)一中,我們使用以下方式讓MeshComp和OnActorHit綁定。
如果不重寫ASExplosiveBarrel::PostInitializeComponents(),而是在構(gòu)造函數(shù)里使用
用熱重載編譯可能會(huì)出現(xiàn)問題。
tip:PostInitializeComponents運(yùn)行在構(gòu)造函數(shù)之后,BeginPlay之前。

使用熱重載,可能有如下問題:
無法編譯,就算代碼正確
熱重載崩潰了
告訴我們編譯完成,但沒有重載變化的代碼
以下是C++實(shí)現(xiàn)的爆炸桶代碼:
SExplosiveBarrel.h
SExplosiveBarrel.cpp

UE_LOG(CategoryName, Verbosity, Format)宏用于輸出信息到日志;
TEXT()宏把在里面輸入的字符串字面值轉(zhuǎn)換為ue期望的形式,并且使用更廣泛的字符集。所以字符串最好都加上該宏。
以下方式把撞擊的位置信息輸出到屏幕:
下面介紹添加斷點(diǎn),作者用的VS,點(diǎn)擊代碼界面左側(cè)添加斷點(diǎn),運(yùn)行到斷點(diǎn)時(shí)暫停,然后逐語句執(zhí)行(F10step over跳下一個(gè)),和常規(guī)C++調(diào)試基本一致,我用的Rider設(shè)置的VS快捷鍵,操作一致。
接下來是在藍(lán)圖中添加斷點(diǎn),選擇某個(gè)節(jié)點(diǎn)右鍵Toggle breakpoint(F9)添加斷點(diǎn),然后選項(xiàng)卡里都有以上類似debug功能。

接下來我們讓相機(jī)平移,不讓角色擋住魔法球發(fā)射的位置(準(zhǔn)星)
我們可以直接拖動(dòng)相機(jī),但是彈簧臂還在原來位置,所以不能直接拖
我們選中彈簧臂組件,調(diào)節(jié)Socket offset讓彈簧臂和相機(jī)一起移動(dòng)即可。
接下來用空控件藍(lán)圖做一個(gè)準(zhǔn)星Crosshair_Widget,添加一個(gè)image,錨點(diǎn)設(shè)置為中央,位置設(shè)置為x=0,y=0,尺寸為8×8,alignment設(shè)置為0.5,0.5。
在角色藍(lán)圖中把準(zhǔn)星顯示在視口中。

現(xiàn)在我們發(fā)射魔法球,當(dāng)右手接近屏幕中央時(shí),魔法球會(huì)以正確的方向射出,但角色轉(zhuǎn)個(gè)身讓右手遠(yuǎn)離中央時(shí),魔法球會(huì)偏離很遠(yuǎn)。


作業(yè)2(1/3),用C++解決上面的問題。
首先提示我們用藍(lán)圖如何實(shí)現(xiàn):
在ProjectileCannon藍(lán)圖添加以下節(jié)點(diǎn),意思是獲取玩家和炮的位置,玩家位置向量減去炮位置向量得到的是炮指向玩家的向量,然后設(shè)置魔法球發(fā)射的方向旋轉(zhuǎn)到前者的的方向。

根據(jù)以上提示,我們可以讓魔法球發(fā)射的方向旋轉(zhuǎn)到從相機(jī)中心(準(zhǔn)星)發(fā)射碰撞檢測(cè)射線所碰到的第一個(gè)物體上的碰撞點(diǎn)(若無碰撞說明無限遠(yuǎn),直接用前面的發(fā)射方向),在角色C++類PrimaryAttack函數(shù)中添加代碼(可借鑒SInteractionComponent類的射線碰撞檢測(cè)方法):
我們用攝像機(jī)正前方發(fā)出射線1000米的范圍內(nèi)檢測(cè)是否有以下三種類型物體碰撞(WorldDynamic,WorldStatic,PhysicsBody,因?yàn)槟壳皥?chǎng)景中除了魔法球的Projectile碰撞配置外只有這三種)
效果如下:

作業(yè)2(2/3)Blackhole Projectile黑洞發(fā)射物藍(lán)圖實(shí)現(xiàn)
首先在C++里為發(fā)射黑洞綁定動(dòng)作,發(fā)射邏輯和MagicProjectile一致(有攻擊發(fā)射的Actor和攻擊動(dòng)畫被顯示在藍(lán)圖中)。
然后創(chuàng)建能被黑洞吸引的模擬物藍(lán)圖(先在角色藍(lán)圖把blackhole下的類選為模擬物類,動(dòng)畫設(shè)為攻擊動(dòng)畫),注意徑向力組件的force要大一點(diǎn)(我設(shè)的-1500000),否則影響輕微

作業(yè)2(3/3)Dash Ability C++實(shí)現(xiàn)
實(shí)現(xiàn)按Q發(fā)射一個(gè)魔法球,飛行0.2秒后(或者提前碰到物體)爆炸,爆炸后0.2秒,角色傳送到爆炸的位置。
這里告訴我們可以做一個(gè)共享的類,讓左鍵攻擊魔法球、Q傳送魔法球、黑洞都繼承自一個(gè)類(因?yàn)樗鼈冇写罅恐貜?fù)代碼、組件)。
我們做了共享類,然后用藍(lán)圖實(shí)現(xiàn)0.2秒傳送效果。

上半部分是飛行0.2秒傳送,下半部分是提前發(fā)生碰撞傳送。


最后是ensure/ensureAlways宏,前者第一次被執(zhí)行時(shí)會(huì)中斷運(yùn)行到當(dāng)前位置,后者每次執(zhí)行都會(huì)中斷運(yùn)行到當(dāng)前位置,因?yàn)榫幾g器認(rèn)為此宏處出現(xiàn)了一個(gè)問題。這類似C的主動(dòng)檢測(cè)錯(cuò)誤的assert斷言。
值得注意的是,該宏在游戲打包后會(huì)自動(dòng)刪除,并不會(huì)影響正常游戲。