




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGE0PAGE31中国石油大学工程硕士生学位论文开题报告及文献总结PAGE0基于C#的捕鱼大师游戏项目设计摘要:捕鱼大师这款游戏是采用C#高级程序语言设计。因为游戏中有大量的类和对象,所以需要对C#基础和面向对象思想的知识有着全面且深入的了解。是以深海为游戏场景的设计目的,在其中游动的各种鱼儿姿态自然,粒子效果华丽的炮弹打击,打击感强烈,很大的趣味性。有不同种类的鱼在里面;游动起来的鱼儿,被炮击中时还有各种特效(翻滚),也能获得金币;鼠标的位置可以调整炮台方向;炮台发射时需要消耗金币;能够切换背景,增加趣味性等等功能。关键词:C#,面向对象思想目录基于C#的捕鱼大师游戏项目设计 1目录 2第1章前言 31.1课题的目的与意义 31.2游戏分析 3第2章游戏开发设计相关技术 42.1关键技术详细说明 42.1.1C#简介 42.1.2C#类与对象 52.1.3Unity引擎介绍 5第3章游戏需求分析和功能设计 63.1需求分析 63.2游戏设计流程分析 63.3所有功能实现类的简介 7第4章游戏功能的具体实现 94.1游戏的画面及音效 94.1.1图层的设计 124.2鱼类的设计与功能详细说明 134.3炮台及子弹的设计与详细说明 194.4得分的设计与详细说明 24第5章游戏测试 27结论和展望 28参考文献 29谢辞 30第1章前言1.1课题的目的与意义运用C#语言的知识编写一款游戏——捕鱼大师是本毕业设计的目的,通过这个巩固自己C#面向对象的这种编程思想,让自己能够牢固全面的掌握C#的基础知识,在该游戏里比较好的体现类与对象的思想。1.2游戏分析和正版的捕鱼达人游戏相比此游戏功能上不能做到,但是用不同威力的子弹设计击杀难度不同的鱼的基本功能,在游戏中还是较好的实现了。简单来说,对于同一条鱼,更容易击落一点需要用威力高的子弹,同一威力的子弹,击落大鱼(实际以游戏内的设定为主)相比击落小鱼会更难的,显然,所需要的金币是更多的威力大的子弹,当然所获得的奖励也是击落大鱼的时候更诱人,所以,玩家如何决策就看他自己了,采用威力大的子弹击打鱼群需要冒较大的风险,还是稳扎稳打,长久之计的话用小型子弹击打鱼群。并且,游戏中出现鱼群的概率也要适中,屏幕中无鱼可打或者满屏皆鱼的情况更不能出现。第2章游戏开发设计相关技术2.1关键技术详细说明2.1.1C#简介C#是一个现代的、通用的、面向对象的编程语言,它是由微软(Microsoft)开发的,由Ecma和ISO核准认可的。由AndersHejlsberg和他的团队在.Net框架开发期间开发的。是专为公共语言基础结构(CLI)设计的。CLI由可执行代码和运行时环境组成,允许在不同的计算机平台和体系结构上使用各种高级语言。2.1.2C#类与对象首先,面向对象和面向过程的思想有着本质上的区别,以面向对象的思维来说,当你拿到一个问题时,你分析这个问题不再是第一步先做什么,第二步再做什么,这是面向过程的思维,你应该分析这个问题里面有哪些类和对象,这是第一点,然后再分析这些类和对象应该具有哪些属性和方法,这是第二点。最后分析类和类之间具体有什么关系,这是第三点。面向对象有一个非常重要的设计思维:合适的方法应该出现在合适的类里面。对象和类的概念:对象是用于计算机语言对问题域中事物的描述,对象通过“属性(attribute)”和“方法(method)”来分别对应事物所具有的静态属性和动态属性。类是用于描述同一类的对象的一个抽象的概念,类中定义了这一类对象所具有的静态属性和动态属性。类可以看成一类对象的模板,对象可以看成该类的一个具体实例。面向对象编程:一组对象互相配合通过沟通完成特定功能的编程思想,是把属性和方法综合在一个里面,综合在一起复用的时候是整个对象进行复用。所以面向对象和面向过程相比,前者更加容易让我们达到可重用性。2.1.3Unity引擎介绍Unity是由UnityTechnologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。Unity类似于Director,Blendergameengine,Virtools或TorqueGameBuilder等利用交互的图型化开发环境为首要方式的软件。其编辑器运行在Windows和MacOSX下,可发布游戏至Windows、Mac、Wii、iPhone、Windowsphone8和Android平台。也可以利用Unitywebplayer插件发布网页游戏,支持Mac和Windows的网页浏览。它的网页播放器也被Macwidgets所支持。第3章游戏需求分析和功能设计3.1需求分析a)本游戏以深邃的海洋为背景,力求呈现出鱼儿在水中自由游弋的自然姿态,为玩家营造出身临其境的游戏体验。b)游戏中设有多种不同种类的鱼类,每一种都独具特色,旨在增加游戏的多样性和趣味性。c)游戏中的炮台设有不同的威力等级,同时渔网的大小将与炮弹的威力成正比。玩家可通过鼠标点击调整炮台方向,发射子弹时将消耗一定的金币。d)当鱼儿被炮弹击中时,将以逼真的翻滚动画展示,并为玩家带来金币奖励。e)炮弹打击时的粒子效果将经过精心设计,以确保视觉上的享受和强烈的打击感。f)游戏设定了计时机制,当计时结束时,若玩家的金币数量不足100,系统将自动补足至100金币,以确保玩家的游戏体验不受影响。3.2游戏设计流程分析游戏启动后,加载游戏,游戏界面成功打开后可以点击鼠标,控制炮台发射的方向,消耗金币发射子弹,子弹碰到鱼之后会变成渔网,根据代码中设计的算法通过鱼的可击落概率和子弹的威力判断鱼是否被击落(随机的),如果没有击杀鱼,鱼继续游动,如果击杀了鱼,会触发被击落程序,鱼会抽到并消失,返回这条鱼该回报的金币。流程图如下3-1:图3-13.3所有功能实现类的简介MusicManager:音乐管理器,管理游戏的背景音乐。FishAttr:鱼死亡的属性信息。FishMaker:生成鱼的属性信息。GoldCollect:金币的收集信息。GunFollow:枪口随着鼠标旋转的方法。MainSenceUI:保存当前游戏的属性方法。SeaWave:水波的属性方法。StartSenceUI:场景的切换。WebAttr:渔网持续的时间及伤害。BulletAttr:销毁鱼的属性。GameController:游戏的管理类。Automove:移动的方法。autoRotate:旋转的方法。Ef_DestroySelf:销毁自身的方法。Ef_HideSelf:隐藏自身的方法。EF_MoveTo:金币移动的方法。Ef_WaterWave:水波纹的属性及方法。Ef_PlayEffect:游戏效果的属性。第4章游戏功能的具体实现4.1游戏的画面及音效开始场景和游戏场景的画面分别运用Unity的UGUI搭建,画面的风格是根据游戏的类型来设计,类GameController是游戏中重要的信息类,其中调用ChangeBg的方法可以更换不同的背景图片,画面中有不同按钮进行点击。其中,开始场景中添加了粒子系统来实现水里的泡泡,游戏场景中,添加了不同的水波纹图片,给游戏添加不一样的体验。类AudioManager是控制音乐的不同播放及开关。代码如下://更换背景voidChangeBg(){if(bgIndex!=lv/20){bgIndex=lv/20;AudioManager.Instance.PlayEffectSound(AudioManager.Instance.seaWaveClip);Instantiate(seaWaveEffect);if(bgIndex>=3){bgImage.sprite=bgSprite[3];}else{bgImage.sprite=bgSprite[bgIndex];}}}//音效的添加privatestaticAudioManager_instance;publicstaticAudioManagerInstance{get{return_instance;}}privateboolisMute=false;publicboolIsMute{get{returnisMute;}}publicAudioSourcebgmAudioSource;publicAudioClipseaWaveClip;publicAudioClipgoldClip;publicAudioCliprewardClip;publicAudioClipfireClip;publicAudioClipchangeClip;publicAudioCliplvUpClip;privatevoidAwake(){_instance=this;isMute=(PlayerPrefs.GetInt("mute",0)==0)?false:true;DoMute();}publicvoidSwitchMuteState(boolisOn){isMute=!isOn;//取反DoMute();}voidDoMute(){if(isMute){bgmAudioSource.Pause();}else{bgmAudioSource.Play();}}publicvoidPlayEffectSound(AudioClipclip){if(!isMute){AudioSource.PlayClipAtPoint(clip,newVector3(0,0,-5));}}4.1.1图层的设计对于避免与同一场景中的第三个对象发生碰撞来说,Layer图层,Tag标签是非常有用,只有设计了图层才使得游戏具有立体感,没有图层的设计是无法完成这款游戏的。同时将鱼及金币都添加了标签,分别为Fish,Gold。其中选中的都为UI图层,如下图4-1,图4-2:图4-2图4-14.1.2布局的管理GameController类是管理类,该类对游戏产生了至关重要的作用,内部属性有调节子弹的按钮,有计时器,倒计时,有当前使用的大炮,有金币,经验条,还有更换背景的方法。OnButtonPDown和OnButtonMDown方法实现了在大炮两边添加按钮的功能,在屏幕上点击会发射子弹的原因正是因为有了OnClick这个方法,功能才得以实现。页面布局如图4-3:图4-34.2鱼类的设计与功能详细说明4.2.1鱼群的生成首先设置鱼生成的位置,添加了13个空物体,指定鱼的生成位置。FishMaker类实现了对鱼群的生成和管理,其中类中有三个方法,生成鱼的方法,直线生成鱼群的方法,拐弯生成鱼群的方法,其中FishAttr类的属性定义了鱼的最大速度,生命值,最大数量。这些属性在游戏中扮演着至关重要的角色,它们确保了游戏的丰富多样性和引人入胜的可玩性。由于每种鱼都具备独特的属性,这使得游戏充满了挑战和趣味性。例如,大鱼往往具有更高的击打难度,但击败它们后获得的奖励也更为丰厚。这种平衡性的设计,使得玩家在追求高分的同时,也能享受到策略与技巧带来的乐趣。通过精心调整这些属性,游戏开发者为玩家打造了一个充满刺激和成就感的虚拟世界。如图4-4:图4-4其中在FishAttr类中还生成了一个鱼死亡的方法TakeDamage,判断如果由于死亡则增加相对的金币数量,经验值,使鱼在指定的时间销毁。注意鱼群还包括在屏幕外的鱼群,在屏幕外设置了四个空物体,分别为上下左右,分别设置指定位置,分别添加刚体组件和碰撞器,当鱼触碰到碰撞器,则会销毁,从而减小内存。代码如下:publicclassFishAttr:MonoBehaviour{//生命值publicinthp;//经验publicintexp;//金币publicintgold;//最大数量publicintmaxNum;//最大速度publicintmaxSpeed;//播放动画publicGameObjectdiePrefab;publicGameObjectgoldPrefab;privatevoidOnTriggerEnter2D(Collider2Dcollision){if(collision.tag=="Border"){Destroy(gameObject);}}voidTakeDamage(intvalue){//鱼受伤hp-=value;//鱼死亡if(hp<=0){GameController.Instance.gold+=gold;GameController.Instance.exp+=exp;GameObjectdie=Instantiate(diePrefab);die.transform.SetParent(gameObject.transform.parent,false);die.transform.position=transform.position;die.transform.rotation=transform.rotation;GameObjectgoldGo=Instantiate(goldPrefab);goldGo.transform.SetParent(gameObject.transform.parent,false);goldGo.transform.position=transform.position;goldGo.transform.rotation=transform.rotation;if(gameObject.GetComponent<Ef_PlayEffect>()!=null){AudioManager.Instance.PlayEffectSound(AudioManager.Instance.rewardClip);gameObject.GetComponent<Ef_PlayEffect>().PlayEffect();}Destroy(gameObject);}}MakeFishes方法运用随机数生成鱼的种类,数量,速度,获取鱼的移动模式。其实就是让鱼群可以不断地直走拐弯,实现游戏的丰富多彩的游戏体验,避免鱼群只会直走的尴尬和生硬的体验。代码如下:publicclassFishMaker:MonoBehaviour{//鱼存放位置(父物体)publicTransformfishhold;//鱼的生成地点publicTransform[]genPositions;//鱼的预制体数组publicGameObject[]fishPrefabs;//波时间间隔publicfloatwaveGenWaitTime=0.3f;//鱼生成时间间隔publicfloatfishGenWaitTime=2f;privatevoidStart(){InvokeRepeating("MakeFishes",0,waveGenWaitTime);}//生成鱼的方法voidMakeFishes(){//用随机数生成鱼的位置intgenPosIndex=Random.Range(0,genPositions.Length);//用随机数生成鱼的种类intfishPreIndex=Random.Range(0,fishPrefabs.Length);//鱼的最大速度和最大数量intmaxNum=fishPrefabs[fishPreIndex].GetComponent<FishAttr>().maxNum;intmaxSpeed=fishPrefabs[fishPreIndex].GetComponent<FishAttr>().maxSpeed;//保证最小生成数量也有一个intnum=Random.Range((maxNum/2)+1,maxNum);//速度保证是最大Speed的一半以上intspeed=Random.Range((maxSpeed/2),maxSpeed);//获取鱼的移动模式intmoveType=Random.Range(0,2);//0:直走1:转弯intangOffset;//直走的倾斜角,仅直走生效intangSpeed;//转弯的角速度,仅转弯生效if(moveType==0){//ToDo直走鱼群的生成angOffset=Random.Range(-22,22);//45°范围沿着z轴旋转反正就是一定会投放在游戏界面内StartCoroutine(GenStrainghtFish(genPosIndex,fishPreIndex,num,speed,angOffset));}else{//TODO转弯鱼群的生成是否取负的角速度右转是负数左转是正数if(Random.Range(0,2)==0)//是否取负的角速度{angSpeed=Random.Range(-15,-9);}else{angSpeed=Random.Range(9,15);}StartCoroutine(GenTrunFish(genPosIndex,fishPreIndex,num,speed,angSpeed));}}//专门生成的直线鱼的方法IEnumeratorGenStrainghtFish(intgenPosIndex,intfishPreIndex,intnum,intspeed,intangOffset){for(inti=0;i<num;i++){GameObjectfish=Instantiate(fishPrefabs[fishPreIndex]);//设置父物体fish.transform.SetParent(fishhold,false);fish.transform.localPosition=genPositions[genPosIndex].localPosition;//关键:设置鱼在哪之后,鱼的朝向也要设置fish.transform.localRotation=genPositions[genPosIndex].localRotation;//这里是在原有基础上绕着Z轴旋转angOffset°(负数向右,正数向左)fish.transform.Rotate(0,0,angOffset);//解决渲染问题,新生成的鱼会叠在旧的鱼之上fish.GetComponent<SpriteRenderer>().sortingOrder+=i;//给鱼添加新的脚本组件,并且设置Speed,这样鱼就会向正X方向移动fish.AddComponent<automove>().speed=speed;//暂停0.5s间隔鱼群中的个体yieldreturnnewWaitForSeconds(fishGenWaitTime);}}//专门生成的拐弯鱼的方法IEnumeratorGenTrunFish(intgenPosIndex,intfishPreIndex,intnum,intspeed,intangSpeed){for(inti=0;i<num;i++){GameObjectfish=Instantiate(fishPrefabs[fishPreIndex]);//设置父物体fish.transform.SetParent(fishhold,false);fish.transform.localPosition=genPositions[genPosIndex].localPosition;//关键:设置鱼在哪之后,鱼的朝向也要设置fish.transform.localRotation=genPositions[genPosIndex].localRotation;//解决渲染问题,新生成的鱼会叠在旧的鱼之上fish.GetComponent<SpriteRenderer>().sortingOrder+=i;//给鱼添加新的脚本组件,并且设置Speed,这样鱼就会向正X方向移动fish.AddComponent<automove>().speed=speed;//添加新的脚本组件,并且设置Speed角速度,这样鱼就会沿着Z轴转弯fish.AddComponent<autoRotate>().speed=angSpeed;//运用携程通知程序暂停//暂停0.5s间隔鱼群中的个体yieldreturnnewWaitForSeconds(fishGenWaitTime);}}}4.3炮台及子弹的设计与详细说明4.3.1炮台的详细设计根据游戏不同的体验效果,分别在不同等级使用不同的炮台。首先,炮台的搭建是根据同层级的不同排序来搭建不同的炮台,炮台有5种,分别代表不同的等级及伤害。炮台是添加在游戏界面的,当主界面切换到游戏界面的时候就会显示一个初始的炮台,而炮弹有着自己多个类型。炮台通过两个按钮去实现炮台的循环切换。首先创建两个按钮,就是放上两个图片,设置名字为ButtonP和ButtonM,用来控制炮台的等级,后面创建添加一个初始炮台到游戏界面。GunFollow类是设置炮台跟随鼠标旋转,是通过获取鼠标坐标,以Y轴为轴的旋转角度运用炮台到鼠标的向量与炮台的↑up向量之间的角度来判断符号的正负,最后使用四元数来获取旋转速度。具体代码如下:publicclassGunFollow:MonoBehaviour{publicRectTransformUGUICanvas;publicCameramainCamera;voidUpdate(){//用于保存游戏中的鼠标坐标Vector3mousePos;//获取鼠标坐标通过RectTransformUtility.ScreenPointToWorldPointInRectangle(UGUI区域(某层),游戏界面鼠标的二维坐标,所在摄像机,输出游戏世界中的鼠标位置RectTransformUtility.ScreenPointToWorldPointInRectangle(UGUICanvas,newVector2(Input.mousePosition.x,Input.mousePosition.y),mainCamera,outmousePos);floatz;//以y轴为轴转负数角度因为Angle函数返回的永远是0~180°(正数),故Vector3.Angle()前面加负号!if(mousePos.x>transform.position.x){//炮台到鼠标的向量与炮台的↑up向量之间的角度(这里是正数还是负数自己测试就OK)z=-Vector3.Angle(Vector3.up,mousePos-transform.position);}else//左转反之{z=Vector3.Angle(Vector3.up,mousePos-transform.position);}//改变武器的角度,使用localRotation,在2/3D混合使用的游戏场景下,必须用这个,因为会受Canvas的影响。//使用四元数的一个方法Euler(x,y,z)获取旋转角度transform.localRotation=Quaternion.Euler(0,0,z);}}4.3.2子弹和渔网的设计BulletAttr类是子弹对应的渔网的设置,给子弹添加碰撞器,不同的子弹对应不同的渔网,以及当前子弹对应的图片的索引。automove类定义了子弹的速度,获取子弹在x轴每秒的移动速度。在类GameController中设置子弹的父物体,子弹的出现位置,设置了子弹鱼炮台朝向保持一致,设置子弹属性脚本BulletAttr里的伤害值为子弹应有的伤害,获取了脚本automove案中的飞行速度,在方法Fire中国定义了数组保存子弹,定义了按鼠标左键发射子弹,前提上俺的区域不是UI的话,判断计算钱够不够买子弹,利用Switch选择那一组子弹,根据等级决定选取一组子弹中的哪一种子弹。并且根据玩法,子弹命中后和超出屏幕后都会删除这个子弹。WebAttr类定义了网持续的时间,网的伤害,当检测标签为Fish的时候触发鱼死亡。子弹设置代码如下:voidFire(){//临时数组保存一组子弹GameObject[]useBullets=bullet5Gos;//一组子弹中的某一种子弹intbulletIndex;//按的是鼠标左击并且按的区域不是UI的话发射子弹if(Input.GetMouseButtonDown(0)&&EventSystem.current.IsPointerOverGameObject()==false){//计算下够不够钱买子弹if(gold-oneShootCosts[costIndex]>=0){//根据当前选择的子弹金额索引号(0~19),确定用哪一组子弹(0~9)switch(costIndex/4){case0:useBullets=bullet1Gos;break;//第一组case1:useBullets=bullet2Gos;break;//第二组case2:useBullets=bullet3Gos;break;//第三组case3:useBullets=bullet4Gos;break;//第四组case4:useBullets=bullet5Gos;break;//第五组与第四组相同}//根据等级决定选取一组子弹中的哪种子弹0~9bulletIndex=(lv%10>=9)?9:lv%10;//实例化一组子弹中的其中一种子弹选哪一种是根据等级选的!!这里应该是设置为根据用户花费的钱而选的才对啊!//例如:你99级,但是你花费的是5元的子弹,那么你还是射出了最高等级子弹的模型,伤害却是最低的!//很纠结的一个问题出现了:游戏中有50种子弹类型,但只有20种伤害类型!无法一一匹配!游戏改进应该设置一一匹配,提高玩家体验感。//那么可以修改每组子弹只用4种!然后将上面一行改为:bulletIndex=costIndex%4;即可!(否则,子弹模型与子弹伤害是没有关系的)//扣钱方法gold-=oneShootCosts[costIndex];AudioManager.Instance.PlayEffectSound(AudioManager.Instance.fireClip);Instantiate(fireEffect);GameObjectbullet=Instantiate(useBullets[bulletIndex]);//例如:costIndex是19,就会使用bullet5Gos的第十种子弹//子弹父物体bullet.transform.SetParent(bulletholds,false);//设置子弹出现位置:在哪个武器身上的FirePos出现(主要有5种武器)bullet.transform.position=gunGos[costIndex/4].transform.Find("FirePos").transform.position;//设置子弹方向朝向游戏内部,也就是与武器朝向保持一致bullet.transform.rotation=gunGos[costIndex/4].transform.rotation;//设置子弹属性脚本里的伤害值为子弹应有的伤害(就是买子弹花费的钱)bullet.GetComponent<BulletAttr>().damage=oneShootCosts[costIndex];//让子弹飞起来//添加脚本,使得子弹可以向前移动,前是正y轴所以是upbullet.AddComponent<automove>().dir=Vector3.up;//根据子弹身上带的属性脚本获取子弹相应的飞行速度bullet.GetComponent<automove>().speed=bullet.GetComponent<BulletAttr>().speed;}else{//闪动文本框StartCoroutine(GoldNotEnough());}}}//通过鼠标滚动滑轮设置子弹代价voidChangeBulletCost(){//向下滑动if(Input.GetAxis("MouseScrollWheel")<0){OnButtonMDown();}//向上滑动if(Input.GetAxis("MouseScrollWheel")>0){OnButtonPDown();}}//按炮台右边的按钮会升级枪支、子弹等级(即处理costIndex关键)//按钮点击+publicvoidOnButtonPDown(){gunGos[costIndex/4].SetActive(false);costIndex++;AudioManager.Instance.PlayEffectSound(AudioManager.Instance.changeClip);Instantiate(changeEffect);//判断如果大于19则等于0,反之继续costIndex=(costIndex>oneShootCosts.Length-1)?0:costIndex;gunGos[costIndex/4].SetActive(true);//更新UI显示oneShootCostText.text="$"+oneShootCosts[costIndex];}//按炮台左边的按钮会降低枪支等级、子弹等级(即处理costIndex)//按钮点击-publicvoidOnButtonMDown(){gunGos[costIndex/4].SetActive(false);costIndex--;AudioManager.Instance.PlayEffectSound(AudioManager.Instance.changeClip);Instantiate(changeEffect);costIndex=(costIndex<0)?oneShootCosts.Length-1:costIndex;gunGos[costIndex/4].SetActive(true);}网设置代码如下://网得持续时间publicfloatdisapperTime;//网得伤害publicintdamage;voidStart(){Destroy(gameObject,disapperTime);}privatevoidOnTriggerEnter2D(Collider2Dcollision){if(collision.tag=="Fish"){collision.SendMessage("TakeDamage",damage);}}4.4得分的设计与详细说明4.4.1金币的设计GoldCollect是金币类,给金币添加了碰撞器,标签为gold,播放金币的动画,类FishAttr中定义了播放动画的预制体,给每条鱼添加不同的金币。在EF_MoveTo类中给金币添加了移动方向和速度。具体代码如下:publicclassGoldCollect:MonoBehaviour{privatevoidOnTriggerEnter2D(Collider2Dcollision){if(collision.tag=="Gold"){AudioManager.Instance.PlayEffectSound(AudioManager.Instance.goldClip);Destroy(collision.gameObject);}}}publicclassEF_MoveTo:MonoBehaviour{privateGameObjectgoldCollect;privatevoidStart(){goldCollect=GameObject.Find("GoldCollect");}privatevoidUpdate(){transform.position=Vector3.MoveTowards(transform.position,goldCollect.transform.position,50*Time.deltaTime);}}4.4.2定时自动给金币的设计在游戏界面中,您可能会注意到两个计时器的存在:大计时器和小计时器。这两个计时器各自承担着不同的功能,共同为玩家提供更为丰富和有趣的游戏体验。大计时器作为游戏的核心机制之一,它的主要作用是在倒计时结束后给予玩家相应的奖励。这种奖励机制不仅增加了游戏的趣味性,还激发了玩家的竞争欲望,让他们更加投入地参与游戏。每当大计时器接近归零,玩家都会充满期待,想要尽力完成任务以获取丰厚的奖励。而小计时器则扮演着保护玩家游戏体验的角色。在游戏中,金币是玩家进行各种操作的重要资源。然而,有时玩家可能会因为金币不足而无法进行某些操作,从而影响游戏体验。小计时器的出现就是为了解决这个问题。它会在玩家金币不足时启动,给予玩家一定的时间来积累金币,避免因资源匮乏而导致的游戏困境。在GameController类的UpdateUI()中用定义了打金币奖励倒计时,小金币奖励倒计时,判断计时器小于等于0的时候金币加50。当大金币奖励时间已到,并且奖励按钮是隐藏状态的,就显示其奖励按钮和隐藏倒计时按钮,获取金币按钮显示出来。具体代码如下://大金币奖励时间倒计时bigTimer-=Time.deltaTime;//小金币奖励时间倒计时(smallCountdown秒给一次奖励)smallTimer-=Time.deltaTime;if(smallTimer<=0){smallTimer=smallCountdown;gold+=50;}//大金币奖励时间已到,并且奖励按钮是隐藏状态的,就显示其奖励按钮和隐藏倒计时按钮。//没有显示出来获取金币按钮才显示if(bigTimer<=0&&bigCountdownButton.gameObject.activeSelf==false){//倒计时关闭bigCountdownText.gameObject.SetActive(false);//获取金币按钮显示bigCountdownButton.gameObject.SetActive(true);}//小金币奖励倒计时文本smallCountdownText.text=""+(int)smallTimer/10+""+(int)smallTimer%1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论