调用Lua 脚本

 引言

Vision 的 Lua 编辑工具组提供多种节省时间的功能,例如代码完成和预定义代码模板。 

重要说明: 请注意,我们采用 SWIG 封装 Lua 中的 C++ 类,所以所有对象的行为都类似指针 - 包括向量(Vision.hkvVec3)或颜色(Vision.VColorRef)。 因此,赋值(vector1 = vector2)所修改的是指针而非数据。 在这种情况下,您应当使用 clone() 而非赋值(vector1 = vector2:clone())。 ‘+’、‘-’、‘*’、‘/’等关键字可以放心使用,因为它们会为您生成一个新实例:vector1 = vector2 + vector3 

 代码插入

代码插入图标提供一份传递到 Lua 系统的可用事件类型的列表。 右键单击列表中的某条目,该函数将被放置到您的脚本的末尾。 

例如,选择 OnThink(self) 条目将生成如下 Lua 代码片段: 

function OnThink(self)	
 
end

 自动完成

输入代码时,当您在 Timer 等定义符号后方输入一个圆点或冒号,程序会显示自动完成对话框,包括对象所包含的函数。 

切换脚本编辑器工具栏上的自动完成图标可启用 / 关闭该功能。 

自动完成功能也可手动激活,方法为组合键 CTRL + SPACE,也可用 ESC 键关闭。 

 脚本缓存

脚本面板提供在 vForge 中启用 / 关闭脚本缓存的选项。 该选项仅影响编辑器中的行为。 脚本缓存默认为启用状态,也就是说,在每个脚本组件的实例化期间,将使用一份脚本资源的缓存版本(如可用)。 如果脚本缓存被关闭,在每个脚本组件的实例化期间,脚本文件将被检查,脚本资源将被重新载入,以防存在任何更改。 该行为模式的使用案例之一是,如果您在 在编辑器中运行模式下也想编辑脚本,并为场景添加使用更新后脚本的脚本组件,则应该关闭缓存。 如果您的工作流不明确要求这一行为模式,请将脚本缓存保留为启用状态,因为其性能更佳(载入有大量脚本组件的场景时速度也更快)。 

 Lua 帮助

为协助您开发 Lua 脚本,您可以随时打开  Lua Scripting API,方法为选择脚本编辑工具栏中的 Lua 帮助图标,或按 F1 键:

该图标会打开一份标准帮助文档,全面涵盖 Vision Lua 类,另有使用中的命令的简单示例。 

提示: 如果您想获得有关某个具体命令的帮助,例如”OnCreate”、”SetPosition”等等,只需在脚本编辑器中选择文本并按 F1 键,帮助程序会立刻为您搜索关键词。

  Vision Lua 101

ScriptingAPI CHM 对于所有脚本命令都是一份宝贵的资源,但为帮助您在 Lua 学习过程中入门,有一些简单的命令和规则需要了解: 

信息: 示例项目中有一份脚本示例:/Data/Vision/Samples/Engine/Scripting/LuaScripting.project

     Self

self 变量用于引用该脚本所附的实体。 对于某个实体类型,我们可以使用如下脚本行。 

self:SetMesh("Models\\Warrior\\Warrior.model")
self:SetScaling(2)

这个小示例会把实体模型文件设给 Warrior,并将其统一缩放增加到 2。 

  调试打印

如果您需要测试变量内容或仅插入简单的追踪,打印到屏幕是快捷而简单的反馈方法。 您可使用如下命令: 
Debug:PrintLine("Hello World")
请使用双点技巧在 PrintLine 函数方法中合并字符串。
local numProps = self:GetNumProperties();
Debug:PrintLine("The entity has " .. numProps .. " prop(s)")
当您需要打印某个矢量的内容,请使用 tostring(var) 函数方法。
Debug:PrintLine("Setting a new property value...")
self:SetProperty("myProp", Vision.hkvVec3(1.2, 2.3, 3.4));
propVal = self:GetProperty("myProp");
Debug:PrintLine("The entity's new property value is: " .. tostring(propVal))	

  时间增量

为确保运动在不同帧率下保持恒速,您可以将速度因数乘以时间增量。 当前时间增量(从上次调用至今的时间)可从 Timer:GetTimeDiff() 函数方法返回。 

function OnThink(self)
    -- rotate entity over time
    local t = Timer:GetTimeDiff()
     self:IncOrientation(t*10, 0, 0)
end
转自 http://www.anarchy.cn/portal.php?mod=view&aid=48

猜你喜欢

转载自plmkome.iteye.com/blog/2084403