设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 5653|回复: 16
打印 上一主题 下一主题

[教程] (应该算完结?)基于inky的非线性剧情处理简易教程

[复制链接]

Lv1.梦旅人

梦石
0
星屑
213
在线时间
21 小时
注册时间
2022-3-1
帖子
10
跳转到指定楼层
1
发表于 2022-3-9 22:41:56 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 清和QingHe 于 2022-4-10 15:26 编辑

由于太懒了这个主题立项到现在都没有开始正式的写文章,所以不如先开题然后后续不断补充好啦
大概会一段一段的更新,时间不定,应该……会更完吧(

总之,这是写给你的简单的入门教程,希望你们喜欢!
对了对了,由于个人水平能力限制未免会出现错误,还请多多包涵!

评分

参与人数 4星屑 +10 +3 收起 理由
期miu + 1 精品文章
多啦A户 + 1 精品文章
死伤殆尽 + 10 塞糖
Arfies + 1 是inky,i了i了

查看全部评分

Lv1.梦旅人

梦石
0
星屑
213
在线时间
21 小时
注册时间
2022-3-1
帖子
10
2
 楼主| 发表于 2022-3-9 23:12:50 | 只看该作者
本帖最后由 清和QingHe 于 2022-3-10 08:38 编辑

搞了半天似乎发不出跳转链接……直接以纯文本的形式发出来好了

->参考资料


1.ink中文文档(非官方)
https://ink.magicoder.org/docs

2.ink官方文档
https://github.com/inkle/ink/blob/master/Documentation/WritingWithInk.md

3.分支剧情创作中的挑战和工具
https://indienova.com/indie-game-development/tools-for-branching-dialogs-and-narrative/

4.编写基于 Web 的互动小说
https://indienova.com/indie-game-development/writing-interactive-fiction-with-inky/

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
213
在线时间
21 小时
注册时间
2022-3-1
帖子
10
3
 楼主| 发表于 2022-3-10 08:32:41 | 只看该作者
本帖最后由 清和QingHe 于 2022-3-10 08:37 编辑

->序言:


作为一个萌新,在处理故事与代码逻辑的时候,大多数时间总是和奇怪的变量和非预期的剧情走向进行激烈的斗争。作为一个更趋向于故事剧情的手残党,大量文本对代码的影响也不得不使我将目光转向至如何将代码与故事分离,从而将注意力放在如何更好的处理文本与游戏逻辑上来。当然,由于需求众多,国外大神也开发了许多剧情编辑工具,inky、twine、yurn都是不错的剧情编辑工具,但是考虑到故事的灵活性,我仅仅在处理简单剧情的时候将twine当的剧情编辑工具从而理清故事脉络,大部分时间都将完整的故事写在灵活的inky上。
由于国内的ink教程相对较少,仅存的几篇也是对英文原稿的翻译;而全英文的官方文档又使得不少人望而止步。故我准备了一个简单的故事框架教程,让没有任何编程经验的人也能够写出分支故事框架/互动小说(但是需要有一定的电脑知识基础!),体验剧情设计与编辑的乐趣。
同时,如果您更趋向于twine等具有流程图的工具相关知识,请跳转至参考资料“分支剧情创作中的挑战和工具”中查看更多内容!
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
213
在线时间
21 小时
注册时间
2022-3-1
帖子
10
4
 楼主| 发表于 2022-3-10 22:35:58 | 只看该作者
本帖最后由 清和QingHe 于 2022-3-10 22:37 编辑

->非线性故事剧情与ink:


游戏是一款注重叙事性和故事性相结合的一种艺术。在我们对RPG游戏性进行探索的时候,也有一部分游戏开始注重通过RPG开始故事性的深入探索。《To the moon》、《烟火》等等,无不通过其优秀的叙事手法和引人入胜的故事情节来吸引大众。随着RPG游戏的不断发展,线性叙事框架已经无法满足部分游戏开发者的需要,从而发展出一个新的分支——非线性叙事框架。故事设计上不再满足于单结局,而是选择吸收互动小说等形式的写作手法,从而让故事更为充实。限于篇幅问题,本贴不再展开叙述,如果各位有兴趣也许大概可能以后会开新坑写XD
对于游戏开发者来说,故事的充实导致的是故事逻辑更为复杂化。如果故事简短的话,我们可以通过众所周知的if…else的条件语句将新加入的故事剧情写入游戏本身的逻辑里。由于游戏体量小,虽然后续的维护可能变得相对困难一些,但是也完全可以解决。
但是,当故事的体量变大起来呢?故事也需要本地化呢?
“哦我的上帝啊,瞧瞧这蜿蜒曲折的后期剧情,配上这如隔壁山姆舅舅蓝莓果酱般纠缠的代码,真是糟糕极了!”
故事逻辑与游戏逻辑相互纠缠在一起,不管是if语句体积的不断臃肿,还是游戏故障的排查,原本逃避的问题如雨后春笋般不断冒出来。游戏开发的staff提刀笑着冲向故事设计staff家门……
为了避免这种情况发生,我们需要将故事逻辑分离,使之成为一个独立的个体,将其引入游戏逻辑里。通过将故事逻辑和游戏逻辑相对分离,避免由于大量文字掺杂导致的游戏代码维护困难。因此,我们需要一个剧情编辑工具来将剧情独立起来。你可以选择在引言中提到过的twine,它可以具现化出完整的流程图。但是,相比于twine,ink本身便是由游戏剧情编辑而生,虽然其具有一定的学习曲线,但是可以“像写代码一样灵活的策划剧情”,使用过markdown等的同学完全可以快速上手。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
213
在线时间
21 小时
注册时间
2022-3-1
帖子
10
5
 楼主| 发表于 2022-3-11 18:14:12 | 只看该作者
本帖最后由 清和QingHe 于 2022-3-11 18:19 编辑

->inky适合的范围:


inky本身并非作为互动小说编辑器出身的,而是作为Unity的一个集成插件,后渐渐独立出来。相比于同类型的互动小说编辑来说,inky没有具象化的流程块(或者说是结构框架),一切是以文字与节点的形式展现出来的。当故事相对比较简单时,我们可以尝试用Twine类的图形化工具进行展示;但如果故事变得错综复杂,我们很难从一堆关系线中理清故事脉络,同时对故事的增添或者删改也成为一个问题。inky将故事模块节点化后,我们可以很容易的添加或者删除一个选项,一个剧情走向,或者一段小故事。ink作为一种标记性语言,相比于编程语言学习门槛极低,同时可用性又相对较高。所以对于使用Unity的游戏开发者来说,是一件不错的选择。
虽然感觉说了不是一遍了,这里再次重复,如果你想要流程图具象化的,twine完全能够胜任。目前的ink不支持显示流程图,因为其本身理念就是因为故事过于复杂,为了灵活处理故事逻辑解决流程图解决不了的问题。

呼,终于把该讲的废话都讲完了,之后就要开始讲ink的基本教程了233(我是绝对不会承认是因为最近打游戏和编剧情样本浪费调时间了的)
假定看到这篇教程的你没有任何编程经验,但是对电脑基础知识稍有了解(既然做游戏了多少得懂点文件下载删除安装叭)。放轻松,我会按照步骤一步步的教学如何写出简单的叙事框架,尽可能的充实基本内容。如果需要进阶的知识,欢迎随时访问官方文档或者中文文档。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
213
在线时间
21 小时
注册时间
2022-3-1
帖子
10
6
 楼主| 发表于 2022-3-14 08:53:17 | 只看该作者

->ink简易教程

1.下载安装,初识界面!
写ink脚本,我们常常用编辑工具inky。开发者使它可以进行多端支持(Windows\Mac\Linux),你可以通过下面的链接进行下载和安装!
官方下载地址:https://github.com/inkle/inky/releases
如果你习惯使用vscode进行编辑的话,可以在vscode的拓展中找到ink插件使其支持ink语法!

好的,相信你一定下载并安装好了这个小小的软件。它的界面为全英文的并且不支持语言切换(该学英文了兄弟)。分界线将整个界面分为两部分——左边编辑,右边便可以实时加载更新结果。这对我们的编辑是很有用的,所见即所得。右上角的单箭头是后退,双箭头是重置预览的故事;inky编写的文件后缀为.ink,为我们提供了web、json、js文件三种导出形式(你可以从file中找到他们);如果感觉到字号有些小,可以通过同时按下Ctrl和+调整字号(你可以从view中找到他们);同时inky也支持修改主题——我想不会有人在深夜里还想盯着刺眼的白屏写作。通过View->Theme->Dark将界面调整为炫酷的黑色从而在夜里护眼式写作!

2.举个例子!
我将随手写的一个相对完整的小随笔放在了附件里,你可以进行下载查看。当然,如果你不愿意下载的话,ye可以将下面这段直接复制到编辑器的左边并仔细观察右边的变化:

INK 代码复制
  1. /*
  2. “白塔”这个意象实际上是作为写教程构思故事的时候突然蹦出来的字眼。既然作为教程,注定了这个故事的不完整性。但是我还是会尽量的将故事讲完整或者通过片段向你演示ink的用法。
  3. */
  4. ->preface
  5. //需要指向节点开启故事,我个人习惯开头为序章,你不妨将起始节点写为“start”
  6. == preface ==
  7. //节点为英文通过==包裹
  8.  

  9. “碧青的天空,若隐若现的白塔,无尽的街道。于无垠的草地上醒来,破碎的约定与回忆。颠倒而又虚幻的存在着的、关于我的另一个世界。”
  10. ->chapter1
  11.  
  12. == chapter1 ==
  13. 我这是……在哪里?
  14. 从浅草中起身。周围的环境是如此的陌生。远处的白塔若隐若现,古旧的塔身透漏着神秘的吸引力。
  15. “白……白……”
  16. 谁在呼唤我的名字?
  17.  
  18. 一念,前脚突然踏空。原本无垠的草地不见了,身体突然下坠,转眼周围便由碧青转为墨黑色。风如寒锋般划的脸颊刺痛,睁开双眼甚至都变得困难起来。
  19. 开……开玩笑的吧,日本轻小说都不敢这么写。
  20. 是梦吧,一定是梦吧。
  21. + [平静的审视四周]
  22. ->chapter2
  23. + [挣扎着试图醒来]
  24. -> end1
  25.  
  26. == chapter2 ==
  27.  
  28. ->END
  29.  
  30. == end1 ==
  31. “呼……——呼!”
  32. 深渊般的下坠感使白突然惊醒。一缕清阳轻轻打在她惺忪的睡脸上。紧紧攥住松软的被窝,令人安心的真实感。趴在床头的橘猫看见主人醒了,撒娇的喵喵叫着。一切与从前一样。
  33. 啪嗒。
  34. 手腕上月光石手链的红绳突然断裂,月光石摔落在地板上,发出闷重声响。
  35. TODO:手链->约定之物;月光石->幽静、柔和、预知;红线->命运之线;写作时记得体现。
  36. “似乎……做了一个很真实的梦,可是……到底梦到了什么呢……”
  37. ->END
  38. //指向end,表示“故事流从此处停止”


如果你没有接触过相关,可能会对非文字符号感到眼花缭乱和退缩,不要害怕,接下来我会依次讲解文中出现的符号。

白塔.zip

1.38 KB, 下载次数: 8

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
213
在线时间
21 小时
注册时间
2022-3-1
帖子
10
7
 楼主| 发表于 2022-3-14 20:53:20 | 只看该作者
本帖最后由 清和QingHe 于 2022-3-14 20:54 编辑

3.创造一个线性的故事,起始、过程、结局!

在开始写作前,我们首先要明白两个基础的概念:跳转(divert)和节点(konts)。
故事总是由多个相互链接的部分组成的,在ink中我们称他们为“节点(konts)”。节点的命名规则的是在节点名称左右分别添加至少两个等号(==)作为标记。在inky中(任何支持ink脚本的编辑器中),会使用蓝色突出显示已识别的标记。节点下面的内容都属于本节点。需要注意的是,节点的名称需要为英文,中文是不可以的(所以学习英语是个必须的选项XD)。       
一个故事基本的发展至少需要“开端、发展、高潮、结局”四部分组成。那么如果没有想好的话,就将这四部分作为节点开始创作吧!或者你也可以按照篇章、分支点、选择、段落作为片段进行划分,一切都是随心所欲的。但是如果你是一个相对专业的剧情编辑者,那么请自行规范一种命名规则能够梳理和区分每个节点的内容,这点与写代码时对变量的命名规则是类似的。不然游戏开发者与剧情编辑总得有一个会疯掉。

刚刚我们谈论了每个片段的范围构成规则(节点),现在谈谈如何将节点联系在一起。我们使用一种叫“跳转”(divert)的标记进行链接。
"跳转"作为链接节点与节点之间的桥梁,对节点链接起着重要的作用。跳转的命名规则是“跳转箭头(->)”和“节点名称”构成,表示跳转到下一个节点。跳转本身是不会显示给玩家的。同时,每个片段的构成便会构成以节点名成开始,以跳转箭头结束这种结构。有了“节点”与“跳转”,便可以简单的写成一个线性叙事框架的故事了。
INK 代码复制
  1. == preface ==
  2. //节点为英文通过==包裹
  3.  

  4. “碧青的天空,若隐若现的白塔,无尽的街道。于无垠的草地上醒来,破碎的约定与回忆。颠倒而又虚幻的存在着的、关于我的另一个世界。”
  5. ->chapter1//这里是跳转


Snipaste_2022-03-14_20-52-50.png (3.62 KB, 下载次数: 16)

Snipaste_2022-03-14_20-52-50.png

点评

我写过一个基于Markdown的剧本系统,当时还不知道ink:https://rpg.blue/thread-409394-1-1.html  发表于 2022-3-15 15:51
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
213
在线时间
21 小时
注册时间
2022-3-1
帖子
10
8
 楼主| 发表于 2022-3-17 10:28:16 | 只看该作者

4.单、多行注释与TODO:思路整理与交流好帮手!
(关于我连贴被警告了这回事)

对于一个程序员来说,最喜欢的事情就是编程的时候不写注释,最讨厌的事情就是阅读不写注释的代码(尤其是命名不规则逻辑混乱的代码)。所以在教会你写非线性故事框架之前,让你明白注释的重要性、养成写注释的习惯是十分必要的。好记性不如烂笔头。一个好的注释不仅可以帮你记录思路和想法,同时也可以让其他阅读ink脚本的人明白你在写什么。在编程时,成百上千行的代码总是会让我第二天醒来因为不知道进度和思路而硬生生的重新读一遍,也让我被迫养成了写注释的习惯。所以在ink中也是同理。注释不会显示给玩家,只有故事编辑才能够看到。

在ink中,常用的注释标记分为两大种:TODO和注释。
“TODO”是ink提供的一种神奇的待办事项标记。其表示方法是输入“TODO:”后加入注释的文字.使用TODO标记包裹的文字会突出显示#BFFFF1的颜色。TODO标记的突出显示使得它非常方便用于记录待办事项。在写入TODO后,inky软件的中上方会标注出。点击会显示出所有的待办,点击任意一个待办可以直接跳转到相应的位置。
普通注释则是用来写简短或者长批注的。其表示方法是“//”或者用“/* */”注释包裹内容。相比于TODO标记用来表示待办,普通的注释标记用起来就相对自由许多——你可以用它去写任何你需要的注释。无论是大段大段的思路,主题构思,意象含义等等,都可以写在注释里防止自己忘记。
INK 代码复制
  1. == end1 ==
  2. “呼……——呼!”
  3. 深渊般的下坠感使白突然惊醒。一缕清阳轻轻打在她惺忪的睡脸上。紧紧攥住松软的被窝,令人安心的真实感。趴在床头的橘猫看见主人醒了,撒娇的喵喵叫着。一切与从前一样。
  4. 啪嗒。
  5. 手腕上月光石手链的红绳突然断裂,月光石摔落在地板上,发出闷重声响。
  6. TODO:手链->约定之物;月光石->幽静、柔和、预知;红线->命运之线;写作时记得体现。
  7. “似乎……做了一个很真实的梦,可是……到底梦到了什么呢……”
  8. ->END
  9. //指向end,表示“故事流从此处停止”

Snipaste_2022-03-17_10-26-47.png (76.66 KB, 下载次数: 17)

Snipaste_2022-03-17_10-26-47.png
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
213
在线时间
21 小时
注册时间
2022-3-1
帖子
10
9
 楼主| 发表于 2022-3-20 02:34:34 | 只看该作者
5. 选项与条件点,开启分与隐藏支剧情!

如果你看过上文,你应该已经学会如何按照线性故事框架进行写作了。华丽的故事不能失去多结局,就像西方不能失去耶路撒冷(大雾)。所以,如果想要出现多结局,就必然会在节点进行选择处做出分支选项,从而走向不同的分线。选项本身还分为两种,普通选项和一次性选项。
普通选项是需要和跳转结合在一起,构成分支跳转操作的。选项的结构为“+”和选项文本组合。但是一般选项文本后都会加上跳转从而组成完整的分支选择块。通常情况下,输入的选项文本都会作为后面文本的一部分出现在全文中。如果你想要一个不会出现文本的选项,那么可以将选项文本置于[方括号]中。这种形式一般用于表示动作或者一些无声的行为之中。在一些文本叙事中,无声行为或许比语言更具有表现力,
INK 代码复制
  1. 一念,前脚突然踏空。原本无垠的草地不见了,身体突然下坠,转眼周围便由碧青转为墨黑色。风如寒锋般划的脸颊刺痛,睁开双眼甚至都变得困难起来。
  2. 开……开玩笑的吧,日本轻小说都不敢这么写。
  3. 是梦吧,一定是梦吧。
  4. + [平静的审视四周]
  5. ->chapter2
  6. + [挣扎着试图醒来]
  7. -> end1


一次性选项构成很简单,如果你期望玩家对某一个选项只能点击一次,那么最简单的方式就是把选项的 + 改成 *。“一次性选项”大多数使用情况下是伪多选一情况,本质上还是限定玩家只能选择一个或者说出现许多无用选项。感觉说起来比较抽象,可以将下面的例子复制到inky中亲自查看一下效果。通过一次性选项,制造了“梅琳娜”和“暗月女王”两个伪选项,实际上只有“菈妮”为可选项。(个人主观,方便举例而已。拒绝带入。)
INK 代码复制
  1. 所以,你的选择是:
  2. -> example
  3. == example ==
  4. * [菈妮] ->happyending
  5. * [梅琳娜] ->example
  6. * [暗月女王] ->example
  7.  
  8. == happyending ==
  9. “来,走吧。我亲爱的王啊。”
  10.     -> END


相信有部分玩家玩的游戏存在多周目或者要求达成某些条件后才能够解锁部分剧情。在ink中同样可以体现,你需要的可能是“条件内容”操作。相关操作在“用 Inky 编写基于 Web 的互动小说”一文中有详细的例子,此处就不展开讲述了。条件内容主要用于当当前的剧情满足某些特定条件后,进而开启结局。如果可以用“选择”完成的条件满足,尽量不要使用“条件内容”。
(写到这里差不多基础教程就结束了,以后看情况补充好了。不说了,摸老头环去了.jpg)
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
5
星屑
3936
在线时间
698 小时
注册时间
2019-5-1
帖子
80
10
发表于 2022-3-20 10:34:23 | 只看该作者
我其实老早就听说inky了,其实蛮有意思的,比较适合做做rougelike啥的。
但我就有一点很疑惑:
inky做的游戏咋存读档?
(就因为搞不明白这个,至今没法用inky做游戏)
if isinstance(I, Eggplant()):
    I.give(you, I.NUTRIENTS)
elif isinstance(I, Tomato()):
    I.give(you, I.ANTIOXIDANTS)
elif isinstance(I, TabbyCat()):
    while not you.ENJOYMENT:
        I.purr(you)
elif isinstance(I, TheOnlyGod()):
    I.EXISTENCE['proof'] = you
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-16 13:56

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表