7.Unity 基于Flux制作Act技能編輯器

相關(guān)視頻 :


Flux是一個(gè)類似于TimeLine的軌道動(dòng)畫編輯插件,看過Flux的代碼,寫得真好,拿來用了。然后再憑借之前寫的戰(zhàn)斗demo經(jīng)驗(yàn)做出的Act技能編輯器。目前網(wǎng)上關(guān)于技能編輯器的資料比較少,花了很久的時(shí)間才做得有點(diǎn)模樣,自己摸出來的思路可能不算特別好,給大家參考下。(大概半年后會(huì)開源)
技能編輯器分3部分:
1.技能預(yù)覽, Flux在預(yù)覽部分基本都做好了,用法和TimeLine類似。
2.技能數(shù)據(jù)保存。需要將Flux中的序列事件信息保存起來,給技能執(zhí)行器用。
3.技能事件執(zhí)行器。核心運(yùn)行邏輯。
總的來說就是,用Flux做技能預(yù)覽,然后序列化技能數(shù)據(jù),保存幀時(shí)間序列。比如動(dòng)作,特效,位移等等事件。最后是模仿Flux的序列(Sequence)做技能事件執(zhí)行器。
1.技能預(yù)覽

Flux的結(jié)構(gòu)是,Sequence→Container→Timeline→Track→Event。一個(gè)父容器包含多個(gè)子容器。比如Sequence包含多個(gè)Container。以此類推,一個(gè)Track上放多個(gè)Event。
創(chuàng)建流程:創(chuàng)建一個(gè)Sequence,在默認(rèn)容器Container(Default)上, 添加玩家TimeLine,加上動(dòng)畫Track,再加上一段AnimationClip作為動(dòng)畫事件。
同理加上位移事件和播放動(dòng)畫事件,一個(gè)簡(jiǎn)單的技能預(yù)覽就算做完了,拖動(dòng)時(shí)間軸就可以預(yù)覽了。
操作起來應(yīng)該不難,參考我的視頻 技能編輯器-初版 的操作。
其次是,想改造這個(gè)編輯器得有點(diǎn)編輯器基礎(chǔ)。
2.數(shù)據(jù)保存
Event的主要結(jié)構(gòu):起始幀Start,結(jié)束幀End,以及內(nèi)容。
如動(dòng)畫事件的內(nèi)容為AnimationClip,StartOffset(動(dòng)畫偏移) 和 BlendLength(動(dòng)畫混合幀數(shù))

為了序列化數(shù)據(jù),AnimationClip則保存Name即可。這樣就完成一個(gè)事件的保存了。
讀取編輯器Sequence數(shù)據(jù):

保存結(jié)果如上圖所示,一個(gè)SkillEventData里有,動(dòng)畫事件,位移縮放事件,特效事件,傷害判定事件,子技能事件等等。
其中, SubSkillData是一個(gè)List<SkillEventData>,作為子技能們, 子技能和主技能的結(jié)構(gòu)都是SkillEventData。同樣擁有動(dòng)畫,位移等事件。一般用于生成的劍氣特效。
按第一張圖來說,玩家(man_editor)就是主技能,NorAck_1就是子技能。
(數(shù)據(jù)保存中名字變?yōu)椋?SkillId+_子技能序號(hào) = “NorAck_0_1”)
NorAck_0 的內(nèi)容是 動(dòng)畫/位移事件+子技能事件
NorAck_0 _1中的內(nèi)容則為特效事件+傷害觸發(fā)事件 +位移事件
這樣一個(gè)技能的內(nèi)容就算保存完畢了。

3.技能事件執(zhí)行器,核心運(yùn)行邏輯
由于Container一般只用一個(gè)。所以運(yùn)行時(shí)的邏輯層簡(jiǎn)化為 :
Sequence→Timeline→Track→Event。
Sequence為主技能和子技能的總和,
Timeline為單個(gè)主/子技能,
Track則對(duì)應(yīng)類型EventList(如AnimEvents),
Event則是最小的事件單位。
用偽代碼來寫,思路是這樣的
當(dāng)所有Event完成時(shí),技能就完成。
具體可以直接看源碼
XCEventsRunner ?(Timeline)
https://github.com/smartgrass/XCSkillEditor_Unity/blob/main/Assets/Scripts/Skill/XCEventsRunner.cs
XCEventsTrack
https://github.com/smartgrass/XCSkillEditor_Unity/blob/main/Assets/Scripts/Skill/XCEventsTrack.cs
XCEvent
https://github.com/smartgrass/XCSkillEditor_Unity/blob/main/Assets/Scripts/Skill/XCEvent.cs
Event層
Event的生命周期有Init,Trigger,Update,F(xiàn)inish,Stop。
當(dāng)技能幀 t ≥Start時(shí),觸發(fā)一次Init和Trigger。
當(dāng)End≥ t ≥Start,則持續(xù)執(zhí)行Update(t)
當(dāng)t≥End,則是執(zhí)行Finish和Stop。此時(shí)Event便被標(biāo)記為Finished。
偽代碼:
然后通過繼承XCEvent實(shí)現(xiàn)不同的事件效果
以動(dòng)畫事件為例:
位移事件為例: