饥荒Mod 开发(三):资源工具使用
饥荒Mod 开发(五):制作一个烹饪锅食物
要制作一个物品首先需要了解一个概念:组件。
先举个简单的例子,比如一辆汽车会有很多部件, 每个部件有特定的功能。方向盘, 轮胎,刹车,玻璃等。 我们可以把这些独立功能的部件看成是组件,当我们需要做一个汽车的时候,我们需要把这些部件组装起来。在饥荒中做一个物品也是差不多的道理, 饥荒给我们提供了很多的组件,我们把这些组件组合起来应用到一个物品上,那这个物品就有了相应的功能。
再比如饥荒中的 “猪人”, 他会说话,是因为有一个 (talker)组件。会移动是因为有一个(locomotor)组件。会吃东西是因为有一个(eater)组件, 有生命值是因为有"health"组件等等。 这些组件都是饥荒给我们提供好的,直接使用。所以制作一个物品是非常简单的事情。
要制作一个物品必须要有贴图和动画。
无论是动画还是贴图,最简单的情况下一张PNG(64*64 32位) 图片就可以搞定。 贴图直接放到相应目录然后执行工具命令就可以。 动画需要使用工具制作,当然如果是最简单的动画那是非常简单,只显示一个图片就行。 资源打包教程
一个最简单的Mod 只需要4个文件就可以,按照这个教程Mod 介绍我们可以先新建一个Mod需要的最基本文件
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
--这个Mod 只会打印一句话
print("加载mod")
Mod 图标需要使用工具生成,我们先准备一张PNG(64 *64 32位图片)的图片,将图片的名称改成 modicon.png,在Mod 目录下新建一个images目录, 把这个图片需要放到images 目录下。
然后执行 工具就可以自动生成 贴图文件了。
& 'h:\Don''t Starve Mod Tools\ds_mod_tools\build\win32\mod_tools\autocompiler.exe' "D:\WeGameApps\rail_apps\饥荒:单机版(2000013)\mods\pigpetfood"
物品可以放到背包中,可以拿在手上,也可以放在地上,所以不同的场景下是需要不同的样子。 拿在手上或者放在地上需要设置动画, 放在物品栏或者制作栏是需要贴图。所以需要先制作动画和贴图。动画贴图制作 。饥荒中创建一个物品有固定的模式,下面是一个比较简单的物品代码。
-- 创建一个宠物可以吃的食物
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) -- 返回一个预制物品,这个预制物品使用了上面定义的函数和资产
Asset 是一个函数,用来加载资源,两个参数,一个是资源类型,另一个是资源路径, 这里的路径是相对根目录的路径。我们定义一个 assets 变量保存加载的所有资源。
local assets=
{
Asset("ANIM", "anim/pigpetfood.zip"), -- 加载动画资源
Asset("ATLAS", "images/inventoryimages/pigpetfood.xml"), -- 加载图像资源,一个xml 可以大于大于1个贴图
}
我们需要写一个回调函数,然后把这个回调函数注册给饥荒,当游戏中需要创建一个物品的时候,引擎会调用这个回调函数,我们在回调函数中设置各种组件,贴图,动画等等。下面是一个比较简单的回调函数
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"动画
组件可以有自己的方法和属性,我们可以从组件的代码中找到,组件的名字就是源码的文件名,很容易找到。下面是组件的目录
我们可以找到某个具体的组件,比如上面edible组件,打开源码可以看到提供了很多方法给我们调用。
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) -- 返回一个预制物品,这个预制物品使用了上面定义的函数和资产
我们需要在modmain.lua 中注册这个物品,并且为这个物品设置一些描述,物品就做完了。
PrefabFiles = {
"pigpetfood"
}
--GLOBAL.STRINGS.NAMES 是全局变量,直接使用,后面跟着 物品名字的大写字母。
GLOBAL.STRINGS.NAMES.PIGPETFOOD = "宠物饲料"
GLOBAL.STRINGS.CHARACTERS.GENERIC.DESCRIBE.PIGPETFOOD = "这是给宠物吃的,可以恢复生命值"
键盘左上角 ESC 下面有一个按键, 左上角 数字1 左边的那个按键, 进入游戏之后按一下就可以打开。ESC 可以关闭输入框。 按 CTRL+L 可以关闭打印
假设这个食物是给宠物吃的,可以通过树枝和草来制作,那我们就可以把这个加入到左侧的制作栏里
在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 开发(三):资源工具使用
饥荒Mod 开发(五):制作一个烹饪锅食物