【游戏客户端】剧情系统

【游戏客户端】剧情系统

      “剧情是游戏的灵魂" 

      一个优秀的剧情设计能够让玩家更好的了解游戏的世界观,致使玩家能够沉浸式体验游戏。大家好,我是Lampard猿奋~~ 今天要和大家分享如何实现游戏中的剧情系统

(一)剧情系统种类

      我们体验到的剧情系统大致分为两种,分别是对白式剧情演绎式剧情

(1)对白式剧情

      对白式剧情是通过直白的对话,玩家从对话中获取当前游戏进度的信息。它的优势在于简洁明了,配置方便成本低,玩家也可以从对话中精准获得想要的信息。但是玩家很容易对这类的形式感到疲惫(如果遇到又臭又长的对白,像我就会直接点点点从而跳过HHHHH)

 (2)演绎式剧情

      演绎式剧情是通过对场景,npc,摄像头等系统进行操作,把剧情内容像小剧场一样演绎给玩家。这种形式无疑会增加许多的趣味性,但缺点在于制作成本比较高

      萝卜白菜各有所爱,下面我将对这两种剧情的实现方式进行讲解~

(二)对白式剧情

      对白式剧情系统的设计可以分为三部分,分别是:数据主界面以及对白富文本

 (1)数据

      数据一般是由策划进行填表划分为不同的帧,每一帧设定对话双方的Id对话文本播放速率等内容,最后导表成脚本文件,这样就可以把策划设定的剧情转化为我们的脚本数据

      当然对于一些简单对白,我们也最好提供一个接口,可以直接传对话数据从而避免多次填表导表的操作

(2)主界面

      当需要调起对白型剧情时则创建一个主界面并传入数据,主界面的作用在于挂载每一帧剧情的角色动画对白富文本UI交互按钮点击layer等内容并控制显示不同的帧动画

      角色动画可以是spine,序列帧,或者是单纯的图片(填表控制)

      点击layer在于响应玩家点点点快速进入下一帧的需求(如果不允许快进可以在点击回调那做限制) 

      UI交互按钮一般有:“跳过”,“暂停”,和“倍速”功能,点击“跳过”则直接和服务端发送协议告知结束剧情并release主界面,点击“暂停”则由主界面控制对白富文本关闭计时器暂停冒出文字,点击“倍速”则由主界面控制对白富文本关闭计时器,然后新创不同速度下的计时器

      对白富文本主要用于显示该帧文,下文细说

      由于我们需要根据当前帧的文本是否播完选择进入下一帧,因此我们可以用一个while true 来无限循环判断当前帧的文本播完了没有(由对白富文本提供该接口),若播完则更新下一帧的界面,若无下一帧的数据则执行结束流程

(3)对白富文本

       为什么需要把对白富文本独立出来呢?主要是因为在同一剧情中,大多数情况背景图,角色动画,交互UI那些都是不会变的,只是文本进行变动,因此只需要把“动”的部分交给对白富文本即可,避免每一帧都需要创建许多UI

      对白富文本的主要任务是需要根据不同的播放速率,一个字一个字地显示文本。这需要两个步骤:其一是把帧文本的字符串进行分割,分割成一个个字符用数组存起,其二是创建一个计时器,按照设定的速率读取分割好的字符,并setText到文本中。

      如何分割字符串

      在Lua5.3之前我们可以选择string.byte来读取首字节的大小,然后根据UTF-8的编码规则,拿到这个“字”的字节长度,然后再去递归切割。之前我有文章记录这个过程

   【分割中英文字符串】

      在lua5.3之后我们可以

     来读取每个字符的unicode编码来直接判断长度从而进行分割

     提供变速,暂停,是否正在播放接口

     上文说到,在主界面可以点击“变速”,“暂停”等按钮控制文本显示。并需要对白富文本提供一个当前帧文本是否播放完毕的接口

     那么其实现逻辑也简单,当暂停时我们则释放掉计时器,重启时则根据剩余的文本重新创建即可,而变速也只不过时时间发生变化。至于是否正在播放则可以用剩余文本是否为空进行判断。至此我们的对白型剧情系统设计结束啦~~

 (三)演绎式剧情

      演绎式剧情不同游戏可能表达的方式会不一样。但是大多都是通过对场景,npc,和摄像头的调用来实现

      从系统设计角度来说,和文本类的大同小异,一个剧情分为数幕,每一幕会有数个指令操作。因此演绎式剧情大致会分为四部分:1.数据,2.剧情Manager,3.每一幕Frame,4,指令cmd

(1)数据

      同样会给每一个剧情分配一个Id,一个剧情会分为数幕然后填写每一幕需要执行什么操作,每一幕之间需不需要进行什么回调(如和服务端同步剧情进度),需不需要玩家进行交互等设定

      每一幕的指令按顺序执行,此时程序需要给策划提供一些回调函数的Key,比如NpcMove角色移动,SceneSwitch切换场景等等,然后由策划配置参数,以及执行时间等

(2)剧情Manager

      剧情的manager类是暴露在外部的单例接口,通过manager类来发起剧情结束回调拦截播放剧情时无关的UI(不然播着一个煽情的动画,突然弹出一个首充礼包hhhhh),播放剧情音乐执行下一幕等操作

(3)每一幕的frame

      Frame其实就像是一个大电影中的小片段,在这个小片段中需要一个个指令动作来完善情节。所以当拿到该幕的指令序列之后,会保存并按顺序去调用cmd中的回调函数,当所有指令结束之后,看需不需要进行回调(如和服务端同步剧情进度)或者等待玩家进行交互(如下图)

      若无则调用manager中的下一幕操作既完成使命

(4)cmd指令集

      cmd是剧情的指令集,存放着个个表现得回调。一般是基于npc,摄像头和场景相关的,例如npc的创建,删除,移动,做特定动作;摄像头的切换,移动,缩放;场景的切换,挂上特定的场景特效等等

(四)结语

      至此我们的剧情系统设计分享就结束啦,完结!!!撒花!!!

      感谢阅读,点赞,关注!!!

猜你喜欢

转载自blog.csdn.net/cooclc/article/details/124593470
今日推荐