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
   

学好SQF, 快活Arma3相关推荐

  1. 【Arma3脚本教程】一、基本介绍

    目录 基本介绍 1.前言 2.编辑环境 3.第一行代码 4.地图文件夹 5.基本语法解释 6.记笔记 基本介绍 1.前言 想必看到此文章的人想要学习Arma3的地图编辑,不过国内很少有人研究这个,即使 ...

  2. 除了java还学什么_学好Java编程除了努力还需要具备什么?

    Java编程语言的热流席卷了全球,它的出现摆脱了C语言尾大不掉的困境,灵活.多变,塑造性强的特点不仅符合当下互联网的发展趋势,也得到一批批青年俊才的青睐,Java编程抛出的橄榄枝,也吸引了大量计算机专 ...

  3. python社会学科需要学些什么_学好Python能做什么

    近年来,选择学Python的人也在逐年增多.然而,很多人学Python只是盲目的跟随潮流,对于Python却不了解,学好Python能做什么?今天源码时代小编就来给大家介绍一下Python的就业方向. ...

  4. m_Orchestrate learning system---七、如何快速学好前端

    m_Orchestrate learning system---七.如何快速学好前端 一.总结 一句话总结:看视频啊,系统看视频啊 1.如何解决单词数字太长超出边界的问题? word-wrap 把编辑 ...

  5. 语言都是相通的,学好一门语言,再学第二门语言就很简单,记录一下我复习c语言的过程。...

    语言都是相通的,学好一门语言,再学第二门语言就很简单,记录一下我复习c语言的过程. 为了将本人的python培训提高一个层次,本人最近买了很多算法的书. 这个书上的代码基本都是c语言实现的,c语言很久 ...

  6. 学好web前端开发要注意哪些问题

    web前端学起来是比较困难的,当然想要学好web前端技术,那么有一些注意事项一定是要看的,下面小编就为大家详细的介绍一下学好web前端开发要注意哪些问题? ​ 学好web前端开发要注意哪些问题? 基础 ...

  7. 什么人适合学习web前端?怎样学好web前端开发?

    web前端在IT互联网行业的发展前景是非常可观的,越来越多的人都在学习web前端技术,那么什么人适合学习web前端?怎样学好web前端开发?相信大家都想了解这些问题,我们来看看下面的详细介绍. 什么人 ...

  8. 零基础能学好UI设计吗

    UI设计在最近几年的发展前景是有目共睹的,越来越多的企业注重用户体验,而UI设计在这一方面是起着非常重要位置的,如今很多人都想要学习UI设计,那么零基础能学好UI设计吗?我们来看看下面的详细介绍. 零 ...

  9. 零基础可以学好UI设计吗

    随着UI设计行业的不断扩大发展,很多人都想要学习UI设计技术,但有很多同学都是零基础,想知道零基础可以学好UI设计吗?我们来看看下面的详细介绍就知道了. 零基础可以学好UI设计吗? 如果零基础自己学习 ...

最新文章

  1. 批量 杀掉 mysql 连接_批量杀死MySQL连接的四种方法详解
  2. 基于聚类的“图像分割”
  3. 欢迎来到OpenGL的世界
  4. [Azure][PowerShell][ASM][12]ACL
  5. c++ 删除文件_win7 系统电脑C盘哪些文件可以删除掉?
  6. SpringBoot使用@Transactional
  7. Java学习手册:JDBC中getString()方法与getObject()方法有什么区别?
  8. Report Machine 在WIN7系统下 IE里面运行错误
  9. 光谱预处理最简单实现方法--基于OpenSA光谱分析库
  10. 【转载】第三方支付业务如何测试
  11. 使用Eclipse把java文件打包成jar
  12. windwos服务器网站504,打开网站出现504 gateway time-out的原因及解决方法
  13. censo7安装mysql_centos7 安装MySQL
  14. html中加hover啥意思,css中hover是什么意思
  15. R语言对数线性模型loglm函数_用R语言进行数据分析:常规和广义线性模型
  16. pt-table-checksum使用总结
  17. 计算机用户名如何修改,如何修改电脑用户名
  18. Object Detection : One-stage Detector YOLO
  19. Eviews7.2模型建模与预测时间序列分析(ARIMA 模型的建立与预测)
  20. 长沙理工计算机竞赛黑马,2018年五大学科成绩出炉,长沙杀出一匹黑马!

热门文章

  1. 系统指标积累 TBD
  2. 音乐计算机生日快乐歌曲,生日快乐
  3. MapReduce编程框架
  4. 微软GitHub旗帜鲜明抵制996!
  5. 【游戏逆向】FPS游戏自瞄追踪及原理算法
  6. 程序员不能不懂数据存储
  7. 接棒“雪花”登陆纽交所,游戏引擎商Unity能否续获资本芳心?
  8. 云手机虚拟手机服务器在哪里,云端虚拟手机服务器
  9. c语言createthread函数,C++中CreateThread函数创建线程的用法和实例
  10. 弘辽科技:淘宝必做活动有哪些?具体活动介绍