学好SQF, 快活Arma3

这篇博客详细介绍了Arma3的SQF脚本语言,包括编辑器的选择、脚本的运行准备、基础知识点如变量、数组、逻辑表达式、循环语句等,并提供了丰富的例子和调试技巧。此外,还涵盖了函数调用、计数、查找、应用操作和随机数等进阶概念,是学习SQF的实用教程。
摘要由CSDN通过智能技术生成
Arma3 SQF脚本学习轨迹 (6月后更新)
    SQF, 是波西米亚公司为Arma3设计的脚本语言. 网上关于SQF的教程零散,且很多都不全,大部分学习需要查询波西米亚的维基百科,学习过程曲折,这里分享我在学习SQF过程中的总结,也可以说是关于SQF的一个实时更新的教程.

    如有错误, 希望指出.

在这里插入图片描述


SQF编辑器选择 >>

在这里插入图片描述

   这里用主流的VSCode编辑器演示,安装时采用上图的插件,主要是添加高亮和补全提示, 也可以采用NotePad++, SublimeText等
   当然如果想要作的话 记事本 和 Vim 也可以, 没有高亮而已 (Just A Joke)
   测试脚本需要在游戏环境下运行, 可以在游戏编辑器内部的调试控制台调试脚本(只能少量脚本, 因为游戏内的编辑不适用’回车’, 也就是说脚本代码不是呈块状, 一行到底)


SQF 编写和运行准备>>

    如何运行: 打开Arma3 的 Editor, 新建工程后保存, 单人会在 “文档 / Arma3 / missions /” 文件夹下. 多人在 “文档 / Arma3 / mpmissions /” 文件夹下. 打开工程文件夹, 新建脚本文件 “xxx.sqf” 并编辑. 写完后保存. 在游戏内的触发器里或者调试控制台内输入 call { execVM “xxx.sqf”; }; 如果不在统计文件夹下, 在文件名前加上路径即可.


SQF脚本入门知识点>>

  局部变量

   概念:   用于存储数据, 作用参考数学变量. 局部则是表示该变量仅仅用于该文件内.
   变量的数据类型有以下几种
   Number(数字) String(字符串) Array(数组) Group(组) Boolean(布尔值) Object(对象) Side(阵营类型) Config(配置) Location(地点) ScriptHandle(脚本句柄) HashMap(哈希表) HashMapKey(哈希表关键字) 等.
   局部变量标志 _+变量名 比如 _name;
   局部变量值为 nil 时, 表示空, 可理解为删除变量.
   private 修饰的变量表示该变量不能被外文件修改.

   维基百科数据类型

  特殊变量

   概念:   特殊变量是游戏引擎用于特定环境下特别设定的变量.
   常见的有一下变量:
   其中, _x 变量的服务范围属于 apply, count, configClasses, configProperties, findIf, forEach, select 等语句中.
   其中, _this 变量用于使脚本调用(call、execVM、execVM、spawn)的参数对脚本可见和可访问,也可用于传递参数, 类似于C++的 this 指针的作用.
   如果没有理解这些变量的作用, 不必过于深究, 下面的学习中可以慢慢领悟.
   
   维基百科特殊变量
   在这里插入图片描述


  Array 数组

   概念:   元素的集合.
   神奇的是在 SQF 中, 数组内的元素的数据类型可以是不同的, 而且数组的定义也不需要声明数组的类型, 因为在 SQF 中, 数组就是数组 (Array) 类型.
  数组的赋值是引用关系, 即同一个数组用两个变量名字, 对一个数组变量操作会引起另一个数组变量的变化.
   注意! 由于下图中含有 set 操作, 需要和下文的 set 知识点结合看. select x 表示选择数组的第 x 个.

   维基百科Array
在这里插入图片描述


  Set 映射

   概念:   哈希映射表的使用
   set 映射常常和数组一起使用, 在设计中一般充当了修改数组的作用.
格式为   数组变量名 set[index, value];  对已经存在的数组建立映射关系, 如果下标不存在, 就会帮数组新建, 如果值不相同就会帮数组修改值.


   维基百科Set
在这里插入图片描述


  逻辑表达式和运算符

   逻辑表达式概念:   一般当作条件判断句, 由逻辑符和变量名构成.
   基本的逻辑关系有 非 (! 或 not)  与(&& 或 and)   或(|| 或 or).
   通过添加小括号可以先执行小括号里的语句, 因为小括号的优先级最高.
   在这里插入图片描述
   
   运算符概念:   数学运算, 由运算符和变量名构成.
   比较符有 大于(> 或 greater)  小于(< 或 less)   大于等于(>= 或 greater=)   小于等于(<= 或 less=)   不等于(!=).
   
   运算符有 加(+)   减 或 负(-)   赋值(=)   开方(^)   乘(*)   除(/)   模除(%)   哈希(hash 或 #).

   
    维基百科脚本命令大全 (运算符的在A列里最前几个)
   在这里插入图片描述


  消息输出

   Hint语句:  属于控制台调试输出语句, 一般用于在调试代码中输出特定值调试而采用.

    有以下三种使用方式:


   维基百科Hint

在这里插入图片描述


SQF脚本基本逻辑语句 >>

  If条件从句

   概念:   如果 ( ) 内的条件成立,就执行 then { } 内的句子; 不成立就不执行或者执行else { } 内的语句
   比较鸡肋的是在SQF中并没有明确的else-if, 即多条件判断. 波西米亚的维基百科也未提到. 多条件判断只能在else里嵌if 和部分情况下使用 switch条件语句.
  在SQF中 If 从句还可以类似于三目运算判断的存在,即可以有:    _value = if(1 > 0) Then { “hello”; };

  维基百科If
  在这里插入图片描述


  Switch条件从句

   概念:  将 ( ) 内的值与每个 case 后面的选项配对, 找到自己后, 执行该 case 后 { } 的语句, 如果没有找到, 只能去 default 后面执行.
    ( ) 内的值类型可以是所有类型.
   如果 ( ) 里的值是字符串, 那么会区分字母的大小写.

   维基百科Switch
   在这里插入图片描述


  While循环从句

   概念:   当 ( ) 内的条件成立时, 就做 Do { } 内的语句, 直到 ( ) 内的条件不满足, 退出 While 循环往后执行.
    ( ) 内的值和 If 从句一样属于逻辑表达式.
    While 的 { } 必须有循环变量的增减, 不然会导致循环变成死循环, 下图的 _number = _number + 1 就是.
   
   维基百科While
   
在这里插入图片描述


  For循环从句

   概念:  [ ] 内有 3 个表达式分别是: 循环变量起始值,  满足的条件,  循环变量的步长.
   循环的执行次序是:
       step 1.循环变量初始值初始化 (第一个表达式).
       step 2.是否满足条件(第二个表达式), 如果满足, 则执行 { } 内的语句, 不满足则退出循环.
       step 3. 循环变量加上步长 (第三个表达式).
       step 4. 返回 step 2.

    For 循环语句还有另一种写法, 偏向 VB 的语言风格:   for “_i” from 9 to 1 step -1 do { hint str _i; };    可以发现循环变量是打上引号的. 这种写法是官方推荐的, 原理是遍历而不是比较, 能够提升效率.

   维基百科For
   在这里插入图片描述


  ForEach循环从句

   概念:   对数组内的每个元素或者哈希表内的每项挨个遍历执行固定语句.
   在 forEach 遍历数组时, 特殊变量 _x 存储数组的元素, 特殊变量 _forEachIndex 存储元素的数组下标.
   在forEach 遍历哈希表时, 特殊变量 _x 存储哈希表的关键字 Key, _y 特殊变量用于存储哈希表关键字所对应的值 Value, _forEachIndex 特殊变量存储元素的下标.
   
   forEach 可有返回值, 类似于上文If 条件句的用法, 但是需要 exitWith.
   
   维基百科ForEach
   在这里插入图片描述


  WaitUntil等待暂停从句

   概念: 暂停执行脚本, 直到 { } 内的条件被满足才继续执行下面的程序.
   只能在允许暂停的环境下使用, 比如execVM spawn 等.
   在程序运行时, 会循环调用 { } 内的语句直到条件满足为止.
   在 { } 可以有执行句, 即非条件句. 但一定要含有条件句, 条件句放在最后并且结尾不需要 ;
   
   维基百科WaitUntil
   
在这里插入图片描述


SQF脚本初级知识点>>

  ExecVM调用SQF脚本

   作用:  编译并且将脚本添加到调度程序当中
   虽然在编写脚本时提倡分文件, 但是大量的使用 ExecVM 会导致资源占用, 一般体现在游戏在调用时卡顿 (毕竟要编译). 所以一些简单的功能可以使用函数封装 (函数是指功能块代码并非数学函数, 下文会提及).
   
   维基百科ExecVM
   
在这里插入图片描述


  Count计数

   作用:  返回数组元素的数量. 返回匹配的元素数量. 配置条目中的个数. ANSI字符串的字符数.
   返回值是 Number 类型. 接收类型可以为 Array HashMap Config String.
   条件计数, 返回满足条件的元素个数.
   
   维基百科Count
   
在这里插入图片描述


  FindIf查找真元素

   作用:  返回数组元素的数量. 返回匹配的元素数量. 配置条目中的个数. ANSI字符串的字符数.
   返回值是 Number 类型. 接收类型可以为 Array HashMap Config String.
   条件计数, 返回满足条件的元素个数.
   
   维基百科FindIf
   
在这里插入图片描述


  Apply操作元素

   作用:  对数组或者哈希表的每个元素执行指定的代码操作, 并且将结果收集到一个数组里.
   对于数组来有特殊变量 _x 表示元素值. 对于哈希表来说有特殊变量 _x 表示元素的 Key 值和 _y 表示元素的值.
   
   维基百科Apply
   
在这里插入图片描述


  Random随机数

   作用:  在指定范围内生成随机数字, 设计随机生成的对象, 掉落物等的基础.
   有直接通过 Random 直接生成随机数的, 也有通过 Random 随机种子生成随机数.
   生成数的类型是Number.
   
   维基百科Random
   
在这里插入图片描述


  • 8
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值