自定義動(dòng)作

本文介紹如何向游戲中添加新動(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綁定

實(shí)例下載


添加動(dòng)作

下面以給人物添加一個(gè)徒手砍樹的動(dòng)作為例子


徒手動(dòng)作
砍下去

流程

  1. 編寫一個(gè)動(dòng)作 - 設(shè)置id,名字,觸發(fā)效果
  2. 注冊(cè)這個(gè)動(dòng)作 - 讓游戲知道有這個(gè)動(dòng)作存在
  3. 將動(dòng)作與組件綁定 - 設(shè)定動(dòng)作的觸發(fā)的條件
  4. 將動(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))
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • behavior 是安卓支持包 SDK 里新加的一個(gè)布局控制器,可以很方便的移動(dòng)布局,設(shè)置布局的各種手勢(shì)監(jiān)聽。 我...
    Turaiiao閱讀 1,597評(píng)論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,568評(píng)論 19 139
  • 這篇文章將闡述如何讓你的函數(shù)能夠在自己設(shè)置的限定條件下,通過(guò)外部輸入(主要是鼠標(biāo))來(lái)觸發(fā)執(zhí)行。 對(duì)于很多有了一定M...
    LongFei_aot閱讀 5,650評(píng)論 0 17
  • 簡(jiǎn)介 事件模型很多編程語(yǔ)言中都有廣泛的應(yīng)用,在饑荒中也一樣。許多component在執(zhí)行一些核心函數(shù)時(shí)都會(huì)順帶觸發(fā)...
    LongFei_aot閱讀 14,177評(píng)論 0 17
  • 第一次的到訪天津雖然匆匆的結(jié)束,也沒(méi)有真正的留下半天到天津市里轉(zhuǎn)轉(zhuǎn),感受漕運(yùn)的歷史痕跡。昨天也是這樣的天色離開住處...
    卓紘畾的書簽閱讀 519評(píng)論 0 1

友情鏈接更多精彩內(nèi)容