跳转至

大纲

参考/整合/摘抄

Lua Cutscenes 基本介绍

由于蔚蓝是用 C# 编程语言编写制作的, 而官方的剧情都是硬编码的 (直接在代码里写好), 所以如果大家想要制作剧情就得写代码, 门槛太高了! 所以就出现了 Lua Cutscenes 这样的 helper 来用 Lua 这种简单的编程语言来对接 C#, 即我们可以编写简单的 Lua 脚本来使用官方代码中的各种跟剧情相关的函数

下面讲解常见的剧情制作方式, 如果你想要更为细致的剧情操作, 比如在对话过程中加入操作, 可以使用 Prismatic Helper 等 Helper 的 Dialog 指令

首先在你的 Mod 下放置新创建的空 lua 文件以供后续使用, 记得套文件夹

  • 📁 Mods
    • 📁 你的 Mod
      • 📄 everest.yaml
      • 📁 LuaCutscenes
        • 📁 作者名
          • 📁 项目名
            • 📄 trigger.lua
            • 📄 talker.lua

然后这里以 Lua Cutscene Trigger 为例(Lua Talker 同理), 请你在地图中放置一个 LuaCutscene/LuaCutsceneTrigger, 并在 Filename 属性中填入 LuaCutscenes/作者名/项目名/trigger, 此时 Lua Cutscenes Helper 就能找到你的 lua 文件了, 如果文件是在游戏运行的时候新放的, 可能需要 Ctrl + F5 重启一下加载文件

Lua Cutscene Trigger

打开 trigger.lua 并填入以下内容

路径: 你的 Mod/LuaCutscenes/作者名/项目名/trigger.lua
1
2
3
4
5
6
7
function onBegin()
  -- 这里面是你的过场动画代码
end

function onEnd(room, wasSkipped)
  -- 这里面是你的结束过场代码
end

对于 Lua Cutscene Trigger 来说, 当你进入 Trigger 时, onBegin 函数中的代码会被逐行执行, 执行完毕后, onEnd 函数中的代码会被逐行执行

此时你就可以在函数内部加入一些 Lua Cutscenes Helper 为你预制好的 lua 函数了, 比如

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
function onBegin()
    -- 让玩家无法移动
    disableMovement()
    -- 让 setCameraOffset 能被正确作用, 详情见机制库
    player.ForceCameraUpdate = true
    -- 让镜头向右偏移一单位, 即 48px, y 方向一单位是 32px
    setCameraOffset(1, 0)

    -- 等一秒让镜头移动完再缩放
    wait(1)
    -- 拿到关卡信息
    level = getLevel()
    coroutine.yield(level:ZoomTo(vector2(160, 90), 2, 3))  -- 花 3s 将镜头放大一倍, 并将镜头居中

    -- 向右走 32px
    walk(32)
    -- 说一句话, 这里填 Dialog ID
    say("WOW")

    -- 镜头花 1.5s 复原
    coroutine.yield(level:ZoomBack(1.5))
    wait(1)


    enableMovement()
    player.ForceCameraUpdate = false
    setCameraOffset(0, 0)

end

function onEnd(room, wasSkipped)
    -- 如果玩家在执行剧情的过程中跳过剧情, 这里的 wasSkipped 就会为 true, 此时我们让玩家自杀
    if wasSkipped then
        player:Die(vector2(0, 1))  -- 第一位参数是烟花方向
        return
    end
end

此时当你触碰 Lua Cutscene Trigger 的时候剧情函数就会往下执行了!

如果你觉得这些函数无法满足你, 可以参考 C# 交互栏目, 通过 Lua 访问游戏中的 C# 代码(刚才使用的预制 lua 代码本质上也是这么做的)

注意事项

  1. 这个流程是按顺序进行的, 也就是说上面的例子中, 镜头右移和镜头缩放 不会同时执行. 而且假设有一个流程被暂停或者耽误了, 后面的流程就会一直卡住不动, 直到那个卡住的进程结束.
  2. Lua 脚本在不做特殊处理的情况下, 跨房间会直接失效.
  3. Lua 脚本在暂停跳过以后, 会直接进入 onEnd 代码然后结束过场流程.

更好的调试

作图的问题千奇百怪, 打开控制台可以看到 Lua Cutscenes 输出的调试信息, 这会方便我们排查问题

Lua Talker

和 Lua Cutscene Trigger 的格式其实比较类似, 但是 Lua Talker 启动过场的方式是玩家和实体交互, 因此我们在脚本中不使用 onBegin, 而是 onTalk:

路径: 你的 Mod/LuaCutscenes/作者名/项目名/talker.lua
1
2
3
4
5
function onTalk()
end

function onEnd(room, wasSkipped)
end

与 Lua Cutscene Trigger 不同的是, 跳过剧情并不会中断 onTalk 函数, 比如如果你在 onTalk 里 walk(10000), 那么跳过剧情之后 player 仍然会接着行走