Posted on 

UEFN Verse_01

UEFN Verse 程序篇1

虽然 UEFN 官网文档说用的是 C++ 编程,不过我觉得有时候好像更像 Python,有时候更像C#。
也可以说是糅杂了很多不同编程语言的习惯,比如同一种命令可以有不同的编程语言的写法,这点还是蛮包容的。

一、写在前面

部分快捷键

  • 向 上/下 移动本行代码:Alt + ↑/↓
  • 同行往下多光标:Ctrl + Alt + ↓
  • 向下复制本行代码:Shift + Alt + ↓

跟Roblox Studio的引擎区别

编写代码时,如果需要选取提示的第一个,按Tab,我总是习惯按 Enter然后就换行了😣

语法规范

  • 命名要用驼峰命名法
  • 跟 Python 一样需要注意缩进

二、基本语法

2.1、声明头文件

1
2
3
4
5
6
# 默认模板头文件
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
# 常用头文件
using { /Verse.org/Random }

2.2、数据类型、常量变量

  • 常量

    1
    2
    # 常量值不可更改
    常量名:常量类型 = 值
  • 变量

    • 定义变量
      1
      2
      3
      # 定义一般变量的话一般需要初始化
      var 变量名: 变量类型 = 值
      var PlayerName: string = "BlindArbiter"
    • 改变变量
      1
      2
      3
      # 总之改变变量值的话前面得加set
      set 变量名 = 新值
      set 变量名 += 增量
    • 输出变量
      1
      2
      3
      # 输出变量时
      Print(PlayerName)
      Print("Hello, {PlayerName}")
  • 基本数据类型

    数据类型
    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、类

  • 定义类

    1
    2
    # 声明 creative_device 是为了使这个脚本能被拖到世界里
    类名 := class(creative_device):

2.4、条件语句

在 UEFN 里,可以跟 Python 一样写法

1
2
3
4
5
6
if (条件1):
结果1
else if (条件2):
结果2
else:
结果3

如果后面的执行代码只有一行的话可以像C的写法

1
if (条件) { 结果 }

还有另一种写法,在多条件时,会比较直观

1
2
3
4
5
6
7
8
9
if:
条件1
条件2
条件3
...
then:
结果1
else:
结果2

2.5、循环语句

  • 持续迭代循环

    1
    2
    3
    loop:
    if (条件):
    break
  • 计数迭代循环

    1
    2
    3
    4
    5
    6
    7
    8
    for (变量名 : 类型 = 迭代第一个数字..迭代最后数字):
    ...
    # 前面没有声明过变量x
    for (x : int = 1..5):
    ...
    # 前面声明过变量x
    for (x := 1..5):
    ...

2.6、函数

函数返回类型
void 无返回值
logic 返回布尔型,true or false
int 整型
float 浮点型
string 字符串
  • 函数定义

1
2
3
4
5
6
7
8
9
10
# 基本格式:函数名(参数:参数类型)<说明符> : 函数返回值类型 = {}
# 除此之外还有几种写法
Func1() : void = {}

Func2() : void =
...
Func3(param1:int, param2:int) : int = param1 + param2

Func4(param1:int, param2:float) : float =
block: # 阻塞作用,等效于 Python 定义函数时的 pass
  • 函数调用

1
2
常量 : 变量类型 = 函数方法名()
常量 := 函数名()

2.7、等待、异步和时间相关

  • 等待

1
2
# Sleep(秒) == Roblox-> task.wait(秒)
Sleep(2)
  • 异步

1
2
3
spawn{ 函数() }
spawn:
...
  • 获取时间戳

1
GetSimulationElapsedTime()

三、对象

1
2
3
# @editable 表示在 UEFN 中公开变量,即需要在脚本属性处给此变量赋值
# creative_prop UEFN里的一个内置类
@editable var Prop: creative_prop = creative_prop{}
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是一个代理,它代表了玩家的状态或者说触发事件的行为。

六、常用模块

官方内置模块APIVerse API Reference

6.1、Random 模块

头文件using { /Verse.org/Random }

1
2
3
4
5
6
7
using{ /Verse.osg/Random }
# 返回整型随机数
GetRandomInt(最小值:int, 最大值:int):int
# 返回浮点随机数
GetRandomFloat(最小值:float, 最大值:float):float
# 打乱数组内元素原先顺序,即重新洗牌
Shuffle(Input:[]t where t:type):[]t = external {}

6.2、SpecialMath 模块

头文件/UnrealEngine.com/Temporary/SpatialMath

结构体和类

  • rotation
  • vector2:二维向量
  • vector3:三维向量
1
2
3
using{ /UnrealEngine.com/Temporary/SpatialMath }
var Vec : vector3 = vector3{}
VecPos : vector3 = vector3{X:=Vec.X, Y:=Vec.Y, Z:=Vec.Z }


Copyright © 2022 - 2023 BlindArbiter

Powered by Hexo | Theme - Stellar