基本概念
entity
在游戲中的大部分對象都是entity,這是一個(gè)在底層核心中被編譯好的類,我們無法看到源碼,但可以調(diào)用它的相關(guān)函數(shù)。游戲里有已經(jīng)打包的entity的創(chuàng)建函數(shù)。要?jiǎng)?chuàng)建一個(gè)entity對象只需要這么寫即可:local inst = CreateEntity(),然后就可以通過inst:XXX(p1,p2..)的形式調(diào)用相關(guān)的函數(shù)了。
AnimState
每一個(gè)entity都可以調(diào)用函數(shù)AddAnimState()來加入AnimState模塊。這個(gè)模塊控制提供了一系列的函數(shù)來控制entity的動(dòng)畫表現(xiàn)。
Animation
Animation是指一個(gè)單獨(dú),完整的動(dòng)畫,每一個(gè)Animation都有自己的名字。
代碼控制播放動(dòng)畫:對象引用.AnimState:PlayAnimation("動(dòng)畫名")
Bank
Bank是一個(gè)集合,記錄著一些Animation的名字。
一個(gè)entity的bank決定了它能播放哪些動(dòng)畫。當(dāng)它試圖播放一個(gè)不存在于Bank中的動(dòng)畫時(shí),就會(huì)在游戲中顯示為透明。
Build
Build是材質(zhì)包,也就是存放在MOD文件夾或游戲的data文件夾下的anim文件夾下的那些.zip文件。
可以使用同一套Bank,不同的Build來表現(xiàn)不同的形態(tài)。比如說人物都是統(tǒng)一使用名為“wilson”的Bank,但每個(gè)人物都有自己的Build,通常與人物的prefab名相同。
Symbol
一個(gè)動(dòng)畫里有多個(gè)部分,比如說手、腳、身體、頭等等,每個(gè)部分被視為一個(gè)Symbol,還有一些Symbol是覆蓋多個(gè)部位的。在游戲中可以通過AnimState模塊調(diào)用相關(guān)函數(shù)來隱藏,顯示某個(gè)symbol。最典型的例子就是裝備手持武器,一般在編寫武器的代碼時(shí),都會(huì)編寫裝備和卸載時(shí)觸發(fā)的代碼。裝備時(shí)會(huì)顯示ARM_carry這個(gè)symbol而隱藏ARM_normal,卸下時(shí)則正好相反。這就是裝備武器時(shí),手的形態(tài)會(huì)有變化的原因。
Spriter中的對應(yīng)關(guān)系
scml的文件名對應(yīng)著Build,動(dòng)畫合集名(entity)對應(yīng)著bank,每一個(gè)動(dòng)畫名對應(yīng)著Animation。
另外,每一個(gè)文件夾的名字對應(yīng)著一個(gè)symbol。不過這只是完全用spriter制作的動(dòng)畫才會(huì)如此,官方的動(dòng)畫不使用spriter進(jìn)行制作,所以往往有著獨(dú)特的symbol名,這就需要到游戲的代碼中去查詢了。
相關(guān)方法
為了方便,以下的對象引用一律采用inst。
常用
這些方法在MOD制作中常常用到,應(yīng)當(dāng)熟悉
-
inst.entity:AddAnimState():添加AnimState模塊,返回inst的AnimState的引用。建立有動(dòng)畫的Prefab必寫,人物除外(已封裝于MakePlayerCharacter)。 -
inst.AnimState:SetBuild("build_name"):設(shè)置Build,建立有動(dòng)畫的Prefab必寫,人物除外(已封裝,默認(rèn)為人物的Prefab名)。 -
inst.AnimState:SetBank("bank_name"):設(shè)置Bank,建立有動(dòng)畫的Prefab必寫,人物除外(已封裝,默認(rèn)為wilson)。 -
inst.AnimState:PlayAnimation("anim_name"[,loop]):播放動(dòng)畫,loop可選,表示是否要循環(huán)播放,默認(rèn)false -
inst.AnimState:PushAnimation("anim_name"[,loop]):將動(dòng)畫添加到播放隊(duì)列中,在當(dāng)前動(dòng)畫播放完成后接著會(huì)播放該動(dòng)畫:,loop可選,loop表示是否要循環(huán)播放,默認(rèn)true -
inst.AnimState:SetPercent("anim_name", percent):設(shè)置動(dòng)畫停滯在某個(gè)百分點(diǎn)上,常在諸如饑餓,精神,血量等指示器中被使用。
未在此介紹的其它方法,要么用途較偏,要么有已經(jīng)封裝好的組件可供使用,實(shí)際使用到的機(jī)會(huì)很少,不多介紹。
相關(guān)事件
動(dòng)畫在播放完成后會(huì)觸發(fā)事件,可以利用事件來完成一些事。比如讓特效播放結(jié)束后消失。在StateGraph中有著廣泛的應(yīng)用。常見的用法是某個(gè)動(dòng)畫播放結(jié)束后將狀態(tài)轉(zhuǎn)為state。
animover:在當(dāng)前動(dòng)畫播放結(jié)束后觸發(fā)
animqueueover:在所有的播放隊(duì)列都結(jié)束后觸發(fā)
讓特效在動(dòng)畫結(jié)束后被移除:
inst:ListenForEvent("animover",function(inst) inst:Remove() end)