饥荒Mod 开发(十三):木牌传送 无限传送

本文档介绍了如何在饥荒Mod中开发木牌传送功能,包括创建木牌、实现鼠标悬浮显示“传送”提示、制作传送面板以及添加实际的传送功能。详细阐述了从自定义Action到组件添加的实现过程,最终实现不消耗饥饿值的瞬间移动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

饥荒Mod 开发(十二):一键制作
饥荒Mod 开发(十四):制作屏幕弹窗

一键传送源码
饥荒的地图很大,跑地图太耗费时间和饥饿值,如果大部分时间都在跑图真的是很无聊,所以需要有一个能够传送的功能,不仅可以快速到达还能节省饥饿值。
饥荒二本之后可以制作出木牌,我们可以在地图各个位置创建木牌,右键点击木牌就可以传送到其他的木牌

1 功能演示

1.1 创建木牌

需要先升级到一本,制作一个科学机器,这样就可以制作木牌了。
在这里插入图片描述

1.2 右键传送

将鼠标放到木牌上, 会显示 “传送”, 右键单击会显示一个传送面板
在这里插入图片描述

1.3 传送面板

这个面板会列出所有的木牌,可以修改木牌的名字, 也可以直接点击 “传送” 就可以不消耗饥饿值 瞬间移动到了目的地
在这里插入图片描述
接下来介绍如何实现 传送功能

2 实现鼠标悬浮显示 “传送”

要和饥荒中的物品“交互”,可以自定义一个Action,这样鼠标右键悬浮的时候会显示一个自定义的“操作提示”,右键单击的时候可以执行指定的操作。那如何自定义一个action?

2.1 创建action

在Mod 根目录下创建一个 travel.lua文件,这个文件用来定义action在这里插入图片描述

-- 创建一个新的动作(Action),这个动作可以通过右键触发,优先级为10
local TRAVEL = GLOBAL.Action({
   }, 10, false, true)
TRAVEL.id = "TRAVEL"  -- 设置动作的ID为"TRAVEL"
TRAVEL.str = "传送"  -- 设置动作的字符串表示为"传送"
TRAVEL.fn = function(act)  -- 设置动作的函数,这个函数定义了动作的行为
    local tar = act.target  -- 目标实体
    local traveller = act.doer  -- 执行动作的实体
    --traveller说一句话
    traveller.components.talker:Say("传送中...")
 	return true  -- 先全部返回true看看效果 动作成功
end

-- 将新的动作添加到游戏中
AddAction(TRAVEL)
-- 为"wilson"状态图添加新的动作处理器,当执行"TRAVEL"动作时,使用"give"动画
AddStategraphActionHandler("wilson", GLOBAL.ActionHandler(TRAVEL, "give"))

创建完这个action之后,我们把鼠标移动到物品上时,却没有任何的变化,我们还需要让具体的物品支持这个动作。

2.2 仅让木牌显示“传送”,自定义 “Travelable”组件

传送功能只能发生在木牌上,所以我们需要给“木牌”增加一个组件,让鼠标悬浮在木牌上的时候显示一个自定义的提示“传送”。在 scripts/components 目录下新建 travelable.lua
在这里插入图片描述

-- 定义 Travelable 类
local Travelable = Class(function(self, inst)
    -- 初始化实例
    self.inst = inst
    -- 设置名称
    self.name = "木牌"
end)

-- 定义收集场景动作的方法
function Travelable:CollectSceneActions(doer, actions, right)
    -- 如果是右键操作,则添加 TRAVEL 动作
    if right then
        table.insert(actions, ACTIONS.TRAVEL)
    end
end

-- 定义保存状态的方法
function Travelable:OnSave()
    -- 创建一个表来存储数据
    local data = {
   }
    -- 保存名称
    data.name = self.name
    -- 返回保存的数据
    return data
end   

-- 定义加载状态的方法
function Travelable:OnLoad(data)
    -- 如果有数据,则加载名称
    if data then
        self.name = data.name
    end
end

-- 定义执行旅行的方法
function Travelable:DoTravel(traveller)
    -- 如果没有旅行者,则返回
    if not traveller then
        return
    end
    -- 如果旅行者已经死亡,则返回
    if traveller.components.health and traveller.components.health:IsDead() then
        return
    end
    -- 获取当前实例的世界位置
    local x, y, z = self.inst.Transform:GetWorldPosition()
    -- 设置旅行者的位置
    traveller.Transform:SetPosition(x-1, y, z)
end

-- 返回 Travelable 类
return Travelable

2.3 木牌添加 自定义组件 “Travelable”

在modmain.lua 文件中导入 travel.lua,然后拦截 木牌的 构造,添加自定义组件,这样将鼠标移动到木牌上就会显示传送按钮了。

modimport("travel.lua")

AddPrefabPostInit("homesign", function(inst)
    inst:AddComponent("travelable")
end)

2.4 进入游戏测试是否显示 “传送”

打开调试控制台, 输入c_spawn(“homesign”)可以创建一个木牌,将鼠标悬浮到木牌上将会出现 “传送” 提示
在这里插入图片描述
右键点击之后会显示“传送中”
在这里插入图片描述

3 制作传送面板

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值