本文介紹如何向游戲中添加新動(dòng)作。
在實(shí)踐之前推薦閱讀我寫的動(dòng)作詳解,以了解動(dòng)作的基本概念。
用到的MOD API:
- AddAction 向游戲注冊(cè)一個(gè)動(dòng)作
- AddComponentAction 將一個(gè)動(dòng)作與component綁定(嚴(yán)格來(lái)說(shuō)能干更多的事,但一般都是用于動(dòng)作綁定)
- AddStategraphActionHandler 將一個(gè)動(dòng)作與state綁定
添加動(dòng)作
下面以給人物添加一個(gè)徒手砍樹的動(dòng)作為例子


流程
- 編寫一個(gè)動(dòng)作 - 設(shè)置id,名字,觸發(fā)效果
- 注冊(cè)這個(gè)動(dòng)作 - 讓游戲知道有這個(gè)動(dòng)作存在
- 將動(dòng)作與組件綁定 - 設(shè)定動(dòng)作的觸發(fā)的條件
- 將動(dòng)作與state綁定 - 設(shè)定動(dòng)作觸發(fā)時(shí)播放的動(dòng)畫
下面分別編寫各部分代碼,按順序拼接起來(lái)寫在modmain.lua里。
預(yù)定義
在下面會(huì)需要使用一些游戲中全局變量,這些全局變量在modmain的運(yùn)行環(huán)境中不存在,需要從GLOBAL表中獲取,預(yù)定義好,否則會(huì)報(bào)nil錯(cuò)誤。
local ACTIONS = GLOBAL.ACTIONS
local ActionHandler = GLOBAL.ActionHandler
編寫動(dòng)作
local id = "PUNCHTREE" --必須大寫,動(dòng)作會(huì)被加入到ACTIONS表中,key就是id。
local name = "徒手砍樹" --隨意,會(huì)在游戲中能執(zhí)行動(dòng)作時(shí),顯示出動(dòng)作的名字
local fn = function(act) -- 動(dòng)作觸發(fā)的函數(shù)。傳入的是一個(gè)BufferedAction對(duì)象??梢酝ㄟ^(guò)它直接調(diào)用動(dòng)作的執(zhí)行者,目標(biāo),具體的動(dòng)作內(nèi)容等等,詳情請(qǐng)查看bufferedaction.lua文件,也可以參考actions.lua里各個(gè)action的fn。
if act.target.components.workable ~= nil and
act.target.components.workable:CanBeWorked() and
act.target.components.workable.action == ACTIONS.CHOP then
act.target.components.workable:WorkedBy(act.doer,1)
return true
end
end
注冊(cè)動(dòng)作
AddAction(id,name,fn) -- 將上面編寫的內(nèi)容傳入MOD API,添加動(dòng)作
。
綁定組件
在這里需要?jiǎng)右粍?dòng)腦筋。選擇要和哪個(gè)組件進(jìn)行綁定,綁定成什么類型,設(shè)定怎樣的條件可以觸發(fā)動(dòng)作,全憑個(gè)人喜好。
local type = "SCENE" -- 設(shè)置動(dòng)作綁定的類型
local component = "workable" -- 設(shè)置動(dòng)作綁定的組件
local testfn = function(inst, doer, actions, right) -- 設(shè)置動(dòng)作的檢測(cè)函數(shù),如果滿足條件,就向人物的動(dòng)作可執(zhí)行表中加入某個(gè)動(dòng)作。right表示是否是右鍵動(dòng)作。
if inst:HasTag("CHOP_workable") and doer:HasTag("player") then
table.insert(actions, ACTIONS.PUNCHTREE)
end
end
AddComponentAction(type, component, testfn)
綁定state
在聯(lián)機(jī)版中添加新動(dòng)作需要對(duì)wilson和wilson_cient兩個(gè)sg都進(jìn)行state綁定。
此處選擇的state最好是整個(gè)執(zhí)行過(guò)程中某個(gè)階段帶有inst:PerformBufferedAction()語(yǔ)句的。這條語(yǔ)句是觸發(fā)動(dòng)作的fn用的。如果整個(gè)state里沒(méi)有這句,則動(dòng)作的fn是不會(huì)觸發(fā)的,也就不會(huì)達(dá)到你預(yù)期的效果。
推薦使用的官方state: dostandingaction,doshortaction,dolongaction,dojostleaction
除此之外你也可以自行編寫state,自己控制播放什么動(dòng)畫,何時(shí)觸發(fā)動(dòng)作的fn等等。需要注意的是主機(jī)端和客機(jī)端在這上面的代碼是有區(qū)別,具體請(qǐng)參考官方的代碼。
local state = "dojostleaction" -- 設(shè)定要綁定的state
AddStategraphActionHandler("wilson",ActionHandler(ACTIONS.PUNCHTREE, state))
AddStategraphActionHandler("wilson_client",ActionHandler(ACTIONS.PUNCHTREE,state))