软件工程基于Unity3D的宠物医院模拟游戏的设计与实现.docx
《软件工程基于Unity3D的宠物医院模拟游戏的设计与实现.docx》由会员分享,可在线阅读,更多相关《软件工程基于Unity3D的宠物医院模拟游戏的设计与实现.docx(37页珍藏版)》请在冰豆网上搜索。
![软件工程基于Unity3D的宠物医院模拟游戏的设计与实现.docx](https://file1.bdocx.com/fileroot1/2022-12/1/a3da9049-78c2-47e5-ace9-1216adf79ef8/a3da9049-78c2-47e5-ace9-1216adf79ef81.gif)
软件工程基于Unity3D的宠物医院模拟游戏的设计与实现
摘要
随着生活水平的不断提高与科技的发展,人们开始不满足于物质上的需求,饲养猫狗人数大幅度增长。
可在饲养过程中难免会遇到各种各样的问题。
当今社会,玩游戏又成了人们的主要娱乐与消遣方式。
模拟类科普游戏可以让人们在消磨时间的同时学习到知识,虽然不能完全代替传统的正规教育,但仍然可以起到教育的作用。
Unity3D作为一款既能开发2D又能3D游戏、且可部署到多个主流平台内的软件,是一款被较多开发者使用的游戏开发引擎。
而市面上暂时还没有发现有关科普宠物疾病类的游戏,本论文研究宠物医院模拟游戏开发,不是单纯为了娱乐,更重要的是为了能够给更多的人通过玩游戏了解到宠物疾病相关知识。
本文主要描述了利用Ngui插件对游戏的流程设计与功能实现,为后续开发同类游戏的开发者提供思路参考。
关键词:
Unity3D宠物医院模拟游戏
Abstract
Withthecontinuousimprovementoflivingstandardsandthedevelopmentoftechnology,peoplearenotsatisfiedwiththematerialneeds,andthenumberofcatsanddogshasincreasedsignificantly.Itisinevitablethatvariousproblemswillbeencounteredduringthefeedingprocess.
Intoday'ssociety,playinggameshasbecomethemainwayofentertainmentandrecreation.Simulationsciencegamesallowpeopletolearnknowledgewhilekillingtime.Althoughtheycannotcompletelyreplacetraditionalformaleducation,theycanstillplayaneducationalrole.
Unity3d,asasoftwarethatcandevelop2Dand3Dgamesandcanbedeployedinmultiplemainstreamplatforms,isagamedevelopmentengineusedbymoredevelopers.However,thereisnogameaboutpetdiseaseinscienceonthemarket.Theresearchonthesimulationofpethospitalsinthispaperisnotjustforentertainment,butmoreimportantlytogivemorepeopletheknowledgeofpetdiseasesbyplayinggames.Thisarticlemainlydescribestheprocessdesignandfunctionimplementationofthegame,andprovidesideasfordeveloperswhodevelopsimilargamesinthefuture.
Keyword:
Unity3DPetHospitalSimulationgame
第1章绪论
1.1选题的目的和意义
宠物,就像我们的亲人、伙伴一样,有一只宠物陪伴在身边,可以缓解人们的孤独感、寂寞感。
随着人们物质生活水品的不断提高,越来越多的人开始饲养起了宠物。
然而,宠物跟人类一样,也有各种各样的疾病发生,但治疗方案却跟人类完全不同,而许多宠物饲养人员并不能很清楚地了解宠物疾病给宠物带来地危害,也不了解如何预防疾病,让许多宠物就此丧失生命,同时也给饲主带来精神上的痛苦。
当今社会,玩游戏成了人们的主要娱乐与消遣方式。
而如今,游戏已经不再属于玩物丧志的范畴,模拟类科普游戏可以让人们在消磨时间的同时学习到知识,虽然不能完全代替传统的正规教育,但仍然可以起到教育的作用,可谓放松与学习两不误。
本选题的研究目的是为了让人们能够在游戏中更容易更方便地了解到宠物疾病知识,以测试的形式来巩固人们对宠物健康知识的记忆,从而更好的照顾自家的宠物,让自家宠物远离病痛。
1.2国内外研究现状
目前国内在科普宠物疾病方面有哔哩哔哩出品的首档医疗观察类真人秀《宠物医院》,此节目有科普一些常见的疾病预防等。
在游戏方面是娱乐休闲游戏,不具备知识传播功能,还有一些是针对人类疾病而设定的,而在国外的《模拟人生》系列的游戏中,虽有宠物医院的设定,但只能让玩家去简单的经营,而不能让玩家学习到有关宠物疾病的相关知识。
因此研究一款宠物医院模拟科普类游戏是很有必要的。
1.3论文结构概述
本文主要分为六个部分:
第一部分:
绪论,主要阐述毕业设计选题的目的与研究意义、国内外研究现状以及本文的结构介绍;
第二部分:
介绍了开发游戏所用到的工具与插件介绍;
第三部分:
详细描述了游戏内的需求与设计;
第四部分:
详细描述了游戏内各个功能的制作与实现;
第五部分:
游戏的UI界面设计、描述游戏的整合与导出并进行测试;
第六部分:
总结游戏内的不足与今后的改进。
第2章开发工具介绍
2.1Unity3D介绍
Unity3D是一款由UnityTechnologies所研发的跨平台2D/3D游戏引擎,开发的游戏可以部署到多个主流平台,如常见的:
Windows、MacOS、Android与iOS。
除游戏开发外还可以实现视频制作,其对模型资源的兼容性高,多个主流建模软件生成的模型均可以在Unity3D中完美导入,并可以在原模型修改后自动更新。
Unity3D给用户提供了可视化操作界面,利用内置插件,可以让新手短时间内熟悉并开发出游戏原型。
Unity3D主要支持三种语言:
C#、UnityScript(多被称为“Javascript”)和BOO。
Unity2017.2测试版后的版本在新建中已经不再包含Javascript选项,但仍然支持使用,需在Unity编辑器外创建再导入。
2.2ProBuilder插件介绍
ProBuilder插件是一款Unity2018.1版本以上自带的官方建模插件,Unity2017.x版本可以直接在AssetStore下载使用。
此插件是3D建模和关卡设计工具的独特组合,为构建简单的几何体进行了操作优化处理,但也可以进行详细的编辑和UV展开。
使用ProBuilder可以快速构建结构复杂的地形、车轮和武器的原型,或制作自定义碰撞几何体。
主要特点有:
动态用户界面、挤出插入功能、建立多边形功能、多种规则形状和着色等。
2.3ProGrids插件介绍
ProGrids插件可以为我们提供视觉和功能上的网格,它们可以使所有操作都在三个轴上对齐。
Probuilder结合ProGrids使用可以提高建模速度,使构建的几何体构造更为精准。
2.4Ngui插件介绍
Ngui是一个功能强大的UI系统和Unity的事件通知框架,均使用C#编写,并严格遵循KISS原则。
它具有简洁的代码和极简的方法。
许多behaviour类都保持在两百行代码以下。
该插件全面支持ios、Android、Blackberry、win8、wp8、flash。
使用Ngui就像使用Unity,将现成的控件(例如按钮,复选框,滚动条和其他控件)拖放到场景视图中,或者使用类似于Lego的方法制作自己的控件。
将控件另存为预设体,即可在任何地方重复使用。
第3章游戏需求分析
3.1科普类游戏的需求分析
随着科学教育类电子游戏的发展以及教育理念的日新月异,科学教育类电子游戏已经被视为科学教育的一个非主流的形式[8]。
在如今电子游戏行业迅速的发展的时代下,科普类游戏较于一般游戏来讲,其主要以普及科学知识为主,娱乐为次,在家长眼里不会被认为是玩物丧志的游戏,得到了广大家长们的认可,游戏不局限于青少年,不同年龄层次的用户均能体验游戏。
3.2游戏功能需求分析
目前饲养宠物陪伴自己生活的人越来越多,功课有时候做的不够到位,宠物发生状况时不正当的处理方式导致问题更为严重。
游戏内最主要的是给人们普及疾病相关知识与处理知识。
因此宠物医院模拟游戏较为重要的功能有以下几个:
第一,游戏内玩家将模拟刚毕业到宠物医院工作的见习助理,根据自己的能力不断成长,提升自己的职位。
第二,学习功能。
玩家主要通过学习功能来获取宠物疾病的理论知识,也仅限于理论知识,模拟现实生活中医生需要在空闲时间额外看书学习的行为。
第三,测试功能。
这个功能是模拟医院内的考核制度。
主要考察书本内的理论知识。
为了能够重复玩家的记忆,答卷采用随机出题的形式展示,通过随机来出现重复的题目,巩固玩家在游戏内学到的知识。
第四,查看实际病例功能。
病例功能主要是让玩家学习到除了书本理论知识外的知识内容。
主要记录宠物真实病情案例,病情诊断条件与治疗方案。
3.3游戏玩法设计
从功能模块方面可以决定游戏的玩法,玩家通过控制人物移动触碰场景内的物体,根据提示解锁不同的功能,解锁测试功能后,则根据测试的分数判断是否具备解锁查看实际病例的功能。
判断游戏结束的标准有两个,一个是低于初始分,判定为失败;一个是高于设定的值(可修改),判定为游戏通关。
具体的方法实现设计如下:
一,人物移动以及移动动画实现功能:
利用Unity自带方法来监听玩家对键盘的操作,从而控制人物移动;利用Animator控制器,根据游戏内判断人物是否移动,从而改变动作的布尔值来改变人物不同的动画播放。
二,学习功能:
学习功能主要利用Ngui插件来完成界面,通过使用插件内自带的TweenAlpha脚本实现UI界面的动态效果,利用PlayForward方法控制UI显示,利用PlayReverse方法控制UI的隐藏。
三,测试功能:
首先利用SetActive控制测试功能解锁的开关是否在场景内显示,利用activeInHierarchy判断开关是否存在于场景内,若存在则开启测试功能;测试题目则用Random.Range随机方法,在自定义的范围内随机生成一个整数,不同的数字将对应产生不同的题目。
四,职位功能:
此功能是定义游戏进度的一个标准,在后台定义玩家初始分数统一为0,之后通过测试功能改变自己的分数值,获得不同的职位,之后解锁新的功能。
低于初始分数则判断为游戏失败,结束游戏。
3.4本章小结
从宠物模拟医院的功能需求上进行分析,决定了游戏的四大功能模块。
在分析中确定了游戏的主要玩法以及实现功能模块用到的方法。
结合三部分内容得到了本文所研究的游戏的总体方案设计。
第4章游戏设计与实现
4.1场景设计
游戏主要由两个场景组成,一是游戏开始界面,二是游戏主场景,玩家主要在主场景内体验游戏。
场景主要利用Ngui插件、ProBuilder插件和ProGrids插件来完成制作。
4.1.1安装ProBuilder插件与ProGrids插件
打开Unity,点击Window-->PackageManager,找到Probuilder与ProGrids,点击Install下载即可,如图3-1所示。
图3-1Probuilder与ProGrids插件安装
4.1.2配置人物动画
将人物模型chan拖入场景中,创建一个新的animator命名为playercontroller并双击打开动画窗口,将动画wait与walk拖入BaseLayer窗口并连接至图3-2所示。
图3-2动画配置
为了避免人物动作需要播放完后才能切换新的动作,需要点击图3-2白色箭头,然后在Inspector窗口找到HasExitTime,将勾选取消即可。
如图3-3所示。
图3-3
为后续控制人物移动与站立两种状态下的动画切换,需在Parameters里添加两个bool类型的变量,分别命名为wait和walk。
4.1.3人物移动实现
给人物模型分别添加Animator、Rigidbody与CapsuleCollider组件。
为防止人物长时间不动后会倒在地上,需锁定人物模型在x轴与z轴的旋转,在Rigidbody里找到FreezeRotation,将x轴与z轴勾选上即可锁定。
接着在模型下面添加一个新的脚本命名为player。
因为人物移动需要每一帧都检测,因此将函数写入voidUpdate里。
将人物移动速度设置为public,方便直接在unity界面中调整合适速度。
1.using System.Collections;
2.using System.Collections.Generic;
3.using UnityEngine;
4.
5.public class player :
MonoBehaviour
6.{
7. public float speed = 1f;
8.
9. public Animator anime;
10.
11. public bool wait;
12. public bool walk;
13.
14. void Start()
15. {
16. //获取人物动画控件
17. anime = GetComponent();
18. //人物初始为等待状态
19. wait = true;
20. walk = false;
21. }
22. void Update()
23. {
24.
25. float horizontal = Input.GetAxis("Horizontal");
26. float vertical = Input.GetAxis("Vertical");
27. Vector3 direction = new Vector3(horizontal, 0, vertical);
28.
29. if(direction !
= Vector3.zero)
30. {
31. change();
32. walk = true;
33. //角色旋转至指定方向
34. transform.rotation = Quaternion.LookRotation(direction);
35. //角色移动
36. transform.Translate(Vector3.forward * speed * Time.deltaTime);
37. }
38. else
39. {
40. change();
41. wait=true ;
42. }
43. anime.SetBool("walk", walk);
44. anime.SetBool("wait", wait);
45. }
46.
47. //避免出现特殊情况,全部设置为false
48. void change()
49. {
50. wait = false;
51. walk = false;
52. }
53.}
经过调试,当人物移动速度为2.5f时较为合适。
4.1.4设置相机跟随人物移动
相机跟随人物移动是游戏内必不可少的一部分,虽然直接将相机拖入到人物中也可以实现相机跟随,但会因为人物不断改变方向使相机不断抖动造成视觉效果不佳,因此需要在相机里添加一个脚本来控制相机跟随人物移动。
1.public class camerafollow :
MonoBehaviour
2.{
3. public Transform target;
4.
5. public Vector3 offset;
6.
7. void LateUpdate()
8. {
9. transform.position = target.position+offset;
10. }
11.}
将需要被跟随的人物拖入至target中,点击游戏播放,调整offset的值,使相机可以看到完整人物。
4.1.5场景搭建
利用ProBuilder与ProGirds插件,快速制作出学习用书柜、前台、医生办公室、等候室、宠物住院区,并将物体摆放好构建一个简易的宠物医院。
游戏内还需要创建一个空对象命名为GameObject,用于存放大部分控制游戏功能实现的脚本
图3-4简易宠物医院
4.2学习功能实现
学习功能是整个游戏流程的开始,玩家需要通过学习后才可以解锁其他功能。
学习功能同时也能给玩家科普宠物疾病知识。
游戏中将以模拟电子书本的形式展现。
4.2.1学习功能的ui设计
安装好Ngui插件后,上方开始栏会多出一个NGUI选项,点击NGUI-->Open-->WidgetWizard,创建一个新的UI界面,此时层级视图窗口会多出一个UIRoot,切换成2D界面,双击UIRoot,开始编辑。
在Ngui中,由于插件内只能识别Atlas内的图片,如需使用自己绘制的图片,需要将所有非插件内的图片选中,右键-->NGUI-->OpenAtlasMaker,然后把所选图片添加至新创建的Atlas,保存后即可使用。
Simpletexture用于放置图片,Lable用于编辑文字。
Ngui提供了方便快捷的按钮脚本,需要变为按钮的图片或文字,只需在界面内右键-->Attach内添加boxcollider和buttonscript就能实现按钮功能。
给按钮额外添加buttonscale脚本,可以让按钮在鼠标移入移出时有大小变化。
图3-5游戏内学习目录
图3-6游戏内部分学习内容
4.2.2学习功能的事件触发实现
为了模拟生活中生活中需要走到书架前才能拿到书本学习,游戏内设定人物碰到书柜后才能打开学习功能。
当第一次解锁学习功能之后,就可以不再需要跑到书柜面前触碰才能学习,游戏界面左下角会生成一个学习按钮,点开后可直接查看。
因为需要人物触碰才能产生事件,所以需给书架添加boxcollider并设置合适大小。
给书架加入脚本,使用OnCollisionEnter方法来实现。
1.public class study3Dbutton :
MonoBehaviour
2.{
3. //获取书本UI
4. public TweenAlpha dashuben;
5. //获取游戏界面快捷学习按钮
6. public GameObject studybutton;
7.
8. void OnCollisionEnter(Collision collision)
9. {
10. Time.timeScale = 0;
11. dashuben.PlayForward();
12. studybutton.SetActive(true);
13. }
14.}
TweenAlpha是Ngui提供的一种能实现UI隐藏显示的脚本,给附加了此类脚本的物体,之后把脚本取消勾选,将From的值设置为0,texture类还需要把NGUITexture下的ColorTint设置成透明,设置完后就可以用PlayForward与PlayReverse来控制组件显示与隐藏。
代码中使用Time.timeScale方法来防止人物触碰物体后还能继续移动,不断触发打开UI页面的问题。
4.2.3学习内容选择与翻页的功能实现
给所需控制显示隐藏的UI添加TweenAlpha脚本。
学习按钮一开始处于未激活状态,因此需要在voidstart里设置。
1.public class bookUIClick :
MonoBehaviour
2.{
3. //获取整块内容组件
4. public GameObject Q;
5.
6. //获取需控制的学习内容
7. public TweenAlpha neirong;
8. public TweenAlpha mulu;
9. public TweenAlpha q1;
10. public TweenAlpha q2;
11. public TweenAlpha dashuben;
12.
13. public GameObject studybutton;
14.
15. void Start()
16. {
17. //初始学习UI处于隐藏状态
18. studybutton.SetActive(false);
19. }
20.
21. //点击打开书本
22. public void OnClickOpenBook()
23. {
24. Time.timeScale = 0;
25. dashuben.PlayForward();
26. }
27.
28. //关闭书本
29. public void OnClickClose()
30. {
31. dashuben.PlayReverse();
32. Close();
33. mulu.PlayForward();
34. Time.timeScale = 1;
35. }
36. //返回目录
37. public void OnClickReturn()
38. {
39. mulu.PlayForward();
40. Close();
41. }
42. //打开第一条知识
43. public void OnClickQ1()
44. {
45. Open();
46. ReturnOpen();
47. GameObject childQ1 = Q.