UEFN Verse_01
UEFN Verse 程序篇1
虽然 UEFN 官网文档说用的是 C++ 编程,不过我觉得有时候好像更像 Python,有时候更像C#。
也可以说是糅杂了很多不同编程语言的习惯,比如同一种命令可以有不同的编程语言的写法,这点还是蛮包容的。
一、写在前面
部分快捷键
- 向 上/下 移动本行代码:
Alt + ↑/↓ - 同行往下多光标:
Ctrl + Alt + ↓ - 向下复制本行代码:
Shift + Alt + ↓
跟Roblox Studio的引擎区别
编写代码时,如果需要选取提示的第一个,按Tab,我总是习惯按 Enter然后就换行了😣
语法规范
- 命名要用驼峰命名法
- 跟 Python 一样需要注意缩进
二、基本语法
2.1、声明头文件
1 | # 默认模板头文件 |
2.2、数据类型、常量变量
基本数据类型
数据类型 logic 布尔型,ture or false int 整型,即整数 float 浮点型,即小数 string 字符串 enum 枚举 容器数据类型
Array:数组
- 用
[]表示 - 一个数组的所有元素只能是同一类型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16# 定义一维数组
var array1 : []int = array{1,2,3,6,8}
# 获取一维数组长度
array1.Length
# 定义多维数组
var temp : int = 0
array2 : [][]int =
for (Row := 0..4):
for(Column := 0..5):
set temp += 1
# 遍历多维数组
if (columnLen : int = array2[0].Length):
for(Row:=0..array2.Length-1, Column:=0..columnLen):
if (Element := array2[Row][Column]):
Print("[{Row}][{Column}]:{Element}")- 用
Tuple:元组
- 用
()表示 - 一个元组内的元素可以包含多种数据类型
1
2
3
4
5
6# 定义,初始化值的时候可以把类型写上
tuple1 : tuple(int,int,int) = (1,2,3)
tuple2 : tuple(int, string, tuple(int, float)) = (1,"BlindArbiter",(2,4.0))
# 当然也可以不写,编译器会自行推断类型
tuple1 := (1,2,3)
tuple2 := (1,"BlindArbiter",(2,4.0))- 用
Map:映射,其实可以看作是数据类型被固定死的 Python 字典 和 Roblox 表
1
2
3
4
5
6
7# 定义
var dict1 : [string]int = map{"id" => 1001, "coin" => 100}
# 增加或修改键值对,通过set修改键值对的值,如果该键值对不存在为增加,存在为修改
if(set dict1["coin"] = 500):
Print("修改键值对")
if(set dict1["health"] = 100):
Prinr("新增键值对")option:可以包含一个值,或者为空(不常用)
内置数据类型
message:消息类是一串可本地化的字符串,需要加上
<localizes>用来本地化玩家所选语言。1
2# 定义 message
MessageText<localizes>(str:string) : message = "Hello,World!"
2.3、类
2.4、条件语句
在 UEFN 里,可以跟 Python 一样写法
1 | if (条件1): |
如果后面的执行代码只有一行的话可以像C的写法
1 | if (条件) { 结果 } |
还有另一种写法,在多条件时,会比较直观
1 | if: |
2.5、循环语句
持续迭代循环
1
2
3loop:
if (条件):
break计数迭代循环
1
2
3
4
5
6
7
8for (变量名 : 类型 = 迭代第一个数字..迭代最后数字):
...
# 前面没有声明过变量x
for (x : int = 1..5):
...
# 前面声明过变量x
for (x := 1..5):
...
2.6、函数
| 函数返回类型 | |
|---|---|
| void | 无返回值 |
| logic | 返回布尔型,true or false |
| int | 整型 |
| float | 浮点型 |
| string | 字符串 |
1 | # 基本格式:函数名(参数:参数类型)<说明符> : 函数返回值类型 = {} |
1 | 常量 : 变量类型 = 函数方法名() |
2.7、等待、异步和时间相关
1 | # Sleep(秒) == Roblox-> task.wait(秒) |
1 | spawn{ 函数() } |
1 | GetSimulationElapsedTime() |
三、对象
1 | # @editable 表示在 UEFN 中公开变量,即需要在脚本属性处给此变量赋值 |
UObjects
不能用 new 和 delete 运算符。 所有的 UObjects 都由虚幻引擎管理内存和垃圾回收。如果通过 new 或者 delete 手动管理内存,可能会导致内存出错。
四、说明符 Specifier
4.1、访问说明符
一般在定义模块和类的时候声明
| 访问说明符 | |
|---|---|
<public> |
公开,访问不受限 |
<internal>(默认) |
内部,仅限当前模块 |
<protected> |
保护,仅限当前类和子类 |
<private> |
私密,仅限当前类 |
4.2、效果说明符
一般写在函数后面,指示函数行为
| 常用说明符 | 作用 |
|---|---|
<override> |
覆盖/重写 原有类或函数, |
<suspend> |
标记函数存在等待或支持暂停操作 |
五、内置类
agent
在很多封装的函数参数里看到,但是没有具体的文档说明这个,UEFN 对它的定义只有短短的一条:
1 | agent<native><public> := class<unique><epic_internal>: |
研究了很多事件和函数,我目前的理解是,agent是一个代理,它代表了玩家的状态或者说触发事件的行为。
六、常用模块
官方内置模块API:Verse API Reference
6.1、Random 模块
头文件:using { /Verse.org/Random }
1 | using{ /Verse.osg/Random } |
6.2、SpecialMath 模块
头文件:/UnrealEngine.com/Temporary/SpatialMath
结构体和类
- rotation
- vector2:二维向量
- vector3:三维向量
1 | using{ /UnrealEngine.com/Temporary/SpatialMath } |