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

生成菜单

如何扩展和使用沙盒生成菜单。

生成菜单是沙盒游戏模式内置的一个菜单,可以轻松快速地生成道具实体武器工具等内容。 按住默认快捷键 Q 即可打开并保持显示。

此菜单(以及整个游戏模式)完全通过脚本制作,这意味着你可以使用 Lua 和 HTML/JS/CSS 对其进行完全自定义。

它包含几个预定义的标签页(道具、实体、武器等),但你也可以通过 Lua 添加更多标签页。 每个标签页都包含一个或多个类别来组织物品。 与标签页一样,类别也可以通过 Lua 轻松扩展。

提示

本页提及的大多数方法已在 Sandbox GitHub 仓库中的 SpawnMenu.lua 文件中开源(在 GitHub 上查看:服务器客户端)。

物品

物品是生成菜单中的条目,点击后可生成对应的物品或对象。 它们必须同时在客户端和服务端进行定义,以便在生成菜单中显示并正确生成。

自动添加物品

大多数标签页都提供了自动将物品添加到生成菜单的方法。 为此,你需要创建继承自基础类的新类,并向自定义类中添加一些特定属性。

生成菜单会遍历所有已注册的继承类,并将其自动添加到菜单中(请参阅标签页部分,了解哪些类会被自动添加到生成菜单中)。

在继承时,你只需为你的类添加以下属性,即可使其在生成菜单中正常显示:nameimagecategory

Client/Index.lua
-- 继承自 Weapon 并定义将被生成菜单读取的自定义值
Weapon.Inherit("AwesomeGun", {
name = "超强的枪",
image = "assets://nanos-world/Thumbnails/SK_FlareGun.jpg",
category = "special"
})

这样,你的 AwesomeGun 就会以指定的图片显示在 weapons 标签页下的 special 类别中! 在服务器端,你不需要定义任何自定义属性即可生效 😉。

提示

你可以查看 default-weaponsdefault-vehiclests-fireworks-tools 作为示例!

手动添加物品

某些类(如 Weapons、Character 和 Tools)只要被继承,就会自动显示在生成菜单中。 但你也可以使用以下导出的 API 方法来手动添加物品:

信息

你必须同时在客户端和服务端调用 SpawnMenu.AddItem。 两端各有其不同的参数。

客户端

在客户端,我们定义物品在生成菜单中的显示方式,包括其名称标签、标签页、类别和图片。

-- 向生成菜单添加新物品
---@param tab_id string 显示该物品的标签页
---@param id string 用于标识该物品的唯一 ID
---@param name string 显示名称
---@param image string 图片路径
---@param category_id? string 该物品所属的类别
function Sandbox.SpawnMenu.AddItem(tab_id, id, name, image, category_id?)

示例:

your-package/Client/Index.lua
-- 向生成菜单添加“超棒的工具”的示例(客户端)
Sandbox.SpawnMenu.AddItem(
"tools", -- 标签页 ID
"IncredibleTool", -- 物品的唯一 ID
"超棒的工具", -- 名称/标签
"assets://nanos-world/Thumbnails/SK_Blaster.jpg", -- 图片路径
nil -- 无类别,将显示在“uncategorized”中
)

服务器端

在服务端,我们可以定义物品的生成方式,在这里我们可以为该物品创建“生成函数”。

-- 向生成菜单添加新物品
---@param tab string 该物品所在的标签页
---@param id string 用于标识该物品的唯一 ID
---@param spawn_function function 生成函数
function Sandbox.SpawnMenu.AddItem(tab, id, spawn_function)

示例:

your-package/Server/Index.lua
-- 生成实体的函数
-- 参数 location, rotation, tab 和 id 将由生成菜单自动传递
function SpawnMyIncredibleEntity(location, rotation, tab, id)
local my_stuff = MyEntity(location, rotation)

-- 配置属性……
-- my_stuff:SetSomething(...)

-- 我们必须从此函数返回生成的物品
return my_stuff
end

Package.Subscribe("Load", function()
-- 将此项添加到生成菜单(服务端)
Sandbox.SpawnMenu.AddItem(
"tools", -- 标签页 ID
"IncredibleEntity", -- 物品 ID
SpawnMyIncredibleEntity -- 用于生成并返回物品的函数
)
end)

标签页

生成菜单默认包含以下标签页:propsentitiesweaponsvehiclestoolsnpcs

props

默认情况下,已加载资产包中定义的所有 StaticMeshes 都会自动显示在此标签页中,其缩略图(如果存在)将从资产包根目录下的 Thumbnails/ 文件夹中加载。

entities

继承自 Prop 的所有类默认都会显示在实体标签页中。

备注

我们通常使用 Prop 作为默认类,因为它是实体的常见基础类,但你可以创建继承自任何类的实体,并按照手动添加物品一节的说明将其手动添加到生成菜单中。

weapons

继承自 WeaponGrenadeMelee 的所有类默认都会显示在武器标签页中。

vehicles

继承自 VehicleWheeledVehicleWater 的所有类默认都会显示在载具标签页中。

tools

继承自 ToolGun 的所有类默认都会显示在工具标签页中。 请参阅自定义工具以了解如何创建你自己的工具枪并使其显示在此标签页中。

npcs

继承自 CharacterCharacterSimple 的所有类默认都会显示在角色标签页中。

添加新标签页

你可以向生成菜单添加自定义标签页,只需在你的包中调用以下客户端方法:

---@param id string 用于标识该标签页的唯一 ID
---@param label string 显示文本
---@param image string 标签页的图片路径
function Sandbox.SpawnMenu.AddTab(id, label, image)

示例:

your-package/Client/Index.lua
Package.Subscribe("Load", function()
-- 添加一个新标签页
Sandbox.SpawnMenu.AddTab(
"consumables",
"consumables",
"package://your-package/food.png"
)
end)

类别

每个标签页都有自己的类别。 默认情况下,它们包含以下类别:

  • 标签页 propsbasicappliancesconstructionfurniturefunnytoolsfoodstreetnature
  • 标签页 entitiesdevicesdisplayobjectslogic
  • 标签页 weaponsriflessmgspistolsshotgunssniper-riflesspecialvintagegrenadesmelee
  • 标签页 vehicleswheeledwater
  • 标签页 toolstool-gunsspawners
  • 标签页 npcsnpcs

如果添加物品时没有指定类别(或类别为 nil),它将显示在 uncategorized 下方。

添加新类别

你可以向生成菜单标签页添加自定义类别,只需在你的包中调用以下客户端方法:

---@param tab_id string 标签页 ID
---@param id string 用于标识该类别的唯一 ID
---@param label string 显示文本
---@param image string 类别的图片路径
function Sandbox.SpawnMenu.AddCategory(tab_id, id, label, image)

示例:

your-package/Client/Index.lua
Package.Subscribe("Load", function()
-- 向 Props 标签页添加一个新类别
Sandbox.SpawnMenu.AddCategory(
"props",
"low-poly",
"low poly",
"package://your-package/low-poly.png"
)

-- 向 Weapons 标签页添加一个新类别
Sandbox.SpawnMenu.AddCategory(
"weapons",
"world-war",
"world war",
"package://your-package/ww.png"
)
end)

打开/关闭

-- 打开生成菜单
function Sandbox.SpawnMenu.Open()

-- 关闭生成菜单
function Sandbox.SpawnMenu.Close()