饥荒联机版mod制作[创建实体、创建放置器]

在饥荒联机版中,所有可以与我们交互的物品,都被称为实体。要创建一个实体,需要进行以下内容:

一、创建实体

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)

此时,我们就完成了实体以及放置器的创建,可以去做建筑了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值