动作控制器范例

From Valve Developer Community
Jump to: navigation, search
English (en)中文 (zh)
... Icon-Important.png
Note.pngNote: 这篇文章发自 /r/Dota2modding. [1]

示例视频

既然你的注意到我,那么我们来讨论一下。数据驱动的能力系统非常牛逼,我们可以用它实现好多好玩的东西。在官方给出的例子和文档中有一些数据驱动效果没有列出来。其中一个就是"ApplyMotionController"。


ApplyMotionController 是干什么的呢?我到处找不到这个的参考内容,所以我决定自己找出来。首先,我们用一种方式打开它。这种方式参考下面代码:

"ApplyMotionController"
    {
        "TARGET" "TARGET"
        "ScriptFile"	 "scripts/vscripts/your_script_here.lua"
        "HorizontalControlFunction"	"TestGravityFunc"
        "VerticalControlFunction" "TestGravityFunc"			
    }

当然不止这些参数, 但这足以令其工作起来. 经过一些测试后,我发现 ApplyMotionController 每秒调用控制水平和垂直的方法好几次 . 返回的值貌似对显示没有作用. 如同下面方法:

function TestGravityFunc(args)
        local targetPos = args.target:GetAbsOrigin()
        local casterPos = args.caster:GetAbsOrigin()

        local direction = targetPos - casterPos
        local vec = direction:Normalized() * 3.0
	
        args.caster:SetAbsOrigin(casterPos + vec)
    end

这是一个非常简单的方法。这个方法得到施法者到目标的方向并且使施法者在这个方向上前进3个单位。如此频繁调用这个方法的目的是通过仿照引力的计算将施法者拉向目标。

然而,我相信我所做的效果不代表全部。作为新手,我找不出HorizontalControlFunction的参数和VerticalControlFunction的参数之间的区别。我猜会有一些方法能使这些方法返回一系列不同指向目标的移动指令,但目前我还未研究出来。CDOTA_BaseNPC:InterruptMotionControllers(bool) 这个方法我也尝试过,但是它貌似不起明显作用。