在饥荒联机版中,所有可以与我们交互的物品,都被称为实体。要创建一个实体,需要进行以下内容:
一、创建实体
1.1 总结构
我们创建实体主要需要用到两个资源:一是贴图动画资源,存放在assets表中;而是实体初始化函数,存放在fn()函数中。定义好上面两项内容后,我们便可以使用官方提供的Prefab方法完成实体的创建,具体模版如下:
-- assets表
local assets =
{
Asset("ANIM", "anim/sakura_pinkcard.zip"), -- 动画资源
Asset("ATLAS", "images/sakura_pinkcard.xml"), -- 图片索引
Asset("IMAGE", "images/sakura_pinkcard.tex"), -- 图片资源
}
-- 实体函数fn
local function fn()
local inst = CreateEntity() -- 创建实体
inst.entity:AddTransform() -- 交互
inst.entity:AddAnimState() -- 动画
inst.entity:AddSoundEmitter() -- 声音
inst.entity:AddNetwork() -- 网络
MakeInventoryPhysics(inst) -- 添加物理属性,让他可以被捡起来
inst.AnimState:SetBank("sakura_pinkcard") -- 设置动画资源
inst.AnimState:SetBuild("sakura_pinkcard")
inst.AnimState:PlayAnimation("sakura_pinkcard")
MakeInventoryFloatable(inst, "med", 0.05, {1.1, 0.5, 1.1}, true, -9)-- 使实体可以漂浮在库存中,并设置相关参数
inst:AddTag("sakura_pinkcard") -- 添加标签,所有标签都是为了在其他代码逻辑中使用时方便,可选择添加
-- 以下代码只在主机运行
if not TheWorld.ismastersim then
return inst
end
-- 一个最基础的实体,可以不在这部分添加任何东西,但相应地,这个实体就无法完成任何功能
-- 如果想让这个实体完成一些功能,就需要为其添加一些组件,并添加某个事件发生时他需要执行的任务
-- 例如:
inst:AddComponent("inventoryitem") -- 添加库存物品组件,使他能够被放进物品栏
inst.components.inventoryitem.atlasname = "images/sakura_pinkcard.xml" -- 设置其在物品栏中显示的图片,大小应为64*64,提前设置好,系统不会自动调整大小
inst:AddComponent("inspectable") -- 添加可检查组件
inst:AddComponent("stackable") -- 添加堆叠组件
return inst -- 返回实体
end
-- 创建这个实体,其中第一个参数为实体代码,也就是我们可以“T键生成”的代码;
-- 第二个参数为实体的函数;
-- 第三个参数为实体的动画贴图资源
-- 如果在创建这个实体的时候使用到了其他的实体,比如我新建了一个“草丛”实体,
-- 在他的fn中我写了被采摘时获得一个草“grass”,那么我就需要再声明“grass”这个实体,
-- 第四个参数即为声明引用的实体的位置,他是一个表,如下:
local prefabs =
{
"grass"
}
-- 如果没有引用到其他实体,则不需要再写第四个参数
return Prefab("sakura_pinkcard", fn, assets,prefabs)
1.2 其他工作
在实体创建完成后,我们还不能在游戏中见到他,因为游戏不知道我们为他新建了一个实体。此时,需要在modmain中声明:
-- 这里声明的是文件名,而不是实体名
-- 声明文件名时,不需要增添后缀
PrefabFiles =
{
"sakura_pinkcard",
}
这样,一个最为基础的实体就被创建成功了。
二、创建放置器
当我们创建的实体可以被放置在地面上时,如果不添加放置器,我们便无法得知他被放置的具体位置,并且无法使用几何布局模组。
2.1 如何成为一个“建筑”
首先,我们来看一下需要进行什么操作才能让物体被部署:
inst:AddComponent("deployable") -- 添加可部署组件
inst.components.deployable:SetDeployMode(DEPLOYMODE.ANYWHERE) -- 设置部署模式,即可以被放置在什么地形
inst.components.deployable.ondeploy = ondeploy -- 设置被部署时的回调函数
inst.components.deployable:SetDeploySpacing(DEPLOYSPACING.MEDIUM) -- 设置部署间隔
建筑、可移植植物都是通过上面的组件来实现可以放置在地面的。
2.2 添加放置器
此时,它仅仅是可以被放置于地面,但没有放置器。
放置器就是我们在放置实体时,跟随鼠标移动的浅绿色实体,他能具体指示我们如果此时放置,他将会处于什么地方。
创建放置器的方法如下:
MakePlacer(name,bank,build,anim)
-- 第一个位置的参数是放置器的名字,他与实体的名字一一对应,因此不需要再告知放置器它属于哪个实体;
-- 第二个位置时他使用的动画集的名字;
-- 第三个位置是他是用的动画包的名字;
-- 第四个位置是它使用的动画的名字,也就是放置器长什么样,他与实体共用一个动画包,因此通常采用“idle”待机状态的动画。
拥有放置器的实体应将放置器与实体应一起返回:
return Prefab("sakura_pinkcard", fn, assets,prefabs),
MakePlacer(name,bank,build,anim)
此时,我们就完成了实体以及放置器的创建,可以去做建筑了!