跳至正文
版本:最新版 - a1.169.2 ⚖️

类指南

关于类你需要了解的一切

nanos world 中的所有实体都由一个类来表示。在 Lua 中,类由表表示。这意味着与实体(Player、Character、Prop 等)的所有交互都是通过遵循 OOP(面向对象程序设计模式)的类/表方法进行的。本页面将对此进行详细解释。

提示

在 nanos world 中,我们有 4 种类(或结构):Classes、Static Classes、Structs 和 Utility Classes。

类​

如果你阅读过我们的快速开始指南,你会注意到我们生成实体的格式如下:

Server/Index.lua
-- 使用其构造函数生成实体(位置、旋转和网格体)
local my_prop = Prop(Vector(0, 0, 100), Rotator(), "nanos-world::SM_Cube")

-- 通过其方法与实体进行交互
my_prop:SetLocation(Vector(100, 0, 100))
提示

对 实体 / 已生成对象 的 方法 访问是通过 : 实现的。

这就是 OOP 的工作原理!你创建对象,并在该对象上调用函数或捕获事件。与其他拥有大量全局函数和事件来与实体交互的脚本游戏不同,nanos world 脚本是对现代程序设计的一种现代实现方式。

基类​

在底层,nanos world 的类遵循继承模式,这意味着我们拥有基础父类,以及“继承”其所有函数、事件和属性的子类。例如,世界上物理存在的所有类(例如 Character 和 Prop)都是 Base Actor,因此可以在它们上面调用函数 :SetLocation()。

信息

Base Entity 是所有类的基类,包括那些不在世界中的类(例如 Player、WebUI 或 Database)。它包含每个类共享的方法(如 Subscribe、SetValue 和 Destroy),以及用于检索已生成实体的静态方法(如 GetAll、GetPairs 和 GetByIndex)。

Base Actor 是世界上存在的所有类的基类,并包含移动、旋转、附加和更改其外观的方法。

生成实体​

在 nanos world 中生成实体非常简单直接,假设我们要生成一个 Character:

Server/Index.lua
local my_character = Character(Vector(0, 0, 100), Rotator(), "nanos-world::SK_Male")
提示

每个类都将包含它自己的构造函数、属性、方法和事件。

请在侧边栏的 SCRIPTING REFERENCE → Classes 项中查看 nanos world 提供的所有类。

信息

请记住,某些类只能在服务器生成,而另一些类只能在客户端生成。

销毁实体​

除了 Player 之外,所有类都允许你使用 :Destroy() 方法来销毁它们:

Server/Index.lua
my_character:Destroy()
信息

销毁实体将触发 Destroy 事件,并且还会自动分离所有通过 :AttachTo()¹ 附加到它的实体。

¹如果你在附加实体时将 lifespan_when_detached 参数设置为了 -1 以外的值,那么所有附加的实体也将会被销毁 😉。

静态类​

nanos world 中的静态类是无法被生成的类。相反,你可以直接使用 . 来调用它的方法。

例如,如果你想与太阳/天空/天气进行交互,你将需要 Sky 静态类:

Client/Index.lua
-- 将时间设置为上午 9:25
Sky.SetTimeOfDay(9, 25)
提示

对静态类 / 静态方法的访问是通过 . 实现的。

结构体与工具类​

除了类和静态类之外,我们还有结构体和工具类!结构体是 API 中随处使用的数据类型,例如 Vector、Rotator 和 Color。工具类是带有辅助函数的库,例如 JSON 和 NanosMath。

提示

所有工具类均已在 https://github.com/nanos-world/nanos-world-lua-lib 开源。欢迎随时推送合并请求并提出修改建议!