大致邏輯如下:
一、導入動畫
- 滑鏟
- 蹲待機
- 蹲行走
導入到文件夾中
可以右鍵設置顏色,便于區分。
二、調整動畫
1.啟動根運動
啟動根運動后,人物才可以位移,不然只能在原地。
打開動畫序列,勾選啟用根運動Enabled root motion.
2.創建蒙太奇
對動畫序列右鍵創建動畫蒙太奇,用戶釋放技能時播放。
3.調整蒙太奇
因為我們要延長滑鏟的時間,現在我們的滑鏟蒙太奇是滑鏟后站起來,但是我們只需要滑鏟這個動作。
找到剛剛開始滑鏟的時間,調整蒙太奇結束時間=0.71。現在我們的末尾動作就是滑鏟。
4.設置循環
現在你可以看到人物一直滑鏟后站起來再繼續滑鏟。
右鍵新建一個蒙太奇片段Create New Montage,名字為“循環”。
將“循環”拖拽到滑鏟結尾,并勾選“循環”。現在人物滑鏟后就停住了。
三、條件判斷
打開人物藍圖
1.設置按鍵
Ue5改版后,需要新建一個操作輸入。并命名為IA_Sliding。
在默認輸入映射情境中選擇我們剛才創建IA_Sliding,并將輸入鍵設置為C。
2.當人物速度>200時,才可滑鏟。
Slide輸入鍵——獲取角色移動Get CharacterMovement——獲取速度Get Velocity——獲取向量長度Vector Length——>200
接下來判斷,當玩家正在掉落時或者滑鏟時,不能觸發。
1.正在掉落
獲取角色移動Get CharacterMovement——正在掉落is falling
2.正在滑鏟
網格體Get Mesh——獲取動畫實例Get Animin Instance——蒙太奇正在播放Montage is playing
使用“與門”And布爾值疊加。
3.是否滑鏟?
創建一個布爾變量“滑鏟?”。
4.播放蒙太奇
創建一個序列Sequence——序列0
設置正在滑鏟=真。
設置通過網格體獲取動畫實例——播放蒙太奇Montage Play,選取上面創建好的滑鏟蒙太奇。
四、縮放膠囊體
雖然現在我們已經可以位移了,但是如果不調整膠囊體,你會發現腿部動作形變得很厲害。
通過時間軸來縮放膠囊體。
1.創建時間軸
序列1——添加時間軸Add Timeline,命名“縮放膠囊體”。
打開時間軸,添加浮點型軌道,命名為“值”,長度=0.2
右鍵創建兩個關鍵幀:
第一個關鍵幀:時間=0,值=0;
第二個關鍵幀:時間=0.2,值=1;
2.設置膠囊體大小
將時間軸的開始執行引腳改為Play from start。
膠囊體組件Get capsual component——設置膠囊體半高Set capsual half height——通過插值Lerp,將膠囊體半高變化設置在35-90之間。(平滑過度)
膠囊體大小在細節面板中看。
3.膠囊體隨著滑鏟縮小
網格體——設置相對位置Set relevant location
在視口中點擊網格體,將動畫模式改為使用動畫資產,選取滑鏟蒙太奇。
將膠囊體半高改為35,調整網格體的腿與膠囊體最下方對齊。
還原膠囊體高度和動畫。
將兩個高度數值填入相對位置的插值,作為膠囊體移動的高度變化范圍。
4.起身膠囊體恢復
在時間線前加一個事件。
創建自定義事件“反轉膠囊體”——通過“角色移動”判斷是否處于蹲伏狀態——未蹲時,反轉時間線timeline(即膠囊體恢復為90)
五、滑鏟時是否在地板上
通過玩家手部膠囊體檢測判斷人物是否與地板對齊。
通過膠囊體檢測玩家滑鏟時是否在地面上,如果掉落則停止滑鏟、停止播放滑鏟動作。
1.滑鏟檢測事件
添加一個序列,用于檢測玩家是否處于滑鏟中。
創建一個自定義事件“滑鏟時檢測地板”——以事件設置定時器set timer by event,time設置為0.01,勾選循環looping(每0.01秒運行一次)——新建序列。
2.創建宏進行檢測
創建宏Macros:檢測玩家是否在地板上——滑鏟時手在地板上、是否掉落。
按通道進行膠囊體追蹤Capsule trace by channel——獲取網格體的世界位置作為檢測起始點,檢測半徑和半高作為輸入
檢測半徑默認值設為4,檢測半高默認值設為18.
當檢測不到時,即滑鏟停止——停止播放蒙太奇動畫——輸出
Blend out Time作為輸入值,默認值為0.2.
完整如下:
3.滑鏟停止
將定時器返回值提升為變量“滑鏟追蹤句柄”。
將宏拖入并連接序列0——地板檢測結束后——通過滑鏟追蹤句柄使定時器失效(重置定時器)。
整理一下:開始滑鏟檢測地板事件后,每0.01s檢測一次玩家是否在滑鏟,若未檢測到碰撞(地板),則玩家不處于滑鏟狀態、停止播放滑鏟動畫蒙太奇、停止檢測。
六、玩家與地板對齊
找到與當前地板的旋轉值,通過插值平滑地將玩家對齊。
1.創建宏玩家對齊地板
在宏中設置Actor旋轉set Actor rotation。
設置new rotation旋轉參數。
角色運動character movement——獲得當前地板信息get current floor——中斷Finding Floor result——中斷hit result——impact normal地板法線作為“利用zx軸旋轉Make Rot From ZX”的Z軸,獲取玩家向前向量Get Actor forward vector作為X軸。
使用“R插值到RInterp to”創建平滑旋轉:從玩家當前旋轉角度,轉到地板的平行角度,時間為場景差量Get world delta seconds(同步游戲時間),旋轉速度Interp Speed作為輸入值設為5.
完整如下:
大致思路:通過玩家向前向量,和垂直地板向量,找到地板的角度,讓玩家旋轉到與地板平行。
2.觸發對齊
序列1——執行宏
七、滑鏟時是否與物體碰撞
避免滑鏟時穿墻,對滑鏟時最前面的腳進行球體檢測,如果碰到墻,則停止滑行
1.創建宏進行球體檢測
創建宏“檢測玩家滑動時碰撞表面”。
輸入——按通道進行球體追蹤
檢測點:獲取骨骼的插槽位置,插槽名為腳部的骨骼名ball_I——“+”向量相加函數,分割相加向量的結構體引腳,將Z向量作為輸入,保持為0(可自行輸入數值進行調試)
排除檢測數組:將地板檢測的那一段復制過來,將地面排除檢測。
將檢測半徑作為輸入,默認值=20
2.條件判斷
是否擊中:檢測的返回值若為“真”,則進行下一個判斷。
擊中的物體是否與地面垂直:中斷檢測的命中結果(out hit)——獲取法線向量(Impact Normal)——乘以向量(0,0,1)“dot product”——反余弦Acos degree——獲取絕對值——若擊中角度>80——輸出
將對比角度作為輸入,默認值80
3.調用宏
序列2連接宏“檢測玩家滑鏟時碰撞表面”——將上面的使定時器失效復制過來。
完整如下:
4.調試
為了便于調試,將球體檢測的Draw Debug Type作為輸入。
在宏界面選擇類型:針對一幀For One Frame
滑鏟時就可以看到腳部的運動軌跡。
滑鏟的藍圖就建好了,全選后右鍵添加注釋“滑鏟”。
八、是否持續滑鏟
在這里完成兩個邏輯:
- 停止滑鏟
- 當玩家在斜坡上滑動時,可以持續滑動完整個斜坡。
通過與地板的角度判斷是否繼續滑鏟。角度確定,繼續滑行,否則起身。
1.建立蒙太奇通知
通知notify:通過動畫調用動畫藍圖,在動畫藍圖中調用角色藍圖。
滑鏟動畫快結束時通過蒙太奇通知在動畫藍圖中計算速度、調用角色藍圖進行判定是否繼續滑鏟。
創建“當前滑動速度”向量。
打開滑鏟蒙太奇動畫——添加一個通知軌道
在軌道中新建通知Notify“計算速度”,并將該通知放在最后一幀前面。
然后再新建一個通知“查看是否滑鏟”,將該通知放在最后一幀。
2.設置滑動速度
打開動畫藍圖的事件圖表——新建“AnimNotify_計算速度”事件
將“預覽實例”改為“未選中調試對象”(不知道有什么用)。
獲取角色的character movement——get velocity——set 當前滑動速度,滑動速度=當前角色速度
在人物藍圖中新建一個自定義事件“檢查是否繼續滑鏟”。
是否繼續滑鏟=是否滑鏟。
在動畫藍圖中,新建“AnimNotify_查看是否滑鏟”事件——調用剛才創建的事件“檢查是否繼續滑鏟”。
3.檢測地面角度函數
創建函數“尋找當前樓層角度和方向”——返回節點return node,將對齊地板宏中的中斷floor結果那一段復制過來。
中斷命中結果的normal與向量(0,0,1)相乘——獲取逆角度,作為返回節點的“角度”輸出值。
Normal作為X旋轉軸,向前向量作為Y軸,利用XY創建旋轉Make rot from XY——分割返回值引腳,X軸的返回值*Y軸返回值——乘積>0,是否向上傾斜Is slope up=真,作為返回節點輸出值。
4.是否繼續滑鏟事件
回到角色藍圖,繼續寫之前的“檢查是否繼續滑鏟事件”。
檢查是否繼續滑鏟事件——正在滑鏟為真——調用尋找當前樓層角度和方向函數。
是否向上傾斜=真,斜坡——設置角色移動速度=當前滑動速度,當前滑動速度在動畫藍圖中已經設置過,即滑鏟結束時的速度—— 以函數名設置定時器,每0.001s循環“繼續滑鏟”事件(在后面寫),返回值提升為變量“繼續滑鏟句柄”——調用尋找當前樓層角度和方向函數,當前角度提升為變量。
復制一個滑鏟蒙太奇,刪掉通知1、2,將開始時間設為滑鏟開始0.71s,結束時間設置為站起來1.53s。這樣就是一個倒放的滑鏟動畫,玩家從滑鏟起身。
注意:“選取下一個片段”不要選循環,不然會一直重復播放。
是否向上傾斜=假,平地——播放滑鏟起身動畫自定義事件——播放滑鏟起身蒙太奇——延遲0.02s——序列
序列0——滑動追蹤句柄是否有效Is valid——為真,使句柄無效,停止地板檢測。
序列1——翻轉膠囊體事件。
完整如下:
5.繼續滑鏟事件
- 平地,速度不夠時停止
- 斜坡,加速
繼續滑鏟自定義事件——調用尋找當前樓層角度和方向函數,當前角度=角度——將F插值于Finterp to(平滑過度),當前=當前角度、目標=角度、delta time=獲取場景差量Get world Delta seconds、Interp speed=0.4——判定插值后的角度<3?
角度<3,平地——創建變量“停止滑鏟速度”,默認值50——角色速度<停止滑鏟速度時,清除繼續滑鏟句柄,播放起身動畫。
角度>=3,斜坡——序列
序列0——獲取Actor旋轉,獲取向前向量。分割這兩個結構引腳,Z軸相連——添加移動輸入,世界方向=Z軸方向——設置最大滑鏟速度=1500——設置最大滑鏟加速度=500
序列1——檢測玩家滑鏟時碰撞表面宏——為真,撞墻——清除繼續滑鏟句柄
完整如下:
是否持續滑鏟整個藍圖如下:
6.滑鏟后重置旋轉
滑鏟后重置旋轉,讓玩家面對正前方。
自定義事件“重置旋轉體”——獲取Actor旋轉Get Actor Rotation,提升返回值引腳,將Z軸“創建旋轉體Create Rotator”,將旋轉體的返回值提升為變量“默認軸旋轉Defualt Yaw rotaion”——復制膠囊體的時間軸改名為“重置滑鏟旋轉”,旋轉體連接時間軸的play from start
時間軸的update——設置Actor旋轉,new rotation拉出新建“插值(旋轉體)Lerp”——Lerp的alpha連接膠囊體的“值”,A連接獲取Actor旋轉,B連接變量“默認軸旋轉”。
復制滑鏟時設置速度和加速度,最大行走速度=500,最大加速度=1500——膠囊體finished連接
完整如下:
在“檢查繼續滑鏟”事件的播放起身動畫新增一個序列——調用“重置XY旋轉”事件。
九、調整
在滑鏟的“滑動時檢測地板”的“地板檢測”——判定“繼續滑鏟”句柄是否有效Is valid?
為真:清除繼續滑鏟句柄——翻轉膠囊體——重置XY旋轉
為假:翻轉膠囊體——重置XY旋轉
玩家在空中,則停止滑鏟。
在檢測玩家滑鏟時碰撞表面——播放滑鏟起身動畫(玩家踢中物體則站起來)
十、滑鏟結束時下蹲
當頭頂空間不夠時,玩家滑鏟結束后要進入下蹲狀態。
1.動畫通知
在滑鏟結束蒙太奇的第1幀添加通知“檢查天花板”。
在人物藍圖中新建自定義事件“天花板追蹤”
在動畫藍圖中調用通知“檢查天花板”——調用人物藍圖的“天花板追蹤”事件。
2.下蹲
天花板追蹤——按通道進行膠囊體追蹤,起點和終點都=當前位置+70(z),半徑=34,高度=50,trace channel=可見,actors to ignore=創建數組make array,draw debug type=每幀時長——如果檢測到物體——判定character movement的is crouching正在蹲伏
創建“天花板追蹤?”變量。
天花板追蹤=真——解除蹲伏un crouching——天花板追蹤=假
天花板追蹤=假——蹲伏is crouching——將“滑鏟”邏輯中的獲取動畫實例復制過來,停止蒙太奇stop montage,in blend out time=0.2——天花板追蹤=真
完整如下:
3.創建動畫混合空間
創建動畫>舊有>混合空間1D“下蹲_BS”
打開混合空間,水平坐標名稱改為“速度”、最大速度=150。
將下蹲待機動畫拖到第一幀,下蹲行走動畫拖到最后一幀。
在人物藍圖>視口中點擊角色移動chracter movement,在細節中修改:
可下蹲=true,最大蹲伏行走速度=150 cm/s
4.調整動畫藍圖
在動畫藍圖中,找到已有的藍圖。
Movement Component——正在蹲伏Is Crouching,提升為變量“是否正在蹲伏?”
在Locomotion狀態機中創建按布爾混合姿勢Blend pose by bool:
真姿勢=下蹲混合動作、速度=ground speed;
假姿勢=locomotion;
Active value=是否正在蹲伏?
滑鏟結束后,頭頂有東西則下蹲。
5.退出下蹲狀態
在原有藍圖Movement Input的最后面——若天花板追蹤=真——調用天花板追蹤事件。
頭頂無障礙自動站起。