饥荒Mod 开发(五):制作一个烹饪锅食物
饥荒Mod 开发(七):调试技巧
在前五篇文章大致介绍了一个Mod 的结构,一些基础概念已经如何创建一个简单的物品。 之前并没有说到太多的细节,主要是一开始就说细节的话太枯燥了,没有成就感,先按照文章做出一个物品来,也会很有成就感,那这里就针对之前的代码做一些细节的说明。
预制物
饥荒中的物品都是预制物的一个实例,这就好比是类和对象的关系。 预制物可以看成是一个类, 物品则是这个类实例化的各个对象。
一种类型的预制物只有一个,但是实体可以有很多个。 比如游戏中的树枝,草,猪人等, 他们各自都对应着一个预制物,但是却是不同的实体。所以我们制作物品其实是在制作预制物(定义一个类),然后由饥荒创建 预制物的实体。饥荒中有一个Prefab类,所有的预制物都是Prefab的对象。
require("class") -- 引入 "class" 模块,用于创建类
-- Prefab 类的定义
Prefab = Class( function(self, name, fn, assets, deps)
self.name = name or "" -- Prefab 的名称,如果没有提供,那么默认值为 ""
self.path = name or nil -- Prefab 的路径,如果没有提供,那么默认值为 nil
self.name = string.sub(name, string.find(name, "[^/]*$")) -- 从路径中提取 Prefab 的名称
self.desc = "" -- Prefab 的描述,初始值为 ""
self.fn = fn -- Prefab 的函数,用于创建 Prefab 的实例
self.assets = assets or {
} -- Prefab 的资源,如果没有提供,那么默认值为 {}
self.deps = deps or {
} -- Prefab 的依赖,如果没有提供,那么默认值为 {}
end)
-- Prefab 类的 __tostring 方法,用于将 Prefab 对象转换为字符串
function Prefab:__tostring()
return string.format("Prefab %s - %s", self.name, self.desc) -- 返回 "Prefab 名称 - 描述" 的格式
end
-- Asset 类的定义
Asset = Class( function(self, type, file, param)
self.type = type -- Asset 的类型
self.file = file -- Asset 的路径
self.param = param -- Asset 的参数
end)
Prefab 大部分只用到name, fn, assets 这三个参数。
- name. 全局唯一的名字,用来标识预制物的名称,不能相同。
- fn. 一个回调函数,当我们创建一个实例的时候,会调用这个回调函数,我们会在这个回调函数中创建实体,添加组件,设置AI, 状态图等等。
- assets. 需要使用的资源,实例基本都会需要资源,最简单就是一个贴图和一个动画。
fn 函数
fn 函数有固定的格式,也是创建实例的必须函数,我们可以简单分为几个步骤
- 创建实体.
- 添加 饥荒引擎底层组件,这部分组件是没有lua源码的,仅仅是有一些封装好的接口调用
- 设置动画,一般这个是设置空闲时的动画,比如 物品放在地上的时候
- 设置tag. tag 主要对实例进行分类。比如怪物类,可放入冰箱,可保鲜等等。也可以不设置,并不是必须的
- 设置状态图和AI。 对于生物,角色 会设置,一般的普通物品不需要设置
- 添加普通组件。设置组件的属性等。 这部分组件提供lua源码
- 其余杂项,比如事件的监听, 加载保存数据等等
下面是长矛的fn函数。
local function fn(Sim)
--第一步 创建实体
local inst = CreateEntity()
--第二步 添加引擎底层组件,系统引擎底层组件使用 inst.entity:AddXXXX 添加