打开主菜单

Ballance Wiki β

VSL/zh

本条目并不是玩家口中通常所说的Virtools脚本,关于玩家通常所说的Virtools脚本,请参见脚本

VSL(Virtools Script Language,Virtools脚本语言)是一种强大的脚本语言[1],通过提供对Virtools SDK的脚本级别访问,对Virtools 原理图编辑器进行了补充。 VSL编辑器支持智能的上下文相关的文本突出显示(着色)系统,上下文相关的完成和功能参数的自动显示。同时也包括完整调试模式:断点,具有值编辑功能的变量监视以及单步调试(包括进入函数/退出函数支持)。

VSL是Virtools 3.0开始引入的,因此脚本内嵌地图是不能使用VSL的,但是可以在制作自制地图的过程中使用VSL进行一部分辅助制作。

目录

概述

适用

VSL是一种程序员和脚本编写者均可使用的高级功能:

  • 对于程序员来说,VSL是Dev内部与SDK的接口。 无需创建C++项目,就可以轻松快速地测试新想法,并且无需编写新的DLL就可实现自定义代码。
  • 对于脚本编写者,VSL是替换复杂参数操作(例如数学计算,字符串操作)和创建高级行为脚本的理想选择。

VSL还是一种非常有效的方式来自动化您的工作流程(例如,完成媒体处理,仅用几行脚本执行批处理操作等),实现创新的视觉效果等等。

要求

在尝试使用VSL之前,必须具有先前的编程或脚本编写(例如JavaScript,C++)经验。 此外,您必须相当熟悉或愿意熟悉Virtools SDK。

相似功能比较

如果您想在Dev中执行当前不存在BB或BG的操作。您可以使用原理图编辑器,VSL以及Virtools SDK三者中间任意一个进行编写。而具体选择使用哪一种取决于您的能力和目标。使用最适合您需求的解决方案。需要记住的是,从原理图编辑器到VSL再到Virtools SDK,开发复杂性通常会增加。

原理图编辑器

通常,如果通过简单连接现有Building Block或Behavior Graph脚本可以轻松满足您的需求,请使用原理图编辑器。

VSL

如果发现正在创建复杂脚本,例如具有需多循环的,或者需要创建许多Param Operation树,那么您可能需要考虑编写VSL脚本。您可能希望使用VSL进行原型设计和测试(但是,如果可行的话,请尽量使用SDK来实现这些想法,以实现最佳性能)。或者,您也可以使用VSL创建自定义功能,而不必为分发自定义DLL而担心。

注意:尽管VSL可以创建新的数据类型(结构),但是它们仅在VSL中可用,并且只能由VSL脚本使用。

Virtools SDK

有些事情只能用SDK来完成,因为VSL中并非所有功能和方法都可用,或者在自定义插件中实现时效果更好(除了定义新的Building Block之外,还可以定义新的数据类型,并使用管理器来运行所有内容)。

基础内容

全局VSL函数和Run VSL函数

VSL脚本可以是以下两种类型之一:全局VSL或Run VSL。

全局VSL脚本的存在意义在于定义可用于所有其他VSL脚本的功能。全局VSL脚本不能自己运行,只能由其他VSL脚本(包括全局VSL和Run VSL)调用。

Run VSL脚本将被附加到原理图编辑器中的Run VSL Building Block中——一个Run VSL脚本对应于一个Run VSL Building Block,其中Run VSL Building Block的第一个pIn包含该BB执行的VSL代码。Run VSL脚本也可以在作者模式下运行(通过从VSL脚本管理器内执行代码),也可以在运行时模式下与其他任何Building Block一样激活和处理Building Block。

Run VSL脚本能够使用bc(行为上下文)全局变量。

行为上下文和动作上下文

bc是全局变量,只能在Run VSL脚本中使用。ac是一个全局变量,只能在Actions脚本中使用。两者都提供了一些非常有用的方法:

  • 创建对象
  • 在控制台或3D视图中写文本
  • 管理属性
  • 与变量管理器打交道
  • 对你的脚本进行性能分析
  • 等等

bc具有特定的运行时方法,例如:

  • 管理消息
  • 运行一个场景
  • 等等

而ac则专注于选择和鼠标位置等。

脚本间的依赖关系

需要注意的是,从全局VSL脚本调用函数的任何脚本(全局VSL或Run VSL)都依赖于该全局VSL脚本。如果修改全局VSL脚本,则不仅必须先重新编译此脚本,而且还必须重新编译所有调用该全局VSL脚本的脚本。对VSL脚本进行更改时,可以通过查看VSL管理器的 VSL脚本视图中的已编译列来查看更改,决定是否需要重新编译某些VSL脚本。

变量类型

除了在下面列出的基本类型,您还可以使用VSL <- SDK Binding Tables - Classes and Methods中列出的类。您还可以使用VSL <- SDK Binding Tables - Enumerations中列出的枚举参数类型。

基本类型

  • bool:布尔值。布尔值为true(TRUE)或false(FALSE)。
  • char:字符值。字符是-128到127(含)范围内的有符号字节值。
  • int:整数值。一个int是一个有符号4字节值,范围为-2,147,483,648到2,147,483,647(含)。
  • float:浮点值。浮点数是一个有符号的4字节值。
  • str:字符串。 str是由空字符0或'\ 0'终止的字符的常量数组。也就是通常所说的C风格字符串。注意:如果要操作字符串,则应使用从Virtools SDK绑定到VSL的String类。

如上所述,所有其他可能的变量类型将在VSL/SDK绑定表中列出。如果在其中看不到要查找的类型,则意味着脚本中不允许该类型的变量。

为避免定义NULL对象,强烈建议您使用调试检查(可在变量管理器中激活或停用)。运行使用NULL对象变量的脚本可能会导致VSL Manager崩溃,也可能会导致Dev崩溃。因此与通常一样,强烈建议您在进行软件开发时,尽可能多地保存项目的增量版本。

编译,调试,发布

必须先编译所有VSL脚本,然后才能运行它们。在以下情况下,VSL管理器将自动尝试编译未编译的VSL脚本:

  • 加载Virtools文件(CMO,VMO,NMO或NMS)时
  • 当Run VSL Building Block被激活时

需要注意的是,在尝试编译运行VSL脚本之前,VSL管理器会尝试编译任何必需的(链接的)全局VSL脚本。强烈建议您在运行VSL脚本之前先对其进行编译,以检查错误并帮助确保VSL脚本将按预期运行。

您可以选择在VSL脚本管理器中编译所有脚本或仅编译某些脚本。编译VSL脚本时,必须决定是将其编译为Debug还是Release。

可以使用VSL脚本管理器中的调试工具来调试作为Debug编译的VSL脚本。您不能从VSL调试Virtools SDK元素。不能使用VSL脚本管理器调试工具来调试编译为Release的VSL脚本。在运行时,Release VSL脚本的执行速度比Debug VSL脚本快几倍,因为它们是使用JIT编译器进行编译的,该JIT编译器会创建高度优化的,类似于汇编程序的代码。

注意事项:

  • 可以在Debug中同时使用某些脚本,而在Release中则同时使用其他脚本——除非脚本共享一个全局VSL脚本(即,可以调试或发布全局VSL脚本,但不能同时使用这两个脚本)。
  • 在VSL脚本上更改编译模式(例如,从Debug到Release),也可能导致链接的Global脚本也被重新编译。
  • 编译脚本(全局VSL或Run VSL)时,VSL管理器首先尝试编译未编译或处于不同编译模式(例如Release / Debug)的所有全局脚本。如果编译失败,则错误消息将出现在VSL脚本管理器的Errors部分和Event Log中。
  • 编辑全局脚本后,该脚本将变为“未编译”。使用此脚本任何部分的所有其他脚本也都设置为“未编译”。
  • 强烈建议:在变量管理器的VSL部分中选择Debug Check Variable,以确保所有对象都经过测试,并确保在使用它们之前它们不是NULL(即使它们存在)。

运行VSL脚本

您可以在作者模式(Author mode)或用户模式(Player mode)下运行VSL脚本。

作者模式

在“VSL脚本管理器中,在VSL脚本列中选择一个Run VSL脚本,然后单击Run Script或按F5。 请注意,以作者模式运行脚本仅会执行VSL代码。 Run VSL Building Block本身并不会激活。 这意味着将使用pIn并计算pOut,但不考虑bInbOut

用户模式

用户模式也称运行时模式,必须通过与另一个Building Block,或原理图中的脚本起始点的链接激活Run VSL Building Block来运行脚本。

保存与导出

您可以通过VSL脚本管理器界面中的保存和加载按钮保存和加载全局VSL和Run VSL脚本。 VSL脚本另存为扩展名为.VSC的文本文件。需要注意的是,您只能将VSL脚本加载到当前任何存在的VSL脚本中。 加载之前,请确保脚本为空,否则,您要导入的脚本将替换您已有的任何代码。 还要注意,您要保存或导入的只是代码视图中的源代码——不保存与上下文设置(bIn,bOut,pIn,pOut)有关的信息。

当然,您可以保存具有VSL脚本的Virtools文件(CMO / VMO / NMO / NMS)。 在这种情况下,请确保在加载保存的文件时所有被依赖的脚本均是可用的。

限制

VSL是一种对Virtools的补充,但不能替代Virtools SDK。 在某些情况下,Virtools SDK更合适,并且某些事情VSL无法完成,仅可通过Virtools SDK来实现:

  • 不能创建管理器
  • 不能实现文件导入器
  • 不能注册新的参数类型
  • VSL中没有模板
  • VSL中没有指针
  • VSL中没有动态分配(例如,像new这样的运算符)
  • 无法使用VSL写入磁盘或从磁盘读取数据
  • 在VSL中不能创建类
  • VSL中没有双精度浮点类型
  • VSL脚本限制为65,535个字符

VSL/SDK绑定表页面列出了VSL中可用的所有功能及其相应的SDK元素。 如果表中未列出SDK元素,则该SDK元素在VSL中不可用。

注释

机器翻译和人工修改自Virtools 3.5的说明文档。

  1. 在Virtools中相比较原理图的连线来说已经够强大了