文 / rooyeewu

1.问题

绝大多数游戏项目都会开发新手引导,剧情之类的功能。这类功能有两个最大的特点:一是跳跃大,二是特殊化。一个完整的功能(如一段教学指引)需要在多个逻辑系统中跳转,并且具体形为的触发条件千差万别,需要很多特殊处理。这类功能实现对程序结构的挑战巨大,如果没有统一规划,很容易掉入Hard-Code的深渊。

2.脚本系统

解决这类问题的一个较好方法是抽象功能形为与触发事件,形成离散的形为(Action)集与事件(Event)集,然后通过脚本的形式组织成一个个完整的功能。为了以最干净的方式实现上述目的,我们只需要抽象两个概念,即上面提到的:行为(Action)与事件(Event)。一个行为只需要配置两个事件表达式:开始事件与结束事件即可明确指示其行为的执行时机。

开始事件表达式必须存在,否则行为无法开始执行;结束事件表达式可为空,取决于当前行为是否有“自结束”方式。另外,为了实现行为动作的组织,系统需要实现一个非常重要的事件:

EventActionEnd:ID[ 额外参数列表]

该事件在指定ID的行为结束后发出,这样就可以利用此事件统一的组织触发脚本,一个触发脚本本质上就是由上述表格中若干具有逻辑相关性的行组成的集合。

到此,我们就可以完整描述一个具体的行为动作的执行过程:

3.应用

上述对Action的实现方式采用常用的“三段式”:Begin(), Update(), End()。这样做的好处是Action的实现者可以实现三种形为方式:

1) 实现单帧的“瞬时行为”;

如瞬间给一个玩家加血可实现为一个瞬时行为。

2) 实现跨帧的“持续行为”;

如将怪物从A点移动到B点可实现为一个持续行为。

3) 实现接受用户操作的“交互形为”。

如剧情中要求用于作出选择可实现为一个交互形为。

这些形为方式特别适合新手引导或者剧情之类的功能需求。

另外事件的检查不局限于单一事件,而是事件表达式,这样方便组织逻辑结构。下面抽象一些常用的执行流程形式,再给出运用此脚本系统的表达方式:

1) 顺序执行

2) 分支执行

上述分支很容易扩展成多分支,实现类似switch-case的执行结构。

3) 循环执行

4) 逻辑判断

如何应用到新手引导与剧情

可以理解为每段新手引导或剧情都是一个脚本,一个脚本就是上述表格的若干行。一个脚本在游戏系统中需要给定一个唯一标识,通过外围游戏逻辑规则按需加载指定脚本处于WAITING-RUNNING状态。这样一段引导逻辑就进入游戏中,但它需要一定的事件去触发。我们可以实现任意有意义的事件在游戏中的任何地方,如打开一个卖二手QQ平台界面时抛出一个事件,关闭一个界面时抛出事件,点击一个按钮时抛出一个事件,抛出事件是随心所欲的,只要有需要就可以。

典型地,抛出一个事件只需要在任意地方添加一行代码,如:

noxssSystem.Instance.Trigger(EventClickUI, “uiName”);

这样事件被异步的发送出去,抛出事件的执行代价可忽略不计。如果玩家在当前游戏进程中没有加载任何脚本,这个事件很快被丢弃;如果有脚本加载,此事件会尝试去触发脚本中行为的执行。这样可以做到新手引导对系统的最小化开销。

4.小结

通过统一的触发脚本系统,可以完成任意的逻辑脚本开发,包括新手引导,剧情,甚至客户端AI等;同时减少某些“跳跃大,特殊化”功能需求对程序结构的破坏,避免HardCode的产生;脚本形式统一简单,可以通过excel形式编写,也利于开发可视化编辑器。

基于触发机制的脚本系统相关推荐

  1. python游戏开发引擎_基于Python的网络游戏脚本系统的设计与实现

    基于 Python 的网络游戏脚本系统的设计与实现 摘要:传统的网络游戏开发采用 c/c++ 实现游戏的逻辑功能,随 着游戏内容越来越丰富以及快速变化的市场需要, c/c ++ 已经不能 满足开发者对 ...

  2. 事件触发控制_基于事件触发机制的直流微电网多混合储能系统分层协调控制方法...

    点击下面标题,了解通知详情第九届电工技术前沿问题学术论坛征文通知 华北电力大学电气与电子工程学院的研究人员郭伟.赵洪山,在2020年第5期<电工技术学报>上撰文,以含有多个混合储能系统(H ...

  3. 基于SpringBoot的企业OA系统的设计与实现,Java毕业设计项目,高质量毕业论文范例,源码,数据库脚本,项目导入运行视频教程,论文撰写教程

    目录 课题背景 项目技术栈 适合对象 适合课题 项目功能概述 高质量论文范例(附原图,可再次编辑和修改) 毕业设计撰写视频教程 部分运行截图 课题背景 82.7%的受访白领表示认为数字化技术极大地提高 ...

  4. 游戏服务器 脚本任务系统,玩家杀死野怪系统自动触发任务系统的脚本

    一个架设比较好的奇迹私服中gm怎样才能做到野怪死亡触发执行任务设置,这个功能可以说是游戏中非常基础的一个功能,杀死怪物之后系统自动统计杀死野怪的数量来自动提醒玩家是否已经完成了任务,杀死怪物的时候还会 ...

  5. 基于Attention机制的BiLSTM语音情感识别研究与系统实现

    1.摘要 以往的情感分类大多是基于粗粒度进行的,针对七分类情感语料进行的研究不多,且最终的情感分类结果只包含一种情感,很少对多情感共存现象进行研究,因此不能完全体现用户情感的丰富性. 针对这些不足,本 ...

  6. 一个基于组件的动态对象系统

    http://hulefei29.iteye.com/blog/1490889 一.静态的痛苦      作为一个项目经验丰富的程序员,你经常会遇到游戏开发过程中的"反复"(ite ...

  7. 基于web的在线考试系统的设计与开发

    欢迎添加微信互相交流学习哦! 项目源码:https://gitee.com/oklongmm/biye2 在线考试系统的设计与开发 目录 TOC 1-3 第一章 绪论 1 1.1在线考试系统的研究背景 ...

  8. 详解Linux2.6内核中基于platform机制的驱动模型

    原文地址:详解Linux2.6内核中基于platform机制的驱动模型 作者:nacichan [摘要]本文以Linux 2.6.25 内核为例,分析了基于platform总线的驱动模型.首先介绍了P ...

  9. 基于javaweb的公交查询系统的设计与实现(含源文件)

    欢迎添加微信互相交流学习哦! 项目源码:https://gitee.com/oklongmm/biye 基于J2EE的公交查询系统的设计与实现 摘  要 公交查询系统是城市道路交通的重要组成部分,是城 ...

最新文章

  1. c语言输入姓名比较是否同性,C语言基础--选择题
  2. 透视WPF 应用程序的利器
  3. git连接jenkins_基于 Jenkins 和 Kubernetes 的持续集成测试实践了解一下!
  4. 无法找到脚本库错误解决过程
  5. Vim取消查找后的高亮提示,:nohl或者:noh什么的都不管用,来一个简单粗暴方法
  6. java 基本数据类型及自己主动类型提升
  7. BZOJ4568 : [Scoi2016]幸运数字
  8. 使用ABAP代码提交SAP CRM Survey调查问卷
  9. 冷热分离和直接使用大数据库_用读写分离与分表分库解决高访问量和大数据量...
  10. python在线朗读-使用python编写一个语音朗读闹钟功能的示例代码
  11. 民工哥读者中秋福利!包邮送书!
  12. 关于目前CIM(BIM+GIS)行业的一些看法
  13. 我的世界java雪村种子_我的世界:自带雪屋前哨站与要塞的富有雪村种子,超稀有砂砾山...
  14. html5底部导航图标制作,如何做好UI底部导航栏图标设计
  15. 绿色版软件 tomcat+eclipse的使用
  16. Android高级工程师面试必备之计算机网络基础,android体系架构
  17. 百度之星Valley Numer
  18. html5内嵌式格式,如何使用内嵌式引入css样式表
  19. Flutter 制霸全平台?这事儿我看有戏。
  20. python对文件进行tar和gz格式的压缩和解压缩(亲测,可用)

热门文章

  1. hive 修改表名_hive表新增字段或者修改字段
  2. 贝叶斯规则(Bayes’ rule)
  3. [PHP] 持续交付Jenkins安装
  4. 提升我的工作效率(一)--常用的快捷键
  5. Appium Python 六:管理应用和Activity
  6. mac homebrew
  7. c++------------提取文件中的信息
  8. FFMPEG结构体分析:AVCodecContext(转)
  9. Xcode8.0 删除插件路径
  10. js ajax上传图片到服务器