饥荒Mod 开发(四):制作一个物品

饥荒Mod 开发(三):资源工具使用
饥荒Mod 开发(五):制作一个烹饪锅食物

组件

要制作一个物品首先需要了解一个概念:组件
先举个简单的例子,比如一辆汽车会有很多部件, 每个部件有特定的功能。方向盘, 轮胎,刹车,玻璃等。 我们可以把这些独立功能的部件看成是组件,当我们需要做一个汽车的时候,我们需要把这些部件组装起来。在饥荒中做一个物品也是差不多的道理, 饥荒给我们提供了很多的组件,我们把这些组件组合起来应用到一个物品上,那这个物品就有了相应的功能。

再比如饥荒中的 “猪人”, 他会说话,是因为有一个 (talker)组件。会移动是因为有一个(locomotor)组件。会吃东西是因为有一个(eater)组件, 有生命值是因为有"health"组件等等。 这些组件都是饥荒给我们提供好的,直接使用。所以制作一个物品是非常简单的事情。

准备工作

要制作一个物品必须要有贴图动画

  1. 贴图, 当物品放在背包,物品栏,或者在制作栏出现的时候需要显示一个图片,这里显示的图片就是贴图。上一篇有介绍如果打包贴图。
  2. 动画。 当物品放在地上,或者装备在手上的时候是需要显示动画, 动画并不一定 非得“动“, 也可以是不动。

无论是动画还是贴图,最简单的情况下一张PNG(64*64 32位) 图片就可以搞定。 贴图直接放到相应目录然后执行工具命令就可以。 动画需要使用工具制作,当然如果是最简单的动画那是非常简单,只显示一个图片就行。 资源打包教程

1.创建一个Mod

一个最简单的Mod 只需要4个文件就可以,按照这个教程Mod 介绍我们可以先新建一个Mod需要的最基本文件

1.1 modinfo.lua

name = "饥荒Mod测试"
description = "制作第一个物品"
author = "小乖"
version = "1.0.4"

forumthread = "https://blog.csdn.net/wanliaixie/article/details/134606366?spm=1001.2014.3001.5502"

api_version = 6

icon_atlas = "modicon.xml"
icon = "modicon.tex"

dont_starve_compatible = true
reign_of_giants_compatible = true
shipwrecked_compatible = true
hamlet_compatible = true

1.2 modmain.lua

--这个Mod 只会打印一句话
print("加载mod")

1.3 Mod 图标

Mod 图标需要使用工具生成,我们先准备一张PNG(64 *64 32位图片)的图片,将图片的名称改成 modicon.png,在Mod 目录下新建一个images目录, 把这个图片需要放到images 目录下。
饥荒Mod 开发(四):制作一个物品_第1张图片
然后执行 工具就可以自动生成 贴图文件了。

 & 'h:\Don''t Starve Mod Tools\ds_mod_tools\build\win32\mod_tools\autocompiler.exe' "D:\WeGameApps\rail_apps\饥荒:单机版(2000013)\mods\pigpetfood"

执行目命令
最终会生成两个贴图文件,将这两个贴图文件拷贝到外部就可以了饥荒Mod 开发(四):制作一个物品_第2张图片

1.4 最终Mod 目录结构

饥荒Mod 开发(四):制作一个物品_第3张图片

1.5 进入游戏验证Mod 是否正常加载

饥荒Mod 开发(四):制作一个物品_第4张图片

2. 创建物品

物品可以放到背包中,可以拿在手上,也可以放在地上,所以不同的场景下是需要不同的样子。 拿在手上或者放在地上需要设置动画, 放在物品栏或者制作栏是需要贴图。所以需要先制作动画和贴图。动画贴图制作 。饥荒中创建一个物品有固定的模式,下面是一个比较简单的物品代码。

-- 创建一个宠物可以吃的食物
local assets=
{
    Asset("ANIM", "anim/pigpetfood.zip"), -- 加载动画资源
    Asset("ATLAS", "images/inventoryimages/pigpetfood.xml"), -- 加载图像资源
}

local function fn(Sim)
    local inst = CreateEntity() -- 创建一个新的实体
    inst.entity:AddTransform() -- 添加变换组件
    inst.entity:AddAnimState() -- 添加动画状态组件
    
    MakeInventoryPhysics(inst) -- 为实体添加物理属性
    inst:AddComponent("edible") -- 添加可食用组件
    inst.components.edible.foodtype = "PigPet" -- 设置食物类型为"PigPet"
    inst.components.edible.healthvalue = 20 -- 设置食物的健康值为20
    
    inst:AddComponent("stackable") -- 添加可堆叠组件
    
    inst:AddComponent("inspectable") -- 添加可检查组件
    
    inst:AddComponent("inventoryitem") -- 添加库存物品组件

    --物品放在地上的时候播放idle 动画
    inst.AnimState:SetBank("pigpetfood") -- 设置动画库
    inst.AnimState:SetBuild("pigpetfood") -- 设置动画构建
    inst.AnimState:PlayAnimation("idle") -- 播放"idle"动画
    
    inst.components.inventoryitem.atlasname = "images/inventoryimages/pigpetfood.xml" -- 设置在物品栏的图像

    inst:AddComponent("tradable") -- 添加可交易组件
    
    return inst -- 返回创建的实体
end

return Prefab( "common/pigpetfood", fn, assets) -- 返回一个预制物品,这个预制物品使用了上面定义的函数和资产

2.1 加载资源

Asset 是一个函数,用来加载资源,两个参数,一个是资源类型,另一个是资源路径, 这里的路径是相对根目录的路径。我们定义一个 assets 变量保存加载的所有资源。

local assets=
{
    Asset("ANIM", "anim/pigpetfood.zip"), -- 加载动画资源
    Asset("ATLAS", "images/inventoryimages/pigpetfood.xml"), -- 加载图像资源,一个xml 可以大于大于1个贴图
}

2.2 定一个创建实体的函数

我们需要写一个回调函数,然后把这个回调函数注册给饥荒,当游戏中需要创建一个物品的时候,引擎会调用这个回调函数,我们在回调函数中设置各种组件,贴图,动画等等。下面是一个比较简单的回调函数

local function fn()
    local inst = CreateEntity() -- 创建一个新的实体
    inst.entity:AddTransform() -- 添加变换组件
    inst.entity:AddAnimState() -- 添加动画状态组件
    
    MakeInventoryPhysics(inst) -- 为实体添加物理属性
    inst:AddComponent("edible") -- 添加可食用组件
    inst.components.edible.foodtype = "PigPet" -- 设置食物类型为"PigPet"
    inst.components.edible.healthvalue = 20 -- 设置食物的健康值为20
    
    inst:AddComponent("stackable") -- 添加可堆叠组件
    
    inst:AddComponent("inspectable") -- 添加可检查组件
    
    inst:AddComponent("inventoryitem") -- 添加库存物品组件
    inst.components.inventoryitem.atlasname = "images/inventoryimages/pigpetfood.xml" -- 设置库存物品的图像

    inst.AnimState:SetBank("pigpetfood") -- 设置动画库
    inst.AnimState:SetBuild("pigpetfood") -- 设置动画构建
    inst.AnimState:PlayAnimation("idle") -- 播放"idle"动画
    
    return inst -- 返回创建的实体
end

edible :物品可食用。由于这个物品是专门给宠物吃的,可以设置一个食物的类型,类型名可以自定义。吃了之后可以增加20生命值,也可以增加精神,饱食度等。

	inst:AddComponent("edible") -- 添加可食用组件
    inst.components.edible.foodtype = "PigPet" -- 设置食物类型为"PigPet"
    inst.components.edible.healthvalue = 20 -- 设置食物的健康值为20

stackable:可堆叠组件。饥荒中的树枝,草 可以在一个格子中放很多个,而有的物品,比如武器,帽子,只能放一个格子中,这就是堆叠组件的作用,可以设置堆叠的个数。

    inst:AddComponent("stackable") -- 添加可堆叠组件
    inst.components.stackable.maxsize = 999

inventoryitem: 可以放入物品栏中

inst:AddComponent("inventoryitem") -- 添加库存物品组件
inst.components.inventoryitem.atlasname = "images/inventoryimages/pigpetfood.xml" -- 设置库存物品的图像

设置动画:设置物品空闲时的动画,资源打包一篇中有介绍

 	inst.AnimState:SetBank("pigpetfood") -- 设置动画库
    inst.AnimState:SetBuild("pigpetfood") -- 设置动画构建, 一般是scml 文件的名字
    inst.AnimState:PlayAnimation("idle") -- 播放"idle"动画

组件可以有自己的方法和属性,我们可以从组件的代码中找到,组件的名字就是源码的文件名,很容易找到。下面是组件的目录饥荒Mod 开发(四):制作一个物品_第5张图片
我们可以找到某个具体的组件,比如上面edible组件,打开源码可以看到提供了很多方法给我们调用。
饥荒Mod 开发(四):制作一个物品_第6张图片

2.3 使用上面的资源和回调函数返回一个预制物

Prefab第一个参数是一个名字,可以使用"/" 分隔开,但是实际上只有最后一段是真正的名字。 完整代码如下:
-- 创建一个宠物可以吃的食物
local assets=
{
    Asset("ANIM", "anim/pigpetfood.zip"), -- 加载动画资源
    Asset("ATLAS", "images/inventoryimages/pigpetfood.xml"), -- 加载图像资源
}

local function fn()
    local inst = CreateEntity() -- 创建一个新的实体
    inst.entity:AddTransform() -- 添加变换组件
    inst.entity:AddAnimState() -- 添加动画状态组件
    
    MakeInventoryPhysics(inst) -- 为实体添加物理属性
    inst:AddComponent("edible") -- 添加可食用组件
    inst.components.edible.foodtype = "PigPet" -- 设置食物类型为"PigPet"
    inst.components.edible.healthvalue = 20 -- 设置食物的健康值为20
    
    inst:AddComponent("stackable") -- 添加可堆叠组件
    
    inst:AddComponent("inspectable") -- 添加可检查组件
    
    inst:AddComponent("inventoryitem") -- 添加库存物品组件
    inst.components.inventoryitem.atlasname = "images/inventoryimages/pigpetfood.xml" -- 设置库存物品的图像

    inst.AnimState:SetBank("pigpetfood") -- 设置动画库
    inst.AnimState:SetBuild("pigpetfood") -- 设置动画构建
    inst.AnimState:PlayAnimation("idle") -- 播放"idle"动画
    

    inst:AddComponent("tradable") -- 添加可交易组件
    
    return inst -- 返回创建的实体
end

return Prefab( "common/pigpetfood", fn, assets) -- 返回一个预制物品,这个预制物品使用了上面定义的函数和资产

将文件放入 prefabs 目录下
饥荒Mod 开发(四):制作一个物品_第7张图片

2.4 注册物品

我们需要在modmain.lua 中注册这个物品,并且为这个物品设置一些描述,物品就做完了。

PrefabFiles = {
    "pigpetfood"
}
--GLOBAL.STRINGS.NAMES  是全局变量,直接使用,后面跟着 物品名字的大写字母。
GLOBAL.STRINGS.NAMES.PIGPETFOOD = "宠物饲料"
GLOBAL.STRINGS.CHARACTERS.GENERIC.DESCRIBE.PIGPETFOOD = "这是给宠物吃的,可以恢复生命值"

3 进入游戏验证

3.1 打开游戏控制台

键盘左上角 ESC 下面有一个按键, 左上角 数字1 左边的那个按键, 进入游戏之后按一下就可以打开。ESC 可以关闭输入框。 按 CTRL+L 可以关闭打印

3.2 输入 c_give(“pigpetfood”) 就可以获得一个物品

饥荒Mod 开发(四):制作一个物品_第8张图片
饥荒Mod 开发(四):制作一个物品_第9张图片

制作台可以制作食物

假设这个食物是给宠物吃的,可以通过树枝和草来制作,那我们就可以把这个加入到左侧的制作栏里
在modmain.lua 中设置配方

local pigpetfood
if GLOBAL.IsDLCEnabled(GLOBAL.CAPY_DLC) or GLOBAL.IsDLCEnabled(GLOBAL.PORKLAND_DLC) then
  --第二个参数{GLOBAL.Ingredient("cutgrass", 2), GLOBAL.Ingredient("twigs", 2)} 表示需要2个草 2个树枝
  --GLOBAL.RECIPETABS.SURVIVAL 生存栏显示
  --GLOBAL.TECH.NONE 不需要科技
  --最后一个参数10 ,表示可以制作10个。
    pigpetfood = GLOBAL.Recipe("pigpetfood",  {GLOBAL.Ingredient("cutgrass", 2), GLOBAL.Ingredient("twigs", 2)}, GLOBAL.RECIPETABS.SURVIVAL, GLOBAL.TECH.NONE, nil, nil, nil, nil, 10)
else
    pigpetfood = GLOBAL.Recipe("pigpetfood",   {GLOBAL.Ingredient("cutgrass", 2), GLOBAL.Ingredient("twigs", 2)}, GLOBAL.RECIPETABS.SURVIVAL, GLOBAL.TECH.NONE, nil, 10) 
end

pigpetfood.atlas = "images/inventoryimages/pigpetfood.xml"
--设置在制作栏中位置,默认放最后,这里放在最前面
pigpetfood.sortkey = 1
GLOBAL.STRINGS.RECIPE_DESC.PIGPETFOOD = "可以恢复宠物生命值20点"

饥荒Mod 开发(四):制作一个物品_第10张图片

这篇文章所有的源码都打包上传了。 本篇资源源码
饥荒Mod 开发(三):资源工具使用
饥荒Mod 开发(五):制作一个烹饪锅食物

你可能感兴趣的:(饥荒Mod,游戏,lua,饥荒Mod,饥荒)