我們添加一個發射器類型的槍
我們目前有了一個Rifle的槍械藍圖,我們在添加Launcher時,需要為他們添加一個父類,將公共方法放到父類里,方法體由子類實現
添加父類
方法1
新建一個Gun的藍圖,Gun繼承Actor,然后讓Rifle和Launcher繼承Gun,這適合一開始就這樣做,但是現在我們已經有了Rifle,并且有了實現,會比較麻煩
進入Rifle的藍圖,選擇 “文件/重設藍圖父項” 可以為藍圖重新指定父類
方法2
將現有的Rifle藍圖重命名為Gun,然后再創建兩個子類,比較快速,且需要修改藍圖的中其他實現(例如Fppshooter中Gun字段的類型)
右鍵藍圖,可以直接選擇創建子類
推薦用方法2創建兩個子藍圖,Rifle和Launcher,并為發射器重新指定模型,此時兩個槍的邏輯行為仍然是一致的
動態生成槍
打開FPPShooter藍圖,刪除ChildAcotr,此時角色網格體上應該為空
打開事件圖表,將原來從ChildActor強轉Gun改為動態生成一個新的槍
如下修改藍圖
第一個函數節點是“從類生成actor spawn Actor from class”
第二個函數節點是“將Actor附加到組件 attach Actor to Component”
SpawnTranformLocation需要右鍵選擇“分割結構體引腳”
生成第二把槍
生成第二把槍前,先創建一個槍的數組,用來存放所有生成的槍
修改生成后的部分,暫時先不對MyGun賦值,而是將槍加入數組
新建一個CreateGun方法,將生成的邏輯放到這個方法里,注意這個方法需要一個輸入參數,參數類型為Gun的Class,而不是實例引用
然后在玩家的事件圖表里,調用兩次CreateGun,分別選擇兩種不同的GunClass
**
**
此時運行,游戲將創建兩把槍,但是兩把槍是重疊在一起的,且不能射擊
在createGun的最后追加,隱藏新生成的物體
然后在玩家的事件圖表里,追加顯示第一把槍
使用索引切換兩把槍
首要要制作展示槍的函數
刪除Mygun參數,新增CurrentIndex參數表示當前正在使用的槍的索引,新增一個方法GetCurrentGun,返回值為Gun的對象引用,由于不修改數據,可以是一個純函數
因為刪除了MyGunStartFire和EndFire會報錯,如下修改,將槍的引用傳入
然后修改藍圖
回到FppShooter的事件圖表,通過設置CurrentIndex的值(加ingCurrentIndex拖入,選擇設置),可以動態的修改要默認展示的槍
換槍動畫
制作換槍動畫的蒙太奇,注意動畫的插槽要和動畫混合空間中的插槽一致,否則無法播放蒙太奇
按鍵切換武器
編寫SwitchWeapon腳本,切換不同的槍
新增一個輸入按鍵Q,在角色事件圖表里,新增節點,按下Q,執行換槍
解決BUG
現在雖然可以換槍,但是如果玩家按住左鍵不松,同時按Q換槍,當切回到這把槍時,會發現依然在開火,這是因為沒有調用EndFire方法
改進
首先在FppShooter中,切換武器時顯式的調用一次EndFire
但這還沒玩,由于EndFire中要求銷毀槍口火焰,如果玩家從未開火,則會導致空引用錯誤,所以需要進一步修改Gun的藍圖
在變量中添加一個IsInFire的bool
在StartFire中將IsInFire設為true
在EndFire中根據條件判斷是否可以進入銷毀,如果可以進入,將isInFire設為false