首页 > 分享 > 基于Unity3D的宠物医院模拟游戏的设计与实现

基于Unity3D的宠物医院模拟游戏的设计与实现

摘要随着生活水平的不断提高与科技的发展,人们开始不满足于物质上的需求,饲养猫狗人数大幅度增长。可在饲养过程中难免会遇到各种各样的问题。当今社会,玩游戏又成了人们的主要娱乐与消遣方式。模拟类科普游戏可以让人们在消磨时间的同时学习到知识,虽然不能完全代替传统的正规教育,但仍然可以起到教育的作用。Unity3D作为一款既能开发2D又能3D游戏、且可部署到多个主流平台内的软件,是一款被较多开发者使用的游戏开发引擎。而市面上暂时还没有发现有关科普宠物疾病类的游戏,本论文研究宠物医院模拟游戏开发,不是单纯为了娱乐,更重要的是为了能够给更多的人通过玩游戏了解到宠物疾病相关知识。本文主要描述了利用Ngui插件对游戏的流程设计与功能实现,为后续开发同类游戏的开发者提供思路参考。关键词:Unity3D宠物医院模拟游戏

AbstractWiththecontinuousimprovementoflivingstandardsandthedevelopmentoftechnology,peoplearenotsatisfiedwiththematerialneeds,andthenumberofcatsanddogshasincreasedsignificantly.Itisinevitablethatvariousproblemswillbeencounteredduringthefeedingprocess.Intoday'ssociety,playinggameshasbecomethemainwayofentertainmentandrecreation.Simulationsciencegamesallowpeopletolearnknowledgewhilekillingtime.Althoughtheycannotcompletelyreplacetraditionalformaleducation,theycanstillplayaneducationalrole.Unity3d,asasoftwarethatcandevelop2Dand3Dgamesandcanbedeployedinmultiplemainstreamplatforms,isagamedevelopmentengineusedbymoredevelopers.However,thereisnogameaboutpetdiseaseinscienceonthemarket.Theresearchonthesimulationofpethospitalsinthispaperisnotjustforentertainment,butmoreimportantlytogivemorepeopletheknowledgeofpetdiseasesbyplayinggames.Thisarticlemainlydescribestheprocessdesignandfunctionimplementationofthegame,andprovidesideasfordeveloperswhodevelopsimilargamesinthefuture.Keyword:Unity3DPetHospitalSimulationgame

目录TOCo"1-4"hzt"参考文献,1"第1章绪论绪论选题的目的和意义宠物,就像我们的亲人、伙伴一样,有一只宠物陪伴在身边,可以缓解人们的孤独感、寂寞感。随着人们物质生活水品的不断提高,越来越多的人开始饲养起了宠物。然而,宠物跟人类一样,也有各种各样的疾病发生,但治疗方案却跟人类完全不同,而许多宠物饲养人员并不能很清楚地了解宠物疾病给宠物带来地危害,也不了解如何预防疾病,让许多宠物就此丧失生命,同时也给饲主带来精神上的痛苦。当今社会,玩游戏成了人们的主要娱乐与消遣方式。而如今,游戏已经不再属于玩物丧志的范畴,模拟类科普游戏可以让人们在消磨时间的同时学习到知识,虽然不能完全代替传统的正规教育,但仍然可以起到教育的作用,可谓放松与学习两不误。本选题的研究目的是为了让人们能够在游戏中更容易更方便地了解到宠物疾病知识,以测试的形式来巩固人们对宠物健康知识的记忆,从而更好的照顾自家的宠物,让自家宠物远离病痛。国内外研究现状目前国内在科普宠物疾病方面有哔哩哔哩出品的首档医疗观察类真人秀《宠物医院》,此节目有科普一些常见的疾病预防等。在游戏方面是娱乐休闲游戏,不具备知识传播功能,还有一些是针对人类疾病而设定的,而在国外的《模拟人生》系列的游戏中,虽有宠物医院的设定,但只能让玩家去简单的经营,而不能让玩家学习到有关宠物疾病的相关知识。因此研究一款宠物医院模拟科普类游戏是很有必要的。论文结构概述本文主要分为六个部分:第一部分:绪论,主要阐述毕业设计选题的目的与研究意义、国内外研究现状以及本文的结构介绍;第二部分:介绍了开发游戏所用到的工具与插件介绍;第三部分:详细描述了游戏内的需求与设计;第四部分:详细描述了游戏内各个功能的制作与实现;第五部分:游戏的UI界面设计、描述游戏的整合与导出并进行测试;第六部分:总结游戏内的不足与今后的改进。

开发工具介绍Unity3D介绍Unity3D是一款由UnityTechnologies所研发的跨平台2D/3D游戏引擎,开发的游戏可以部署到多个主流平台,如常见的:Windows、MacOS、Android与iOS。除游戏开发外还可以实现视频制作,其对模型资源的兼容性高,多个主流建模软件生成的模型均可以在Unity3D中完美导入,并可以在原模型修改后自动更新。Unity3D给用户提供了可视化操作界面,利用内置插件,可以让新手短时间内熟悉并开发出游戏原型。Unity3D主要支持三种语言:C#、UnityScript(多被称为“Javascript”)和BOO。Unity2017.2测试版后的版本在新建中已经不再包含Javascript选项,但仍然支持使用,需在Unity编辑器外创建再导入。ProBuilder插件介绍ProBuilder插件是一款Unity2018.1版本以上自带的官方建模插件,Unity2017.x版本可以直接在AssetStore下载使用。此插件是3D建模和关卡设计工具的独特组合,为构建简单的几何体进行了操作优化处理,但也可以进行详细的编辑和UV展开。使用ProBuilder可以快速构建结构复杂的地形、车轮和武器的原型,或制作自定义碰撞几何体。主要特点有:动态用户界面、挤出插入功能、建立多边形功能、多种规则形状和着色等。ProGrids插件介绍ProGrids插件可以为我们提供视觉和功能上的网格,它们可以使所有操作都在三个轴上对齐。Probuilder结合ProGrids使用可以提高建模速度,使构建的几何体构造更为精准。Ngui插件介绍Ngui是一个功能强大的UI系统和Unity的事件通知框架,均使用C#编写,并严格遵循KISS原则。它具有简洁的代码和极简的方法。许多behaviour类都保持在两百行代码以下。该插件全面支持ios、Android、Blackberry、win8、wp8、flash。使用Ngui就像使用Unity,将现成的控件(例如按钮,复选框,滚动条和其他控件)拖放到场景视图中,或者使用类似于Lego的方法制作自己的控件。将控件另存为预设体,即可在任何地方重复使用。

游戏需求分析科普类游戏的需求分析随着科学教育类电子游戏的发展以及教育理念的日新月异,科学教育类电子游戏已经被视为科学教育的一个非主流的形式[8]。在如今电子游戏行业迅速的发展的时代下,科普类游戏较于一般游戏来讲,其主要以普及科学知识为主,娱乐为次,在家长眼里不会被认为是玩物丧志的游戏,得到了广大家长们的认可,游戏不局限于青少年,不同年龄层次的用户均能体验游戏。游戏功能需求分析目前饲养宠物陪伴自己生活的人越来越多,功课有时候做的不够到位,宠物发生状况时不正当的处理方式导致问题更为严重。游戏内最主要的是给人们普及疾病相关知识与处理知识。因此宠物医院模拟游戏较为重要的功能有以下几个:第一,游戏内玩家将模拟刚毕业到宠物医院工作的见习助理,根据自己的能力不断成长,提升自己的职位。第二,学习功能。玩家主要通过学习功能来获取宠物疾病的理论知识,也仅限于理论知识,模拟现实生活中医生需要在空闲时间额外看书学习的行为。第三,测试功能。这个功能是模拟医院内的考核制度。主要考察书本内的理论知识。为了能够重复玩家的记忆,答卷采用随机出题的形式展示,通过随机来出现重复的题目,巩固玩家在游戏内学到的知识。第四,查看实际病例功能。病例功能主要是让玩家学习到除了书本理论知识外的知识内容。主要记录宠物真实病情案例,病情诊断条件与治疗方案。游戏玩法设计从功能模块方面可以决定游戏的玩法,玩家通过控制人物移动触碰场景内的物体,根据提示解锁不同的功能,解锁测试功能后,则根据测试的分数判断是否具备解锁查看实际病例的功能。判断游戏结束的标准有两个,一个是低于初始分,判定为失败;一个是高于设定的值(可修改),判定为游戏通关。具体的方法实现设计如下:一,人物移动以及移动动画实现功能:利用Unity自带方法来监听玩家对键盘的操作,从而控制人物移动;利用Animator控制器,根据游戏内判断人物是否移动,从而改变动作的布尔值来改变人物不同的动画播放。二,学习功能:学习功能主要利用Ngui插件来完成界面,通过使用插件内自带的TweenAlpha脚本实现UI界面的动态效果,利用PlayForward方法控制UI显示,利用PlayReverse方法控制UI的隐藏。三,测试功能:首先利用SetActive控制测试功能解锁的开关是否在场景内显示,利用activeInHierarchy判断开关是否存在于场景内,若存在则开启测试功能;测试题目则用Random.Range随机方法,在自定义的范围内随机生成一个整数,不同的数字将对应产生不同的题目。四,职位功能:此功能是定义游戏进度的一个标准,在后台定义玩家初始分数统一为0,之后通过测试功能改变自己的分数值,获得不同的职位,之后解锁新的功能。低于初始分数则判断为游戏失败,结束游戏。本章小结从宠物模拟医院的功能需求上进行分析,决定了游戏的四大功能模块。在分析中确定了游戏的主要玩法以及实现功能模块用到的方法。结合三部分内容得到了本文所研究的游戏的总体方案设计。游戏设计与实现场景设计游戏主要由两个场景组成,一是游戏开始界面,二是游戏主场景,玩家主要在主场景内体验游戏。场景主要利用Ngui插件、ProBuilder插件和ProGrids插件来完成制作。安装ProBuilder插件与ProGrids插件打开Unity,点击Window-->PackageManager,找到Probuilder与ProGrids,点击Install下载即可,如图3-1所示。图3-1Probuilder与ProGrids插件安装配置人物动画将人物模型chan拖入场景中,创建一个新的animator命名为playercontroller并双击打开动画窗口,将动画wait与walk拖入BaseLayer窗口并连接至图3-2所示。图3-2动画配置为了避免人物动作需要播放完后才能切换新的动作,需要点击图3-2白色箭头,然后在Inspector窗口找到HasExitTime,将勾选取消即可。如图3-3所示。图3-3为后续控制人物移动与站立两种状态下的动画切换,需在Parameters里添加两个bool类型的变量,分别命名为wait和walk。人物移动实现给人物模型分别添加Animator、Rigidbody与CapsuleCollider组件。为防止人物长时间不动后会倒在地上,需锁定人物模型在x轴与z轴的旋转,在Rigidbody里找到FreezeRotation,将x轴与z轴勾选上即可锁定。接着在模型下面添加一个新的脚本命名为player。因为人物移动需要每一帧都检测,因此将函数写入voidUpdate里。将人物移动速度设置为public,方便直接在unity界面中调整合适速度。using

System.Collections;

using

System.Collections.Generic;

using

UnityEngine;

public

class

player

:

MonoBehaviour

{

public

float

speed

=

1f;

public

Animator

anime;

public

bool

wait;

public

bool

walk;

void

Start()

{

//获取人物动画控件

anime

=

GetComponent<Animator>();

//人物初始为等待状态

wait

=

true;

walk

=

false;

}

void

Update()

{

float

horizontal

=

Input.GetAxis("Horizontal");

float

vertical

=

Input.GetAxis("Vertical");

Vector3

direction

=

new

Vector3(horizontal,

0,

vertical);

if(direction

!=

Vector3.zero)

{

change();

walk

=

true;

//角色旋转至指定方向

transform.rotation

=

Quaternion.LookRotation(direction);

//角色移动

transform.Translate(Vector3.forward

*

speed

*

Time.deltaTime);

}

else

{

change();

wait=true

;

}

anime.SetBool("walk",

walk);

anime.SetBool("wait",

wait);

}

//避免出现特殊情况,全部设置为false

void

change()

{

wait

=

false;

walk

=

false;

}

}

经过调试,当人物移动速度为2.5f时较为合适。设置相机跟随人物移动相机跟随人物移动是游戏内必不可少的一部分,虽然直接将相机拖入到人物中也可以实现相机跟随,但会因为人物不断改变方向使相机不断抖动造成视觉效果不佳,因此需要在相机里添加一个脚本来控制相机跟随人物移动。public

class

camerafollow

:

MonoBehaviour

{

public

Transform

target;

public

Vector3

offset;

void

LateUpdate()

{

transform.position

=

target.position+offset;

}

}将需要被跟随的人物拖入至target中,点击游戏播放,调整offset的值,使相机可以看到完整人物。场景搭建利用ProBuilder与ProGirds插件,快速制作出学习用书柜、前台、医生办公室、等候室、宠物住院区,并将物体摆放好构建一个简易的宠物医院。游戏内还需要创建一个空对象命名为GameObject,用于存放大部分控制游戏功能实现的脚本图3-4简易宠物医院学习功能实现学习功能是整个游戏流程的开始,玩家需要通过学习后才可以解锁其他功能。学习功能同时也能给玩家科普宠物疾病知识。游戏中将以模拟电子书本的形式展现。学习功能的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游戏内部分学习内容学习功能的事件触发实现为了模拟生活中生活中需要走到书架前才能拿到书本学习,游戏内设定人物碰到书柜后才能打开学习功能。当第一次解锁学习功能之后,就可以不再需要跑到书柜面前触碰才能学习,游戏界面左下角会生成一个学习按钮,点开后可直接查看。因为需要人物触碰才能产生事件,所以需给书架添加boxcollider并设置合适大小。给书架加入脚本,使用OnCollisionEnter方法来实现。public

class

study3Dbutton

:

MonoBehaviour

{

//获取书本UI

public

TweenAlpha

dashuben;

//获取游戏界面快捷学习按钮

public

GameObject

studybutton;

void

OnCollisionEnter(Collision

collision)

{

Time.timeScale

=

0;

dashuben.PlayForward();

studybutton.SetActive(true);

}

}TweenAlpha是Ngui提供的一种能实现UI隐藏显示的脚本,给附加了此类脚本的物体,之后把脚本取消勾选,将From的值设置为0,texture类还需要把NGUITexture下的ColorTint设置成透明,设置完后就可以用PlayForward与PlayReverse来控制组件显示与隐藏。代码中使用Time.timeScale方法来防止人物触碰物体后还能继续移动,不断触发打开UI页面的问题。学习内容选择与翻页的功能实现给所需控制显示隐藏的UI添加TweenAlpha脚本。学习按钮一开始处于未激活状态,因此需要在voidstart里设置。public

class

bookUIClick

:

MonoBehaviour

{

//获取整块内容组件

public

GameObject

Q;

//获取需控制的学习内容

public

TweenAlpha

neirong;

public

TweenAlpha

mulu;

public

TweenAlpha

q1;

public

TweenAlpha

q2;

public

TweenAlpha

dashuben;

public

GameObject

studybutton;

void

Start()

{

//初始学习UI处于隐藏状态

studybutton.SetActive(false);

}

//点击打开书本

public

void

OnClickOpenBook()

{

Time.timeScale

=

0;

dashuben.PlayForward();

}

//关闭书本

public

void

OnClickClose()

{

dashuben.PlayReverse();

Close();

mulu.PlayForward();

Time.timeScale

=

1;

}

//返回目录

public

void

OnClickReturn()

{

mulu.PlayForward();

Close();

}

//打开第一条知识

public

void

OnClickQ1()

{

Open();

ReturnOpen();

GameObject

childQ1

=

Q.transform.Find("猫艾滋").gameObject;

childQ1.SetActive(true);

mulu.PlayReverse();

q1.PlayForward();

}

//打开第二条知识

public

void

OnClickQ2()

{

Open();

ReturnOpen();

GameObject

childQ2

=

Q.transform.Find("冠状病毒").gameObject;

childQ2.SetActive(true);

mulu.PlayReverse();

q2.PlayForward();

}

//打开内容界面

void

Open()

{

neirong.PlayForward();

}

//关闭内容界面

void

Close()

{

neirong.PlayReverse();

//防止返回后打开新的知识后有上次查看知识的文字残影

for

(int

i

=

0;

i

<

Q.transform.childCount;

i++)

{

GameObject

childQ

=

Q.transform.GetChild(i).gameObject;

childQ.SetActive(false);

}

}

//显示返回按钮

void

ReturnOpen()

{

GameObject

childReturn

=

Q.transform.Find("返回").gameObject;

childReturn.SetActive(true);

}

}

为了方便操作,每一块知识都集合在同一个物体里面,使用GamObject.childReturn方法可以搜寻到物体下面的子物体。职位功能设计职位是判断玩家游戏内进度的一部分,不同的职位可以解锁不同的功能。游戏内一共设置了三个职位,分别是:“见习助理”、“见习医生”和“院长”。内置分数可以改变职位,主要通过答题测试来改变分数,若玩家分数低于0则结束游戏;若玩家达到见习医生则可以解锁新功能。答题测试功能实现测试界面ui界面设计与学习界面ui设计一样使用Ngui插件实现。图3-7部分测试题目界面测试功能触发条件实现游戏内,在医生办公室中有一位npc,玩家需要通过解锁学习功能后并寻找到医生才能解锁测试功能。游戏开始时如没有解锁学习功能,则会被拒绝进入。解锁学习功能后可以进入办公室,接触到npc后会询问是否开启测试功能。需要用到两个collider来分别控制这两个事件的发生,这两个collider分别放在办公室门前与办公桌的位置。图3-8两个collider位置摆放接着在UI界面制作两个界面,一个用来提示玩家没有解锁学习功能,一个用来询问是否开启测试功能。如图3-9所示。图3-9npc提示检测玩家是否解锁学习功能,若未解锁弹出npc对话提示;若解锁该功能后则销毁此collider,功能实现具体代码如下:public

class

bangongshi

:

MonoBehaviour

{

public

TweenAlpha

tip1;

public

GameObject

onoff;

public

GameObject

study;

void

Start()

{

//游戏开始时不显示提示

tip1.PlayReverse();

}

void

OnCollisionEnter(Collision

collision)

{

//判断玩家是否解锁了快捷学习按钮

if

(study.activeInHierarchy)

{

Destroy(onoff);

}

else{

Time.timeScale

=

0;

tip1.PlayForward();

}

}

}

学习功能解锁后玩家接触npc则弹出询问是否开启测试对话框,若玩家开启后则在3秒后在界面右下角弹出测试功能按钮,延迟弹出测试按钮利用Invock方法来实现;若玩家选择不开启,则消失对话框,无法解锁游戏进度,再次触碰npc后再次解锁对话。public

class

say

:

MonoBehaviour

{

public

TweenAlpha

tip1;

public

TweenAlpha

tip2;

public

GameObject

testtip;

public

GameObject

Tbutton;

//开始游戏无法测试、学习按钮需在游戏中激活

void

Start()

{

Tbutton.SetActive(false);

}

//玩家未解锁学习功能时,点击关闭对话框

public

void

OnClickCloseTip()

{

tip1.PlayReverse();

Time.timeScale

=

1;

}

//点击后延迟3秒后开启测试按钮并销毁collider

public

void

OnClickOpenTest()

{

tip2.PlayReverse();

Time.timeScale

=

1;

Destroy(testtip);

Invoke("Yanshi",

3f);

}

//点击关闭对话框,不解锁测试功能

public

void

OnClickCloseTip2()

{

tip2.PlayReverse();

Time.timeScale

=

1;

}

//游戏界面显示测试按钮

void

Yanshi()

{

Tbutton.SetActive(true);

}

}

测试功能设计玩家在做测试题目的时候,题目是随机抽取的,答对得分,答错则扣分,随机可以抽取到相同的题目,可以巩固玩家所学习的知识。这里可以采用Random.Range随机方法来随机生成一个数,通过不同的数对应不同的题目来实现随机出现题目功能。为了防止玩家可以一直点击测试答题来提早结束游戏,游戏内的随机里设置了空题的数,既玩家点击测试后随机抽取的数中,有部分是会抽到没有题目的测试。出现的题目点击后就会消失,不管是否答题,答对或答错,都会在关闭试题后一段时间内不出现测试按钮,这里则采用Invoke方法可以实现。查看病例功能实现查看病例是玩家另外一种获得知识的途径,与书本内容不同,病例主要是为了模拟现实生活中,医生所学到的知识结合宠物症状来判断具体症状。这个功能需要玩家达到“见习医生”的条件后才可以解锁,若中途玩家的分数掉回“见习医生”以下,则会暂时关闭此功能。游戏内第一次达到“见习医生”后会给出提示,之后再次达到此条件则无提示。病例ui设计游戏内病例UI设计与测试UI设计相同,只需利用Ngui搭建完即可。图3-10未达到解锁功能条件提示触发病例条件设计游戏内如果玩家没有达到相应条件,触碰到NPC后,则会弹出“你还不是见习医生,请学习做题提高分数”提示,条件满足后直接显示病例UI,因此需要创建两个空对象,添加collider后来控制两个不同条件的显示。游戏内需要判断玩家是否达到条件以及是否第一次解锁病例功能,因此我们还需要两个额外的空对象,一个负责检测返家是否达到条件,若达成,则在场景内显示可弹出病例UI的collider,若未达成则在场景内显示未达成条件的collider。这部分代码需要写在控制分数的脚本内实现,具体实现代码会在下一节展示。游戏内分数系统实现游戏内分数是控制游戏进度的核心,通过分数来获取不同职位,分数达到一定值可以结束游戏,同时分数也控制着玩家是否能够解锁其他功能。只有答题可以改变分数值,利用随机函数出题,玩家答题答错则扣除一分,答对则获得一分。以下是实现随机出题与玩家答题后改变分数的代码:public

class

ceshi

:

MonoBehaviour

{

//定义随机数与总分

int

num;

int

newNum;

int

zongfen;

public

GameObject

T;

public

GameObject

Tbutton;

public

TweenAlpha

test;

public

TweenAlpha

test1;

public

TweenAlpha

test2;

public

TweenAlpha

test3;

public

TweenAlpha

NULL;

public

GameObject

wrong;

public

GameObject

right;

//随机生成数字,产生随机题目

void

suiji()

{

num

=

Random.Range(1,

5);

newNum

=

num;

//用于后台观察随机数

print("数:"

+

newNum);

}

//点击打开测试

public

void

OnClickOpenTest()

{

Time.timeScale

=

0;

suiji();

closetest();

openReturn();

//根据随机的数字决定给玩家展示出题目

if

(newNum

==

3)

{

opentest();

GameObject

childTest3

=

T.transform.Find("试题3").gameObject;

childTest3.SetActive(true);

test3.PlayForward();

}else

if

(newNum

==

2)

{

opentest();

GameObject

childTest2

=

T.transform.Find("试题2").gameObject;

childTest2.SetActive(true);

test2.PlayForward();

}else

if

(newNum

==

1)

{

opentest();

GameObject

childTest1

=

T.transform.Find("试题1").gameObject;

childTest1.SetActive(true);

test1.PlayForward();

}

else

{

opentest();

GameObject

childNull

=

T.transform.Find("暂无试题").gameObject;

childNull.SetActive(true);

NULL.PlayForward();

}

Time.timeScale

=

0;

}

//点击关闭测试,并更新分数(更新分数函数在脚本touxian里)

public

void

OnClickCloseTest()

{

close();

Time.timeScale

=

1;

closetest();

GameObject.Find("GameObject").SendMessage("UpdateTouxian");

Tbutton.SetActive(false);

Invoke("Yanshi",

20f);

}

//返回按钮显现

void

openReturn()

{

GameObject

childReturn

=

T.transform.Find("返回").gameObject;

childReturn.SetActive(true);

}

void

opentest()

{

test.PlayForward();

}

//关闭测试并隐藏所有测试有关的父子组件

void

closetest()

{

test.PlayReverse();

for

(int

i

=

0;

i

<

T.transform.childCount;

i++)

{

GameObject

childTest

=

T.transform.GetChild(i).gameObject;

childTest.SetActive(false);

}

}

//关闭选择答案后的正误提示

void

close()

{

wrong.SetActive(false);

right.SetActive(false);

}

void

Yanshi()

{

Tbutton.SetActive(true);

}

}职位改变判断条件、获得“见习医生”称号后解锁查看病例条件、判断玩家是否第一次解锁新功能与游戏失败、胜利条件的实现代码如下:public

class

touxian

:

MonoBehaviour

{

public

GameObject

wrong;

public

GameObject

right;

public

GameObject

fenshupanduan;

public

GameObject

kanbing1;//解锁看病例功能

public

GameObject

kanbing2;//关闭看病例功能

public

TweenAlpha

a;

public

TweenAlpha

b;

public

TweenAlpha

c;

public

TweenAlpha

lose;

public

TweenAlpha

win;

public

TweenAlpha

tip3;

public

GameObject

tishi3;

//为方便修改获得不同职位的分数,将变量定义成public

public

int

Zongfen

=

0;

public

int

Afen

=

2;

public

int

Bfen

=

3;

public

int

Cfen

=

5;

void

Start()

{

Debug.Log("分数:"

+

Zongfen);

wrong.SetActive(false);

right.SetActive(false);

tishi3.SetActive(true);

fenshupanduan.SetActive(true);

kanbing1.SetActive(false);

kanbing2.SetActive(false);

UpdateTouxian();

}

//题目答对加一分后更新总分数

public

void

OnClickRight()

{

right.SetActive(true);

Zongfen

+=

1;

print("更新分数"

+

Zongfen);

}

//题目答错扣一分后更新分数

public

void

OnClickWrong()

{

wrong.SetActive(true);

Zongfen

-=

1;

print("更新分数"

+

Zongfen);

}

public

void

UpdateTouxian()

{

//若玩家总分数小于0则执行游戏失败画面

if

(Zongfen

<

0)

{

lose.PlayForward();

}

//若玩家总分数大于游戏内设定胜利分数值则执行游戏胜利画面

else

if

(Zongfen

>

Cfen)

{

win.PlayForward();

}

//第一个职位获得条件

else

if

(Zongfen

>=

0

&&

Zongfen

<

Afen)

{

fenshupanduan.SetActive(false);

a.PlayForward();

b.PlayReverse();

c.PlayReverse();

}

//第二个职位获得条件

else

if

(Zongfen

>=

Afen

&&

Zongfen

<

Bfen)

{

fenshupanduan.SetActive(true);

opentip3();

a.PlayReverse();

b.PlayForward();

c.PlayReverse();

}

//第三个职位获得条件

else

{

fenshupanduan.SetActive(true);

a.PlayReverse();

b.PlayReverse();

c.PlayForward();

}

}

//判断分数是否可以解锁看病功能

void

kanbing()

{

if

(fenshupanduan.activeInHierarchy)

{

kanbing1.SetActive(true);

kanbing2.SetActive(false);

}

else

{

kanbing2.SetActive(true);

kanbing1.SetActive(false);

}

}

//当分数到达第二个头衔获得的条件后验证是否第一次激活功能

void

opentip3()

{

if

(Zongfen

>=

Afen

&&

Zongfen

<

Bfen)

{

if

(tishi3.activeInHierarchy)

{

tip3.PlayForward();

}

else

{

print("非第一次激活物体");

}

}

else

{

print("分数不够");

}

}

//实时判断玩家的分数状态是否可以解锁查看病例

void

Update()

{

kanbing();

}

}游戏开始界面设计游戏开始界面设计利用Ngui插件,给开始界面添加三个Label分别命名为“开始游戏”、“游戏说明”和“退出游戏”,之后分别添加boxcollider组件、button脚本与buttonscal脚本。需给游戏说明内容创建一块InvisibleWidget并设为锁定左下角位置防止不同分辨率下导致字体移位问题。图4-1游戏开始界面开始界面按钮代码实现游戏内开始游戏涉及场景跳转,需要导入unity内SceneManagement的包。游戏结束则用Application.Quit方法实现。using

System.Collections;

using

System.Collections.Generic;

using

UnityEngine;

using

UnityEngine.SceneManagement;

public

class

gamestart

:

MonoBehaviour

{

public

TweenAlpha

shuoming;

public

void

OnClickStart()

{

SceneManager.LoadScene("game");

}

public

void

OnClickOpenShuoming()

{

shuoming.PlayForward();

}

public

void

OnClickQuit()

{

Application.Quit();

}

public

void

OnClickReturen()

{

shuoming.PlayReverse();

}

}游戏整合与导出游戏内一共两个场景,需要将两个场景整合在一起才可以实现场景跳转。两个场景都需要执行如下操作,点击File-->BuildSettings,将第一个场景调整至第一位,之后点击AddOpenScenes。最后点击Build,保存游戏。图4-2整合游戏并导出

游戏测试打开游戏项目,点击开始游戏,开始进行测试。经过测试,游戏首页点击“游戏说明”可以正常弹出游戏说明界面,点击返回后正常关闭,可重复打开与关闭。图6-1正常打开游戏说明界面点击开始游戏,游戏正常跳转到主界面,可以正常控制角色,长时间站立人物模型不会倒下。首次进入游戏不会弹出学习快捷按键。图6-2游戏初始界面未开启学习功能时,无法进入医生办公室,正常弹出提示框,如图6-3所示。图6-3未开启学习功能前拒绝进入医生办公室玩家触碰书柜获得学习所用的书本后,左下角正常激活学习快捷键,能正常选择阅读内容,正常翻页,正常关闭页面,再次打开时不会出现文字重影。图6-4游戏内部分阅读内容学习功能激活后再次进入医生办公室,可以正常提示玩家是否开启测试功能。开启测试功能后能正常显示“考试按钮”。图6-5正常提示是否开启测试图6-6右下角正常显示考试按钮测试功能正常随机抛出试卷。答题后正常更新内置分数。图6-7后台正常显示随机数与更新后分数游戏内职位未达标时触碰NPC能正常锁定查看病例功能,到达要求时正常解锁。6-8未解锁查看病例图6-9正常解锁查看病例功能降职后,游戏内正常锁定查看病例功能,再次达到职位要求后不再出现提示。图6-10后台正常检测游戏内是否第一次激活病例功能当游戏低于0分后,正常弹出游戏结束页面。图6-11游戏正常结束界面图6-12游戏结束时玩家总分后台提示总结本次基于Unity3D宠物医院模拟游戏的完成,也意味着大学四年的生涯即将结束。在游戏制作过程中,虽然参考文献较少,在游戏玩法上设计比较困难,但通过网络不断搜寻资料,参考别人解决问题的方案,遇到不懂的问题询问同学与网友。在综合不同处理方式的过程中,使我收获颇多。编辑代码是我的薄弱处,经过这次设计,我对Unity3D开发特别是插件的使用变得更加熟练了,同时也更清楚地了解到C#脚本里代码的执行顺序,了解到函数是怎样运行的,对自己处理代码的能力也有了一定的提高。虽然游戏已经完成,但还是有些许不足之处:1.由于没有系统学习过建模与美术,网上也较难找到资源,因此搭建的场景较为简陋,UI设计较为简朴;2.游戏内容设计到一些宠物医学上的知识,无法提供到大量的学习与测试题目资料,只能完成基本的功能;3.由于自己在代码方面能力不够强,游戏内的功能实现基本靠运用插件和一些逻辑代码来实现,游戏内容较为枯燥;4.目前市场上主流的是手机游戏,由于学习Unity的时间不够长,只能做出简易的电脑版。此次毕设的开发过程中遇到的一些问题,将会是我以后努力学习的方向与目标。在今后的日子里,我会继续学习,尝试完善内容和优化游戏界面,争取在未来做出功能全面,周期较长的游戏。

参考文献[1]UnityTechnologies.unity官方案例精讲[M].中国铁道出版社,2015.[2]刘佳力.基于Unity3D的儿童安全教育游戏的研究与实现[D].四川师范大学,2015[3]段薛孔,李潼,朱旭东,吴兰.Unity3D游戏场景中人物角色动画的设计.安徽:电脑知识与技术期刊,2019.15-9[4]程彬彬,王明鑫,商楠.浅谈游戏开发平台Unity3D的应用与发展前景.辽宁沈阳:沈阳理工大学,110159[5]李兵川.基于Unity3D游戏开发流程分析.重庆:重庆科创职业学院,402160[6]UnityTechnology.Unity4.x从入门到精通[M].中铁出版社,2013[7]王同娟.基于Unity3D的教育游戏开发研究[J].电脑编程技巧

与维护,2018(11):7.[8]杜文馨.科普游戏兴奋点研究及其对科学教育的启示[D].西南大学,2018[9]吴亚峰,

于复兴.

Unity3D

游戏开发技术详解与典型案例.

北京:

人民邮电出版社,

2000:

56-59[10]程明智.Unity游戏开发技术.北京:国防工业出版社,2012:279-318

致谢随着毕业设计的完成,我为期四年的大学生活也即将结束。我在此特别感谢我的指导老师杨超,对我完成毕业论文提出了许多宝贵的意见与建议,才使我的毕业设计得以顺利完成。除此之外还感谢网上提供资源的网友们,使我学习到更多关于Unity开发的知识,同时也给予了我在游戏设计上遇到的问题的解决思路。衷心地感谢我的母校和在母校教育过我的老师,感谢他们授予我知识,充实了我大学四年的生活。感谢我的家人,对我无微不至的关照和对我在学业上的支持。最后,衷心地感谢参与本文评阅和答辩的老师们。

电脑无法识别U盘该怎么办HYPERLINK电脑无法识别U盘怎么办?打开我的电脑上单击右键,在快捷菜单里,选择“管理”,打开“计算机管理”窗口。在计算机管理窗口里,选择“存储”下面的“磁盘管理”,如果看得到没有盘符的U盘,那么在这个U盘上按鼠标右键,选择“更改驱动器名称和路径”选项,就打开了“更改……的驱动器号和路径”对话框。再点击“更改”按钮,打开“更改驱动器号和路径”的对话框,在“指定以下驱动器号”的右边下拉列表里,选择你希望分配给U盘的驱动器号,尽可能靠后选择,比如X、Y、Z,选择好后,单击确定按钮,回到上一次“更改……的驱动器号和路径”对话框窗口,再一次单击确定,就回到“计算机管理”窗口。至此,如果一切正常,就给U盘单独设置了一个长久使用的驱动器号,并却,不受虚拟驱动器的影响了。建议将U盘插到电脑上,看任务栏中是否显示图标,如果显示,在我的电脑点右键查看属性——高级——硬件——设备管理器——查看里面是否有问号的设备,在问号设备上点右键——更新驱动程序然后下一步——否暂时不连接到网络——下一步自动安装软件(推荐)就可以了另外:系统不认U盘的几种处理方法1.禁用主板usb设备。管理员在CMOS设置里将USB设备禁用,并且设置BIOS密码,这样U盘插到电脑上以后,电脑也不会识别。这种方法有它的局限性,就是不仅禁用了U盘,同时也禁用了其他的usb设备,比如usb鼠标,usb光驱等。所以这种方法管理员一般不会用,除非这台电脑非常重要,值得他舍弃掉整个usb总线的功能。但是这种屏蔽也可以破解,即便设置了密码。整个BIOS设置都存放在CMOS芯片里,而COMS的记忆作用是靠主板上的一个电容供电的。电容的电来源于主板电池,所以,只要把主板电池卸下来,用一根导线将原来装电池的地方正负极短接,瞬间就能清空整个CMOS设置,包括BIOS的密码。随后只需安回电池,自己重新设置一下CMOS,就可以使用usb设备了。(当然,这需要打开机箱,一般众目睽睽之下不大适用~~)2.修改注册表项,禁用usb移动存储设备。打开注册表文件,依次展开"HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesusbehci”双击右面的“Start”键,把编辑窗口中的“数值数据”改为“4”,把基数选择为“十六进制”就可以了。改好后注销一下就可以看见效果了。为了防止别人用相同的方法来破解,我们可以删除或者改名注册表编辑器程序。提示:“Start”这个键是USB设备的工作开关,默认设置为“3”表示手动,“2”是表示自动,“4”是表示停用。3.在computermanagement里将removablestorage的使用权限禁止。computermanagement是一个windows管理组件,可以在控制面板——管理工具——计算机管理打开。在该工具窗口中storage——removablestorage——property中,general项,可以控制系统托盘是否显示security则可以管理移动存储设备的使用权限。在security中将普通用户的使用权限降低,就可以达到禁用u盘的目的。破解的方法也很简单,管理员降低普通用户移动存储设备的使用权限,但未必禁用computermanagement的使用权限。普通用户可以通过这个工具解除usb移动存储设备的使用权限限制。另外,值得一提的是,如果u盘插到电脑上后可以驱动,但是我的电脑里却没有盘符,很有可能是管理员改动了u盘的默认盘符,使得我的电脑不能识别。这种情况,可以在movablestorage中看到u盘驱动器。可以在u盘驱动器属性设置里为u盘重新分配一个盘符,再重新插拔一次u盘,就可以在我的电脑里看到u盘的盘符了。一、首先可以将该U盘换到别的机器上,看使用是否正常。如果排除了硬件损坏的可能,一般就是软件方面有问题。在WindowsXP+SP1操作系统下,有些USB2.0设备的确常常出现工作不稳定的问题,可以试试安装设备自带的USB2.0驱动程序。另外最好不要使用USB延长线,防止因为供电不足而造成不稳定现象。如果仍无效,可以在主板BIOS设定中,将USB接口强行设置为USB1.1传输速率。二、(适用于WIN98)启动计算机,进入主板BIOS设置,检查BIOS中USB的相关选项是否已经打开:OnChipUSB设定为Enabled;USBController设定为Enabled;PNPOSInstalled设定为Yes;AssignIRQForUSB设成Enabled。要正常使用USB设备首先要开启USB接口,在主板BIOS里可以进行此项工作,一般来说只需在BIOS中进入ChipsetFeatures设置,并将USBKeyborad/MouseLegacy选项设定为Enable,就能够保证在操作系统下使用USB键盘了。这些选项的作用是打开主板芯片组对USB设备的完全支持,为系统识别USB设备做准备工作。三、USB口接触不好处理办法:拔下,等十秒钟再插上USB口,使接触完好;五、闪存盘驱动程序没有安装完成(WIN98系统下)处理办法:鼠标点“我的电脑”,选择属性找到“通用串行总线”,删除其中的USBMASSSTORAGE项,再点击“刷新”,然后按照提示重新安装一次驱动程序。六、接其它USB设备(如扫描仪、打印机、数码相机)时可以正常使用,接优盘时闪指示灯不亮,不能够使用。1、检查优盘与电脑的联接是否正常,并换用其它USB接口测试。2、检查设备管理器,看是否出现”通用总线设备控制器”条目,如果没有,请将电脑主板BIOS中USB接口条目*激活(ENABLE)。3、如果电脑安装过其它类型USB设备,卸载该设备驱动程序,并首先安装优盘驱动程序。4、到其它电脑试用此优盘,确认是否优盘不良。七、启动型优盘在的电脑上无法实现启动,可能是主板型号不支持。如何判断一块主板是否支持闪存盘启动系统启动型优盘是采用模拟USB软驱和USB硬盘的方式启动电脑的。只要电脑主板支持USB设备启动,即BIOS的启动选项中有USB-FDD、USB-HDD或是其它类似的选项,就可以使用启动型优盘启动电脑。八、第一次在电脑上使用优盘,未出现提示发现新硬件的窗口,驱动程序无法安装的原因可能是:1、主板usbcontroller未启用解决办法:在电脑主板BIOS中启用此功能。2、usbcontroller已经启用但运行不正常解决办法:在设备管理器中删除”通用串行控制器”下的相关设备并刷新。3、优盘被电脑识别异常,在设备管理器中表现为带有黄色?或!的”其它设备”或“未知设备”。解决办法:删除此设备并刷新。九、大容量的U盘(例如兼具MP3播放器或录音功能的U盘)或移动硬盘在电脑上无法正常使用,虽然系统提示找到了未知的USB设备,但无法正确识别U盘或移动硬盘。原因可能是:1.USB接口供电不足:系统为每个USB接口分配了500mA的最大输出电流,一般的U盘只需要100mA的工作电流,因此在使用过程中不会出现什么问题。大多数移动硬盘所使用的是普通的2.5英寸硬盘,其工作电流介于500mA~1000mA之间,此时假如仅仅通过USB接口供电,当系统中并无其他USB设备时,那么还是可以勉强使用的,但如果电压不稳的话,就随时可能出现供电不足的问题。特别是使用支持USB2.0的移动硬盘时,情况最为严重。另外,如果你的笔记本电脑使用电池供电,那么USB接口所分配的电量就更小了。2.使用了外接的USB扩展卡:在笔记本电脑中使用USB2.0的U盘或移动硬盘时,如果笔记本电脑不支持USB2.0技术,一般必须通过PCMCIA卡转USB2.0的扩展卡来间接实现支持,这些扩展卡基本上都采用NEC公司的D720100AGMUSB控制芯片,少则提供两个USB2.0接口,多则提供五个USB2.0接口,对一般用户而言足够使用了。由于PCMICA接口提供的电源功率比板载USB接口要小,这样就会由于供电不足而导致移动硬盘工作的出现问题。解决方案:1.它从USB连接线上接移动硬盘的一端引出一根转接线,可以插入电脑背后的PS/2接口取电,这里可以比USB接口提供更大的电流输出。2.利用电源补偿线(也称“键盘取电线”),如果U盘或移动硬盘的包装盒中提供了选配的电源适配器,你就可以直接使用外接电源,这样就可以从根本上避免供电不足的情况发生了前置USB线接错。当主板上的USB线和机箱上的前置USB接口对应相接时把正负接反就会发生这类故障,这也是相当危险的,因为正负接反很可能会使得USB设备烧毁。所以尽量采用机箱后置的USB接口,也少用延长线.也可能是断口有问题,换个USB端口看下.USB接口电压不足。当把<ahref="mobileharddisk">移动硬盘</a>接在前置USB口上时就有可能发生系统无法识别出设备的故障。原因是<ahref="">移动硬盘</a>功率比较大要求电压相对比较严格,前置接口可能无法提供足够的电压,当然劣质的电源也可能会造成这个问题。解决方法是<ahref="">移动硬盘</a>不要接在前置USB接口上,更换劣质低功率的电源或尽量使用外接电源的硬盘盒,假如有条件的话。主板和系统的兼容性问题。呵呵这类故障中最著名的就是NF2主板与USB的兼容性问题。假如你是在NF2的主板上碰到这个问题的话,则可以先安装最新的nForce2专用USB2.0驱动和补丁、最新的主板补丁和操作系统补丁,还是不行的话尝试着刷新一下主板的BIOS一般都能解决。系统或BIOS问题。当你在BIOS或操作系统中禁用了USB时就会发生USB设备无法在系统中识别。解决方法是开启与USB设备相关的选项。就是开机按F2或DEL键,进入BIOS,把enableusbdevice选择enable。拔插要小心,读写时千万不可拔出,不然有可能烧毁芯片。XP中任务栏中多出USB设备的图标,打开该图标就会在列表中显示U盘设备,选择将该

相关知识

“宠物医院模拟游戏设计与实现:科普宠物疾病知识的Unity3D开发”
基于JSP的宠物医院系统设计与实现
基于SSM的宠物医院信息系统设计与实现 源码
基于springboot+html的宠物医院管理系统设计与实现
基于SSM的宠物医院预约系统的设计与实现
基于SpringBoot的宠物医院管理系统设计与实现
基于node.js+vue的宠物医院在线预约管理系统的设计与实现
基于django+vue+Vue基于宠物医院排号系统的设计与实现【开题报告+程序+论文】
ssm基于Web的宠物医院信息管理系统的设计与实现+vue(10888)
基于Spring Boot的宠物医院管理系统的设计与实现

网址: 基于Unity3D的宠物医院模拟游戏的设计与实现 https://m.mcbbbk.com/newsview1271608.html

所属分类:萌宠日常
上一篇: 宠物医院小游戏大全,宠物医院相关
下一篇: 《饥荒联机版》岩石巢穴详解与玩法