想要怎么動疏唾,那就怎么動蓄氧,用Lua modifier實現(xiàn)位移技能

我們在制作Lua modifier的時候,第一步自然是這個API

LinkLuaModifier("modifier_your_modifier_name", "path/to/your/modifier/modifier_your_modifier_name.lua", LUA_MODIFIER_MOTION_NONE)

多思考一下就不難想到槐脏,最后一個參數(shù)喉童,是做什么用的,如果改為其他的結(jié)果顿天,比如LUA_MODIFIER_MOTION_HORIZONTAL/LUA_MODIFIER_MOTION_VERTICAL/LUA_MODIFIER_MOTION_BOTH堂氯,會有什么不同呢蔑担?
答案是,如果你在Lua modifier的代碼里面不做什么特殊的處理的話咽白,做出來的效果并沒有什么不同啤握。
而這個參數(shù)的不同,導致的結(jié)果是晶框,我們在modifier_your_modifier.lua中排抬,使用

modifier_your_modifier_name = class({})

所創(chuàng)建的這個class,在你為其指定LUA_MODIFIER_MOTION_HORIZONTAL的時候授段,其鏈接到的class不是CDOTA_Modifier_Lua畜埋,而是CDOTA_Modifier_Lua_Horizontal_Motion,而仔細查看這個繼承自CDOTA_Modifier_Lua的class的API文檔畴蒲,不難發(fā)現(xiàn)悠鞍,他多出來的幾個API就是實現(xiàn)運動控制的關(guān)鍵。
首先模燥,我們需要在modifier的OnCreated函數(shù)中咖祭,調(diào)用ApplyHorizontalMotionController,之后在UpdateHorizontalMotion的函數(shù)中為單位刷新位置蔫骂,之后在modifier的OnDestroy函數(shù)中為單位移除運動控制器RemoveHorizontalMotionController么翰。
具體實現(xiàn)

modifier_horizontal_motion_example = class({})

function modifier_horizontal_motion_example:OnDestroy()
    if IsServer() then
        -- 移除運動控制器
        self:GetParent():RemoveHorizontalMotionController(self)
    end
end

function modifier_horizontal_motion_example:OnCreated(kv)
    if IsServer() then
        -- 為單位添加水平運動控制器
        self:ApplyHorizontalMotionController()
        local owner                            = self:GetParent()
        -- 儲存一些初始狀態(tài)
        self.vStartingPosition                 = owner:GetOrigin()
        self.flTimeExpired                     = 0
    end
end

function modifier_player_entering_next_level:UpdateHorizontalMotion(me, dt)
    if IsServer() then
        -- 計算具體的新位置,這個要根據(jù)實際需要來
        -- me指代的是擁有運動控制器的單位辽旋,也就是這個modifier的owner浩嫌,dt就指距離上次調(diào)用這個
        -- 函數(shù)過去的時間
        -- 引擎將會為這兩次調(diào)用之間平滑地插補動畫
        me:SetOrigin(newOrigin)
    end
end

至于具體想要怎么動,那就看你想要具體怎么計算newOrigin了补胚。

舉一個簡單的例子:

newOrigin = self:GetParent():GetForwardVector() * 1000 + self:GetParent():GetOrigin()

這樣這個單位就會以1000的速度向前沖刺了码耐。

如果你還要上上下下地動?
原理是一樣的溶其,你需要在OnCreated函數(shù)中添加 self:ApplyVerticalMotionController()骚腥,并在UpdateVerticalMotion(me, dt)中為單位確定新的位置。
需要注意的是瓶逃,你需要先獲取單位所在的位置束铭,然后計算單位的Z軸的位置,并使用me:SetOrigin()來確定單位的位置厢绝。

function modifier_vertical_motion_example:UpdateVerticalMotion(me, dt)
    if IsServer() then
        local origin = me:GetOrigin()
        origin.z = CalculateYourZ() -- 具體怎么計算根據(jù)你的實際需要來
        me:SetOrigin(origin)
    end
end

最后放上一段自己的代碼
具體的實現(xiàn)效果是契沫,完成一次向指定地點的,高度為4000的拋物線運動:

modifier_creature_pudge_jump = class({})

function modifier_creature_pudge_jump:IsStunDebuff()
    return true
end

function modifier_creature_pudge_jump:IsHidden()
    return true
end

function modifier_creature_pudge_jump:IsPurgable()
    return false
end

function modifier_creature_pudge_jump:RemoveOnDeath()
    return false
end

function modifier_creature_pudge_jump:OnCreated(kv)
    if IsServer() then
        if self:ApplyHorizontalMotionController() == false or self:ApplyVerticalMotionController() == false then
            self:Destroy()
            return
        end

        self.vStartPosition    = GetGroundPosition( self:GetParent():GetOrigin(), self:GetParent() )

        self.vTargetPosition   = self:GetAbility():GetCursorPosition()
        self.flDuration        = 1.7
        self.flHeight          = 4000

        self.vDirection        = (self.vTargetPosition - self.vStartPosition):Normalized()
        self.flDistance        = (self.vTargetPosition - self.vStartPosition):Length2D()
        self.flHorizontalSpeed = self.flDistance / self.flDuration

        -- 創(chuàng)建開始的特效和音效
        EmitSoundOnLocationWithCaster(self.vStartPosition, "Ability.TossThrow", self:GetParent())

    end
end

function modifier_creature_pudge_jump:OnDestroy()
    if IsServer() then
        self:GetParent():RemoveHorizontalMotionController(self)
        self:GetParent():RemoveVerticalMotionController(self)
    end
end

function modifier_creature_pudge_jump:DeclareFunctions()
    local funcs = {
        MODIFIER_PROPERTY_OVERRIDE_ANIMATION,
    }
    return funcs
end

function modifier_creature_pudge_jump:CheckState()
    local state = {
        [MODIFIER_STATE_STUNNED] = true,
    }

    return state
end

function modifier_creature_pudge_jump:GetOverrideAnimation()
    return ACT_DOTA_CAST_ABILITY_ROT
end

function modifier_creature_pudge_jump:UpdateHorizontalMotion(me, dt)
    if IsServer() then
        -- 根據(jù)速度昔汉,設(shè)置當前的位置
        local vOldPosition = me:GetOrigin()
        local vNewPos      = vOldPosition + self.vDirection * self.flHorizontalSpeed * dt
        vNewPos.z          = 0
        me:SetOrigin(vNewPos)

        -- 判斷是否到達了終點
    end
end

function modifier_creature_pudge_jump:UpdateVerticalMotion(me, dt)
    if IsServer() then
        local vOrigin        = me:GetOrigin()
        local vDistance      = (vOrigin - self.vStartPosition):Length2D()
        local vZ             = - 4 * self.flHeight / (self.flDistance * self.flDistance) * (vDistance * vDistance) + 4 * self.flHeight / self.flDistance * vDistance
        vOrigin.z            = vZ
        -- 判斷是否到達了終點
        local flGroundHeight = GetGroundHeight( vOrigin, self:GetParent() )
        local bLanded        = false

        if ( vOrigin.z < flGroundHeight and vDistance > self.flDistance / 2 ) then
            vOrigin.z = flGroundHeight
            bLanded   = true
        end

        me:SetOrigin(vOrigin)
        if bLanded == true then
            -- ApplyDamage
            local units = FindUnitsInRadius(self:GetParent():GetTeamNumber(), self:GetParent():GetOrigin(), nil, 275, DOTA_UNIT_TARGET_TEAM_BOTH, DOTA_UNIT_TARGET_ALL, DOTA_UNIT_TARGET_FLAG_NONE, FIND_ANY_ORDER, false)
            for _, unit in pairs(units) do
                DealDamage(self:GetParent(), unit, 1, self)
            end


            -- Particle
            local pid = ParticleManager:CreateParticle("particles/econ/items/earthshaker/earthshaker_totem_ti6/earthshaker_totem_ti6_leap_impact.vpcf", PATTACH_WORLDORIGIN, self:GetParent())
            ParticleManager:SetParticleControl(pid, 0, me:GetOrigin())
            ParticleManager:ReleaseParticleIndex(pid)

            EmitSoundOnLocationWithCaster(self:GetParent():GetOrigin(), "Ability.TossImpact", self:GetParent())

            self:GetParent():RemoveHorizontalMotionController(self)
            self:GetParent():RemoveVerticalMotionController(self)
            self:SetDuration(0.15, true)
        end
    end
end

教程到此結(jié)束懈万。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子钞速,更是在濱河造成了極大的恐慌贷掖,老刑警劉巖嫡秕,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件渴语,死亡現(xiàn)場離奇詭異,居然都是意外死亡昆咽,警方通過查閱死者的電腦和手機驾凶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掷酗,“玉大人调违,你說我怎么就攤上這事⌒汉洌” “怎么了技肩?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長浮声。 經(jīng)常有香客問我虚婿,道長,這世上最難降的妖魔是什么泳挥? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任然痊,我火速辦了婚禮,結(jié)果婚禮上屉符,老公的妹妹穿的比我還像新娘剧浸。我一直安慰自己,他們只是感情好矗钟,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布唆香。 她就那樣靜靜地躺著,像睡著了一般吨艇。 火紅的嫁衣襯著肌膚如雪袋马。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天秸应,我揣著相機與錄音虑凛,去河邊找鬼。 笑死软啼,一個胖子當著我的面吹牛桑谍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播祸挪,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼锣披,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起雹仿,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤增热,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后胧辽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體峻仇,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年邑商,在試婚紗的時候發(fā)現(xiàn)自己被綠了摄咆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡人断,死狀恐怖吭从,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情恶迈,我是刑警寧澤涩金,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站暇仲,受9級特大地震影響步做,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜熔吗,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一辆床、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧桅狠,春花似錦讼载、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至漩符,卻和暖如春一喘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嗜暴。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工凸克, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人闷沥。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓萎战,卻偏偏與公主長得像,于是被迫代替她去往敵國和親舆逃。 傳聞我的和親對象是個殘疾皇子蚂维,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容