在实训的第三周,项目这边又提出了新的需求,不过所幸的是,由于之前我曾花了一些心思来做了一些架构和设计的工作,当前自己负责的功能模块还算可以较好地应对需求的变更,而不需要进行较大的变动。在此,我也是通过实际的案例进一步体会到了好的架构和模式是如何抵抗外部需求变更的影响,推动软件开发过程进行的。

简单说明一下当前项目开发的情况:我们的项目组要做的是一个类似于球球大作战的吞食类游戏,不同的是我们的游戏场景在三维空间当中。在前两周,我完成了游戏当中的场景角色行为脚本,玩家输入控制脚本和两个AI脚本,这两个AI分别是模拟玩家角色行为的玩家角色AI和模拟游戏场景中可移动的食物AI,食物AI可以在场景中按一定规则随机移动或者在侦测到附近的玩家角色后逃跑;

实现功能时所用的架构设计如下,详情可见上一篇总结:

在本周,我的任务是希望实现一个新的AI:这个新的AI控制游戏场景上的一些惩罚性的食物,当玩家吃到这些食物后将会变小,这个AI的逻辑相对很简单,只需要在场景中随机移动即可。

现在的问题来了:我应该怎么让这原有的架构适应新的需求呢?

首先分析一下,这个新增的AI只有随机移动的功能,而随机移动的功能早在之前的AI中已经实现了,所以,实际上我根本不用重做随机移动的逻辑,挪用之前已实现的功能就行了。不过,要注意的是添加新的AI时不能破坏原有AI的功能,由于随机移动的逻辑是写在FoodAI脚本中的(PlayerAI也会使用),那么要实现新的功能,一个最简单粗暴的做法是把架构修改成如下图所示的样子(这里把新的AI命名为PoisonAI):

这样,就把FoodAI中实现的随机移动的逻辑搬运到PoisonAI类中了,由于FoodAI类派生于PoisonAI类,因此同样具备随机移动的功能,这样既维持了原来功能,同时新增的PoisonAI又可以作为一个独立的AI脚本供游戏使用,至此,任务完成。

虽然在实际开发中我采用的就是这样的做法(毕竟做重构还是很麻烦的事情),但是它有一些问题:首先,软件的可扩展性的基本准则是在添加新的功能时不能修改原有的代码,这种做法显然已经违背了这条准则,这有可能引发一些潜在的问题;其次AI之间的派生结构显得很“怪异”,而且在面对稍复杂的功能需求或变更时是无能为力的。

针对这个问题,开发时也构想过另外两种“优雅的设计”,一种是构建一个通用AI组件保存通用的AI操作,有需要时挂载特定的Behaviour组件到不同的AI组件中:

这样的设计初衷是为了增加架构的可扩展性:当需要实现一个新的AI时,那些通用的AI行为就可以拿现成的脚本使用,需要一些独有的AI行为时,添加对应的Behaviour类型即可;此外架构也还算好看。

分析了一下发现并不是一个好方案,实际上甚至不比第一种方案好,就拿现在做的项目来说,有的行为所有AI都有(随机移动),有的行为只有FoodAI和PlayerAI有(侦测玩家、逃跑),有的行为只有PlayerAI有(吃食物等),哪些行为要归入“通用的操作(ObjectBehaviour)”一类中呢?假设另有一个新的AI功能可以使用原有AI的特定行为(如PlayerBehaviour),怎么办?

于是有了另一种设计,该设计干脆把所有操作视为“通用的操作”,此时AI类变成了上下层的隔离类,如下图:

这样,当需要做什么AI需要用到什么Behaviour时,按需取用即可。这样的设计似乎就好很多了。但是这个AI类本身好像还会有一些问题:例如,随着功能的扩展可能会变得很庞大,或者AI类本身的变动引起的代价会很大。

后来,经过大佬的点拨,我又学到了一个更好的设计方案,其实我的最后一个设计方案已经算是有点接近了,不同点:1.中间不需要多余的AI类;2.角色行为组件按照行为本身来划分,而不是按角色来划分。大概的形式像这样:

不过这位大佬同时也说到像我现在做的架构设计其实也是完全可行的,只要能控制住复杂度就可以,大概意思是符合实际情况就好。。。确实我们现在的实训项目应该也不太可能有其他新的功能需求了,另外我也见过一些不太优雅的架构设计,这些设计应该都是出于实际开发状况的考虑。

在此简单总结一下本周实训的两点主要心得:

游戏AI方面的架构设计:游戏角色的行为组件需划分得足够细,以角色的行为而不是角色本身为单位来做组件,这样就可以最大限度地提升组件可复用的概率。当上层的AI组件需要用到哪些行为组件时对应进行引用即可。

对“软件架构”的初步理解:做软件架构应该谨记的一点是从实际出发,或者说,结果导向。做软件架构的目的不是为了做出一些优雅的、高大上的模式和架构设计,而是根据项目开发的实际现状设计出一个最优的架构方案,指导项目被最好执行。

杂记:

1.项目开发时,提交代码到版本控制管理系统时提交得要勤一点,本周因为github上面代码的冲突问题折腾了好一会儿。

2.项目开发时虽然负责的是局部但最好还是要有些全局意识,当初写AI的脚本的时候没有考虑到后面要和网络那边做网络同步,现在就好像给他们那边带来了一些麻烦。

3.项目到目前为止好像已经完成了大半,真心觉得用Unity做开发比想象中还要容易...

3.昨天去了广州4399听了秦春林的全局光照渲染讲座,尽管有大半都没听懂但仍然感觉大开眼界,感觉自己对图形学的认知真的太浅了,连皮毛都算不上,就当是激励自己以后好好学习吧...

3d游戏开发实训一周总结 3相关推荐

  1. 3d游戏开发实训结项总结

    学校的3d游戏开发实训在历时一个多月之后终于告一段落了,回顾整个实训的过程,自己主要承担了游戏客户端大部分的开发任务,包括角色和镜头的控制,AI逻辑的实现等等,也在实际的编码过程中锻炼了技术.在前期还 ...

  2. 3d游戏项目实训一周总结 2

    在本周的项目实训中,我的主要工作是完善对玩家角色的控制脚本,以及初步实现游戏中的AI功能.该AI功能包括游戏玩家角色的AI功能和游戏非玩家角色的AI功能. 在玩家角色的控制方面,我们增加了新的需求,要 ...

  3. 介绍一下3D游戏开发的简单常识,以及最终幻想13游戏流程为什么会过于线性的原因。

    介绍一下3D游戏开发的简单常识,以及最终幻想13游戏流程为什么会过于线性的原因. (1) 回复 1楼 2012-01-25 14:10 举报 | keyblade2 坐等B青现身给LZ答疑解惑 回复 ...

  4. 智能楼宇3D虚拟仿真实训平台

    智能楼宇3D虚拟仿真实训室 智能楼宇3D虚拟仿真实训平台 平台概述: 智能楼宇3D虚拟仿真实训平台,是建立在现实建筑智能化工程基础上,利用3D虚拟现实技术,依托于3D虚拟Unity平台通过模拟或还原现 ...

  5. java坦克大战 实训报告_坦克大战系统《Java程序开发实训》综合实训报告.doc

    坦克大战系统<Java程序开发实训>综合实训报告 <Java程序开发实训>综合实训报告 题目: 坦克大战系统 姓名: 方庆 学号: 2010203206 班级: 10软件(2) ...

  6. Android实训内容及过程,Android项目开发实训大纲.doc

    Android项目开发实训大纲Android项目开发实训大纲 黎明职业大学信息与电子工程学院 <Android项目开发> 实训指导书 2014年6月 <Android项目开发> ...

  7. 郑重告之:智能合约开发实训营第4期学员招募正式启动!

    各位同学,抱歉久等了- 这是终于到来的<以太坊智能合约全栈开发>实战特训营第四期的正式招募通知. <以太坊智能合约全栈开发>实战特训营是由硅谷密探和 celer network ...

  8. Unity 3D游戏开发学习教程

    用C#用Unity3D制作游戏 你会学到: 您将学习3D游戏开发基础知识,以使用Unity3D引擎推进事物. 到本课程结束时,他们将可以轻松制作任何类型的游戏,无论是3D还是2D MP4 |视频:h2 ...

  9. 《Unity 3D 游戏开发技术详解与典型案例》——1.3节第一个Unity 3D程序

    本节书摘来自异步社区<Unity 3D 游戏开发技术详解与典型案例>一书中的第1章,第1.3节第一个Unity 3D程序,作者 吴亚峰 , 于复兴,更多章节内容可以访问云栖社区" ...

  10. 学习3D游戏开发进阶之路

    笔者从事IT行业15年了,一直奋斗在一线编程,从普通程序员逐步成长到上市公司技术总监,目前在创业公司担任技术合伙人,主要负责公司整个项目团队的技术管理.在网上或者论坛上很多同学请教过我关于如何学习3D ...

最新文章

  1. 双重ScrollView,RecyclerView联动实例
  2. python语言用什么来表明每行代码的层次关系_《计算机二级Python语言程序设计考试》第2章: Python语言基本语法元素...
  3. 基于android新闻阅读器,Readian News是一款基于Android和网络的新闻阅读器,可让您掌控一切...
  4. 数据驱动创新 融合引领变革 2017中国工业大数据大会·钱塘峰会今日在杭州国际博览中心顺利举行...
  5. C++中,如何定义和使用指向成员函数的指针
  6. MVCC(Multiversion concurrency control)
  7. 快速开发项目的前端框架主要针对后台界面
  8. linux ssd做raid1,linux 磁盘阵列 raid1搭建教程
  9. 网络爬虫笔记—Selenium
  10. excel删除无尽空白行_Excel2019如何批量删除表格中的空白行?
  11. 二、对HEVC/H.265视频编解码器进行隐写的基本思路
  12. 2019年3月5日-MPU9250使用(二)
  13. 【实验五 一维数组】7-10 sdut-C语言实验-排序问题
  14. docker:报错docker: Error response from daemon: Mounts denied:
  15. 为什么有些大公司技术却弱爆了?
  16. python将图片分割成两部分
  17. plantuml样式_自定义PlantUML和C4Model的样式
  18. AUC(一):AUC与Mann–Whitney U test
  19. Idea 插件SDK 配置
  20. 【水果识别】苹果质量检测及分级系统【含GUI Matlab源码 896期】

热门文章

  1. MySQL初步认实和搭建LAMP环境部署ucenter和ucenter-home
  2. Windows 默认以管理员身份运行批处理bat文件
  3. 高效C++ Effective C++
  4. 计算机科学创新实验刘琦,刘琦----中国科学院微电子研究所
  5. 将 SVN Repositories 内部的下层目录,提升成为顶层 Repositories 的风险
  6. 什么是智能颈部按摩仪低频脉冲电流?它会对人体有何影响?
  7. 在清华南都中看到的关于博士生给研究生的建议,觉得很好
  8. 把两个数和告诉A,积告诉B,A说不知道是多少, B也说不知道,这时A说我知道了, B接着说我也知道了,求这两个数是什么
  9. php 支持zip解压缩,PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
  10. 微信视频号怎么增加浏览量