Unreal5 第三人称射击游戏 射击功能实现1
狀態機的緩存
狀態機緩存功能相當于我們只需要實現一次,可以在多個地方引用,也可以在別的狀態機里面使用,而不是在里面再重新寫一遍相應的功能。
我們可以在基礎狀態機的鏈接拉出一條線,搜索“緩存”
第一個就是新保存的緩存姿勢,選中改個名稱,這就是默認的基礎姿勢。
這樣,我們就可以在其它狀態機里面使用當前基礎動畫狀態機產生的結果。
接著,創建一個新的狀態機,用于實現特定的功能
在內部創建一個默認狀態
在狀態內部使用緩存姿勢
這樣,還是實現了之前的功能,但是,我們可以在功能狀態機中,疊加其它的動畫,實現更多情況下需要播放的動畫。
持槍基礎狀態
先創建一個混合空間1D,這個用于存儲在持槍狀態下的基礎姿勢
在基礎狀態機里面,現在已經使用布爾混合了默認站立和蹲伏狀態,我們再創建一個變量用于判斷是否切換持槍狀態,并將剛才制作的混合空間動畫拖入
下面,我們要在角色藍圖里面實現武器裝備的功能,現在還需要一個事件去觸發武器裝備功能,那就在增強輸入里面創建一個裝備武器功能,創建一個輸入操作。
將剛才的按鍵增加到上下文,使用數字1鍵觸發。在角色藍圖中,找到事件
在事件觸發時,對動畫藍圖的變量進行切換
運行測試,會發現,點數字1,可以對持槍狀態和默認idle狀態實現切換。
裝備武器動畫實現
在功能狀態機里面,創建一個新節點,可以實現達到要求,可以切換到裝備武器的動畫狀態
創建一個變量,是否需要裝備武器,然后功能狀態機中的基礎切換到裝備武器狀態的切換條件設置它
回到默認的狀態則是判斷裝備武器動畫是否播放完畢,我們可以獲取相關剩余動畫時間,單位是秒
在裝備武器動畫剩余時間小于0.1的時候,我們設置回到默認狀態
記得給裝備武器狀態添加動畫
記得,裝備武器動畫只需要播放一次,不要開啟循環動畫
為了實現裝備武器和收回武器的功能,我們還需要修改播放速率,1就是默認的裝備武器,如果速率改為-1,將會回放動畫,實現回收武器的效果
修改速率肯定無法在動畫狀態里面修改,我們需要將其公開為引腳,在角色藍圖內實現對速率的修改
動畫前面會出現播放速率的引腳
我們可以使用一個變量去控制引腳的值,或者直接將其設置成提升變量。
這樣,在角色藍圖內,即可根據角色裝備武器還是收回武器,設置相應的動畫。
在角色藍圖中,設置是否持有武器邏輯后面,添加對速率的修改
接著,在后面,設置裝備武器變量
裝備和收回都直接設置此變量,因為它們的區別只是播放速率的區別。
我們設置完成后,需要將這個值修改成不可裝備武器,防止默認狀態一直向裝備武器狀態切換。
測試發現,播放裝備武器動畫和默認狀態切換有些生硬,那我們可以適當延長一些過渡時間
還有一個問題,就是我們在移動時,進行裝備武器,會發現還是處于站立狀態播放裝備武器,需要我們實現按骨骼分層混合實現。
以默認緩存的動畫為基礎動畫進行混合
要找到需要混合骨骼位置,因為裝備武器動畫主要是上半身,那么,我們需要找到上半身的根節點
在骨骼查看界面,可以查看所有骨骼
選中spine_01后,顯示下面的所有骨骼
thigh_l是左腿
thigh_r是右腿
現在我們知道到了,上半身的根骨骼是spine_01,那么從這個骨骼開始混合。
復制名稱
設置節點屬性,在層設置上面增加一個數組,將骨骼名稱添加進去,混合深度是混合到第幾層,默認值0是所有層級。由于骨骼自身混合,所以在自身空間混合而不是在世界空間。
這樣便實現了在移動中裝備武器動作的實現。
換裝功能實現
一般衣服都是已經綁定了相應的骨骼,我們需要做的是將其添加到模型節點下面,然后讓骨骼運算影響它即可。
先選中衣服
在角色藍圖選中網格體,點擊添加
這樣添加骨骼網格體時,后面會帶有相應選中衣服的名稱
添加到骨骼網格體下面
這種狀態只是將模型添加了上去,但是骨骼網格體還不會更新模型。
我們需要設置骨骼去更新它,在構件腳本中
添加設置引領姿勢組件
讓骨骼模型使用網格體的骨骼組件更新
如果你有多個模型添加
這樣就實現了骨骼更新當前模型,如果你想創建不同的,那么只需要創建子類,然后修改節點相應的模型,就可實現換裝功能。
插槽替換模型
除了衣服以外,還有一種就是我們需要替換各種各樣的武器,比如刀劍,護盾等等,這種模型是不需要通過骨骼更新動畫的,它只需要的是骨骼上的某一個位置,然后跟隨著某根骨骼移動即可。比如,將劍放到手上,它只需要跟隨著手的位置更新自己的位置即可。
要實現這個功能,我們需要在角色骨骼上面創建(插槽)。
為了方便設置插值的位置,我們還可以給插槽添加預覽資產
為了更方便調整,我們還可以在右側設置預覽動畫
然后將動畫停在某一幀,來設置相應的位置
然后調節插槽的位置,實現它在相應的位置顯示
最后一步,在角色藍圖內,網格體創建一個骨骼網格體子類,在插槽一欄中,父項套接字(這中文翻譯的啥,應為為parent Socket)設置插槽的名稱,最后將模型添加上去,就可以實現模型添加。
如何動態創建添加
我們使用節點從類生成Actor,可以把類實例化成一個實例
在類那里選擇需要實例化的類,并創建一個變換(不創建會報錯)
并將實例化的Actor添加到組件
父節點就是網格體,SocketName就是需要添加的骨骼節點的名稱,我們不需要相對坐標,直接將Actor對齊到目標即可。
這就是我們手動實例化類進行邏輯添加的實現過程。項目運行起來,你會發現藍圖的實例被添加到了角色身上
武器藍圖制作
武器藍圖是我們需要創建的所有武器的基類,我們可以通過此類創建子類,來實現各種各樣的武器。
首先創建一個Actor,作為所有武器的基類
然后基于這個基類,創建一個武器基類BP_Gun,然后基于武器基類再創建一個AKM的基類
這個節點創建好以后,我們將模型添加到藍圖里面,直接使用默認位置即可,因為我們在骨骼上面調試的時候,就是基于模型的默認值調整的位置。
然后根據上面的方式,可以將藍圖實例化然后按插槽的名稱添加到角色身上。
實現角色從背后拿取武器
要實現讓角色把背后的武器拿到手中,我們需要在播放從背后拿武器的時候,發送一個動畫通知,在角色藍圖中,實現武器的插槽切換,也就是從背后的插槽切換到手上的插槽。
那么,首先我們要實現動畫通知。那么創建藍圖動畫通知AnimNotify
然后創建一個名字為
我們這里要對默認的函數進行重載,實現內部邏輯。
函數給我們提供了三個參數,觸發事件的網格體組件,動畫,通知事件參考類型
我們可以通過網格體組件獲取到它的所有者
然后將類型轉換為我們的角色藍圖類型,并可以獲取到對應的動畫藍圖
我們根據當前動畫藍圖的狀態,設置是將裝備放到手上還是放到背上,通過將Actor添加到組件節點添加到相應的位置。
在動畫里面,找到對應幀位置,右鍵添加通知
當手伸到后面的幀上面,添加通知狀態
蹲伏狀態拿武器
先創建一個混合動畫,蹲伏狀態拿著武器的默認idle狀態,以及移動時的狀態的混合
然后再基礎狀態機的基礎狀態里面,將持有武器蹲伏按布爾混合一下即可
在跳躍狀態里面,也對是否持槍進行一下判斷
在墜落里面,我們也需要根據持槍狀態修改墜落的效果,讓其保持持槍狀態,而不是雙手抬起
狀態判斷的修改
在觸發跳躍和武器切換的時候,我們會進行狀態的判斷,防止出現抽搐的情況。我直接將其抽離成了一個函數
可以進行重復調用,而且還保證了節點的簡潔。
應用的時候還是正常使用即可,修改一下狀態。
修改地面摩擦力
為了實現移動時正常摩擦力,沒有移動輸入時,則降低摩擦力,增加慣性。
使用了增強輸入就是好,就事件開始和結束事件,我們直接使用這兩個鏈接即可。
瞄準功能的實現
瞄準功能是在持有武器時,提高命中的準確率。
通過增強輸入,鼠標右鍵觸發事件,然后判斷當前是否處于持槍狀態
然后判斷當前是否可以切換到瞄準狀態,然后退出后切換會null狀態
使用時間軸的0-1切換使用插值,去修改彈簧臂的長度,來實現鏡頭的伸縮
運行發現,瞄準狀態下,我們還可以看到角色的正面,原因在于,角色朝向是根據移動方向確定的,而不是根據相機的朝向確定的。所以,在瞄準狀態時,我們需要將角色朝向修改為根據相機朝向移動,取消根據移動方向確定。
創建兩個自定義事件,第一個是切換到瞄準狀態動作,第二個是退出瞄準狀態
獲取兩個設置事件的方式
角色朝向朝向運動方向需要在角色移動組件里面獲得
射擊瞄準狀態下移動處理
現在在瞄準狀態下,如果人往后走,我們還是會播放向前移動的動畫,這樣是不合理的。所以,我們需要實現腳的移動按照朝向進行側移或者后已來兼容八個方向的移動。為了實現360度的移動,我們需要計算移動方向和朝向之間的夾角,在動畫藍圖中,內置了一個計算方向的節點,可以根據角色的速度和朝向,獲取到一個范圍在[-180,180]的角度,我們可以根據這個數值去修改瞄準時移動需要播放的動畫。
傳入角色的速度和角色朝向,我們可以將計算得到的移動方向角度存儲為變量,方便在狀態機中使用。
注意,大家要多寫注釋,可以清楚知道變量是什么作用
下面,要制作混合動畫,創建一個混合空間,用于處理瞄準狀態下的移動的角度和速度的動畫,我們需要設置兩個值,一個是速度,和默認的速度值使用一個,另一個就是角度,用于實現前后左右八個方向移動時,腳能夠播放正確的動畫。
軸向就變為橫軸就是移動角度,縱軸就是移動速度,我們需要將每種速度每種角度的動畫都添加進去,idle狀態也就是速度為0的使用一個動畫即可,其它三種速度對應的動畫,需要每種角度的都需要添加上。為什么只做到行走,現實生活中,瞄準射擊狀態下是無法射擊的,如果要進入跑步狀態,那么,我們切換到持槍行走狀態即可。
隨著連的節點越來越多,為了方便后面的調整,我將基本狀態,持槍狀態和瞄準狀態制作了三個狀態機,每個狀態機里面設置可以跳躍。
在瞄準動作狀態機里面,墜落和跳躍都用持槍狀態的動畫。在基本的移動狀態中,將我們制作的瞄準狀態混合動畫添加進去,設置上我們之前制作的方向和角色默認速度。
可以看到,動畫藍圖切換到瞄準狀態動畫需要一個布爾變量isAim,這個需要在角色藍圖里面設置。角色藍圖中,之前我們設置橘色切換瞄準狀態那里,增加對動畫藍圖的屬性的設置。
進入場景測試,會發現實現了角色八方向的移動,以及根據速度行走的效果。但是你會發現想走還是使用的默認的速度,所以,我們還需要限制一下瞄準狀態的移動速度。
在速度判斷那里,增加了額外的通過布爾選擇節點,如果在瞄準狀態,移動速度就是行走速度。
最后在瞄準狀態切換時間軸更新結束后,重新調用速度判斷,更新速度。這樣表現還有一些速度的慣性,比如瞄準狀態切換會默認狀態時,它會在動畫切換完以后才恢復正常速度。
使用反向動力學解決無法雙手握槍的問題
在頭部瞄準偏移時,我們會發現左手會握不住槍,這是因為槍需要的是兩個骨骼綁定,但是我們只能綁定一個,在播放動畫時,會出現偏差。
這主要是我們在動畫藍圖里面混合的瞄準偏移動畫導致的
首先把它移動到瞄準偏移制作的動畫前面,讓其不再影響瞄準姿勢,分別在idle和持槍狀態添加。這樣我們在轉向完成后,使用FABRIK解決這個問題。
接下來我們使用前后延伸反向運動學(Forward And Backward Reaching Inverse Kinematics,簡稱 FABRIK)來解決雙手握槍一個手握不住的問題。
在需要處理的位置,就是頭部轉向后面,創建一個FABRIK來處理
在FABRIK右側的細節屬性欄,有一個結束效果器,相當于設置它的執行范圍,到哪里的骨骼結束,我們不需要公開引腳,取消公開為引腳,然后再細節欄設置
結束效果內需要添加執行器目標,這個就相當于需要跟隨的目標,解算器就是左手,需要填入解算的骨骼
設置完成,選擇編譯,進入調試模式,選中持有武器狀態
會發現兩只手綁定到了一塊
選中FABRIK以后,會發現我們有調試位置的箭頭,拖拽到合適的位置,即可實現兩個位置的綁定。
進入運行模式,會發現,這個問題被完美的解決了,兩個節點位置偏移固定了
射擊狀態下的瞄準偏移
還是老樣子,以正常狀態為基礎姿勢
設置完成后打開里面一個查看
這樣就是設置成功了。
接下來要創建一個瞄準偏移,之前我們創建過基礎狀態下的瞄準偏移,來實現了跟隨相機,現在創建的是持槍瞄準狀態下的瞄準偏移
左邊的屬性和之前一樣
設置好動畫以后,設置預覽動畫,就可以查看效果了
然后將射擊狀態的瞄準偏移添加進來,并復制剛才的FABRIK節點過來,解決雙手偏移的問題
射擊狀態蹲伏動畫
和基礎瞄準狀態一樣,它也需要兩個坐標軸,主要是為了解決蹲伏狀態下瞄準移動時,腳要往正確的方向移動的問題。
首先創建一個混合空間,兩個軸的值和基礎瞄準狀態的一樣即可
拖的時候,推薦大家直接按著Shift鍵,這樣它會更好的粘在分格的位置
設置完成動畫后,記得按著ctrl查看一下動畫是否有問題
然后使用按布爾混合姿勢,根據是否蹲伏修改動畫
射擊動畫的實現
射擊功能的觸發使用鼠標左鍵,在增強輸入里面,增加一個輸入
然后再角色藍圖中,調用射擊事件時,首先判斷是否能夠切換到射擊狀態,然后再根據當前是否已經處于瞄準狀態,如果沒有則先切換到瞄準狀態,然后后續再進行射擊邏輯。
AIm Shoot Judgement是我封裝的一個宏,宏的好處是可以自己定義執行鏈接,所以可以阻斷后續的執行。之前我以為函數也可以的,最后測試發現是不行的,所以封裝了宏。宏的缺點就是只能在藍圖內部使用。
判斷里面條件是,需要角色已經裝備了武器,并且在默認狀態或者瞄準射擊狀態時,可以向后運行。
在射擊完成后,我們還需要回到其它狀態,能夠回到的狀態有兩個,一個是基礎持槍狀態,另一個就是瞄準狀態。所以我們還需要有一個變量進行判斷,就是當前是否處于瞄準狀態,這個值只有瞄準事件觸發時設置。如果不是瞄準狀態,使用定時器去去觸發函數回到瞄準狀態。
而這個是否處于瞄準狀態的變量,只有瞄準事件觸發
定時器的創建有多種方式
我們現在使用的是以函數名定義的定時器,需要保證寫的名字和定義的函數或自定義事件的名稱相同才可。
我們還可以通過函數名清除定時器
到這里,射擊事件的前提處理已經處理完成,射擊時在瞄準狀態,以及退出時是否回到瞄準狀態
這樣制作完成后,我發現我的切換邏輯還是有些問題,就是左鍵點擊,會直接射擊,在射擊時,按住鼠標右鍵,會拉近鏡頭,然后再松開,不管你是不是在射擊,都會直接退出瞄準狀態以及射擊狀態。
所以,我要思考如何解決這個問題,增加了一個變量,在射擊時將其設置成true,退出時設置成false
然后再瞄準退出時進行判斷,如果當前處于射擊狀態下,只恢復彈簧臂,而不是退出瞄準動畫。
到此為止,算是真正的處理完成了瞄準和射擊的狀態的切換邏輯。
射擊的后坐力動畫添加
實現后坐力的動畫,我們不能夠直接播放動畫去實現,這樣的話,還需要制作和射擊相匹配的移動以及蹲伏等相關的動畫,邏輯太復雜,所以我們直接使用附加動畫去實現相應的動畫。
附加動畫的制作,需要在動畫里面設置附加設置,這個設置在之前也做過,只是用作于多方向切換。
在這里,我們使用站立的射擊動畫,附加到站立的默認姿勢上面,附加動畫,會把相同的部分剔除掉,然后播放不同的部分去實現
制作完成附加動畫以后,需要尋找一個地方進行附加,在動畫藍圖的功能狀態機中,在基礎狀態進行附加,首先對動畫進行按布爾混合,如果不是射擊還是運行原來,如果是射擊狀態,那么就需要附加動畫去附加。
我們需要添加附加動畫,然后使用應用網格體空間additive動畫,對默認動畫影響
將原來的動畫附加上射擊動畫
新創建一個變量,是否射擊,這個在角色藍圖中進行設置,然后根據此變量是否附加
接著在角色藍圖中,創建一個自定義事件,用于觸發射擊事件
自定義事件觸發將動畫藍圖的變量設置為true
根據當前是否瞄準進行處理,如果已經處于瞄準狀態,可以直接射擊,沒有處于瞄準狀態,那需要先切換到瞄準狀態,然后設置一個延遲0.4秒的定時器,進行觸發射擊。
停止射擊時,我們需要取消射擊動畫,關閉相關動畫。并且還要清除掉開始射擊函數定時器,防止停止射擊以后,還會觸發定時器的問題。
有了這個變量,我們角色藍圖里面其實就不需要單獨設置一個變量, 只需要使用動畫藍圖的是否射擊變量判斷即可
現在,我們完成了角色射擊動畫制作和動作的切換邏輯,分為聚焦射擊和默認射擊,下面是射擊的所有代碼
下一篇,開始制作真實的射擊效果。
總結
以上是生活随笔為你收集整理的Unreal5 第三人称射击游戏 射击功能实现1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 源码分享 | 一个聚合的今日热榜站
- 下一篇: (人、机、料、法、环)搞不懂,你还能做生