行為樹中動畫播放完成對外通知機制 基於動畫關鍵幀通知機制改進而來
為什么要說是完成通知呢?
因為UE4的動畫片段會補幀, 導入動畫片段的時候, 引擎會因為循環播放的關系, 補上一幀
僅僅播放的時候會展示這一幀, 實際編碼的時候對這一幀的開發將會忽略, 這就是巨坑
所以完成通知要基於關鍵幀通知改進一下, 避開這個坑
下面還是來說說具體的開發過程
采用事件發報機 動畫藍圖負責call 行為樹的task負責bind 狀態機負責切換狀態
有兩個坑點
1.完成關鍵幀要打在最后一幀上, 而不是動畫末尾
2.狀態機切換要比關鍵幀晚, 且不能時動畫的結束時間(即!=length)
首先讓我們來看看改之前的行為樹

N多無用的Sequence節點, 以及為了等待動畫播放完成而設置的Wait節點, 明顯不科學, 萬一幀數不穩定, 時間就會變化.....然后就bug了
接下來就琢磨怎么干掉這些家伙
首先在動畫片段設置關鍵幀事件

注意這里不能把結束事件直接丟到片段的最后, 必須要提前一點, 建議打在最后一幀的幀點上(片段最后是沒有幀點的)
因為動畫的最后一幀是只播放不會執行任何代碼處理的, 具體機制不明
下面是狀態機的轉移條件代碼, 對當前動畫經過長度進行判斷

可以看到, Idle動畫的總時間是2.733333

手動暫停(有誤差)最大就到2.6幾, 所以如果把結束事件直接丟到片段的最后, 得到的結果就是: 不執行
但是動畫會完成, 狀態也會發生變化

狀態變化了, 通知機制沒觸發, 赤果果的bug
接下來在動畫藍圖的事件圖表里面讓關鍵幀事件去調用綁定好的事件發報機, 這個時候事件發報機並沒有內容, 典型的設計模式解耦合做法

這里沒什么坑, 一條過
動畫藍圖搞完了, 再來搞行為樹, 下面是task節點的對應實現

在task finish之前有3個步湊
1.綁定自定義事件到 動畫藍圖的事件發報機, 然后觸發狀態變化
2.業務邏輯處理
3.編寫完成回調的內容, 並且finish task
以下是改造完成后的行為樹

清爽倒是其次, 關鍵是避免了不可控的bug, 這才是價值
