Skip to content

Lua环境

概述

蛋仔游戏逻辑运行在安全沙盒(SandBox)中,限制了部分Lua功能以确保安全性和多人游戏状态一致性。

主要变更

1. 库的变更

移除的库

  • io
  • os
  • package
  • debug

重新实现的库

  • math (详见下文)

支持的全局变量/函数

  • _VERSION
  • error
  • assert
  • ipairs
  • pairs
  • next
  • pcall
  • tostring
  • type
  • xpcall
  • select
  • require(仅限加载script目录下的其他lua模块)
  • setmetatable(不可使用__mode和__gc域)
  • getmetatable(但是仅可获取table的metatable)
  • traceback(等价于debug.traceback)
  • print

2. 语法变更

  • 不支持字符串和数字类型间的隐式转换
  • 表的键只能是数字或字符串
  • 使用dict()创建支持其他类型键的字典
lua
local map = dict()
local key = {}
map:set(key, 1234)
assert(map:get(key) == 1234)

for _, kv in ipairs(map:keyvalues()) do
   print("K: " .. tostring(kv[1]) .. "V: " .. tostring(kv[2]))
end

-- 使用keys()和values()方法获取键和值列表

开发者模式

在PC编辑器内试玩时可开启开发者模式,解除部分限制:

lua
local success = LuaAPI.enable_developer_mode()

开发者模式特性

  • 内置LuaSocket库
  • 解除表键类型限制
  • 允许使用io和debug库

特别注意,开发者模式只能在PC编辑器内试玩时开启!在手机版蛋仔编辑器,以及发布后的地图内都是无效的。您开发的游戏逻辑不能依赖这个模式中的功能!

math库

蛋仔的math库与标准Lua有显著差异,主要支持整数(integer)和定点数(Fixed)。

数值范围

  • 定点数: -2147483647.0 ~ 2147483647.0
  • 注意: 整数转定点数可能溢出

常量

名称
math.pi圆周率
math.e自然对数常数

主要函数

函数功能注意事项
math.tointeger(var)转换为整数向下取整
math.toFixed(var)转换为定点数
math.sin/cos/tan(x)三角函数输入为弧度
math.asin/acos/atan(v)反三角函数返回弧度
math.log/log2/log10(x)对数函数
math.exp/exp2(x)指数函数
math.round/ceil/floor/trunc(x)取整函数
math.clamp(x, min, max)值限制在指定范围

类型math.Vector3

这个类型用于表示游戏中的三维定点数向量,下表中假设vec是一个已经存在的math.Vector3实例:

函数/属性签名参数返回值功能
math.Vector3(x : Fixed, y : Fixed, z : Fixed) : math.Vector3x/y/z: 坐标向量实例构造一个向量实例
vec.x属性,无需调用获取到的分量获取向量的x分量
vec.y属性,无需调用获取到的分量获取向量的y分量
vec.z属性,无需调用获取到的分量获取向量的z分量
vec:yaw属性,无需调用,只读yaw值获取向量朝向的yaw值
vec:pitch属性,无需调用,只读pitch值获取向量朝向的pitch值
vec:length() : Fixed向量长度(定点数)计算向量的长度
vec:dot(other_vec : math.Vector3) : Fixed另一个向量向量点积(定点数)计算两个向量的点积
vec:cross(other_vec : math.Vector3) : math.Vector3另一个向量向量叉积(向量)计算两个向量的叉积
vec:normalize() : Fixed单位化前的向量长度(定点数)将向量单位化
+-*/常规的加减乘除

类型math.Quaternion

这个类型为四元数,用于表示游戏中的旋转,下表中假设rot是一个已经存在的math.Quaternion实例:

函数/属性签名参数返回值功能
math.Quaternion(pitch, yaw, roll) : math.Quaternionpitch/yaw/roll: 欧拉角四元数实例使用欧拉角构造一个四元数实例
rot:inverse()求逆
rot:slerp(other_rot : math.Quaternion, t : Fixed) : math.Quaternionother_rot: 另一个四元数;t: 插值参数插值后的旋转值球面插值
rot.x属性,无需调用获取到的分量获取四元数的x分量
rot.y属性,无需调用获取到的分量获取四元数的y分量
rot.z属性,无需调用获取到的分量获取四元数的z分量
rot.w属性,无需调用获取到的分量获取四元数的w分量
rot.yaw属性,无需调用,只读yaw值获取四元数的yaw值
rot.pitch属性,无需调用,只读pitch值获取四元数的pitch值
rot.roll属性,无需调用,只读roll值获取四元数的roll值
+-*常规的加减乘

注意: Lua中欧拉角的旋转顺序为:pitch->yaw->roll(即XYZ顺序),这可能与其他工具的约定不一致。