教学课件 18项目十八:贪吃蛇_第1页
教学课件 18项目十八:贪吃蛇_第2页
教学课件 18项目十八:贪吃蛇_第3页
教学课件 18项目十八:贪吃蛇_第4页
教学课件 18项目十八:贪吃蛇_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

模块五:2D游戏项目十八:贪吃蛇UnityGameEngineUNITY2D游戏项目十八:贪吃蛇游戏界面展示游戏构思设计游戏项目制作任务1任务2任务3任务概述Unity虽然以3D功能而闻名,但它也可以用于创建2D游戏,2D游戏画面基于二维平面,通常只有水平和垂直的移动。本项目将以《贪吃蛇》案例的制作为例,介绍2D游戏的制作方法。行业PPT模板/hangye/学习目标011.能够综合运用所学知识完成贪吃蛇游戏的制作2.能够进一步完善游戏的功能教学目标重难点重点:理解游戏逻辑难点:游戏功能的实现项目实现02任务1:游戏界面展示项目实现02任务2:游戏构思设计贪吃蛇游戏,分为边界模式和传送模式两种,在游戏中会实时显示蛇的长度及得分,游戏中会存在食物、随机奖励宝箱以及石头三种物体,蛇可以吃食物及宝箱,但不可以碰撞边界(有边界模式)、身体以及石头。在游戏过程中,背景会随着分数的变化而进行颜色的变化。1.游戏功能介绍(1)运行游戏,选择边界模式或传送模式后,单击按钮,即可开始游戏(2)玩家按下方向键或W、A、S、D键控制蛇身体的移动,按空格键加速移动。(3)边界模式不可以触碰到边界、身体以及石头,穿越模式蛇的身体可以穿越边界。(4)当食物出现的时候,有一定的机率可以出现石头或宝箱。(5)吃到食物的时候,蛇的身体长度会自动增加,同时分数也会相应增加。(6)当游戏分数达到500、800、1100、1400、1700分时,游戏背景会随着分数的变化而改变不同的颜色。(7)当蛇碰到边界(边界模式)、身体或石头时,会出现死亡界面。2.游戏流程设计项目实现02任务2:游戏构思设计3.游戏脚本说明脚本名称功能介绍HeadMove.cs控制蛇头移动、蛇头穿越边界、吃食物长身体、分数计算等功能CreateFood.cs实现食物、宝箱或石头随机出现UIController.cs实现得分、长度显示、背景变色功能MainmenuController.cs实现边界判断及场景跳转项目实现02任务3:游戏项目制作1.制作游戏界面(1)设置游戏界面大小为1280*720。(2)制作游戏开始界面。注意,标题文字添加了Outline(描边)和Shadow(阴影)组件,边界模式和传送模式为一组单选钮,需要为其添加ToggleGroup组件。(3)新建场景,制作游戏界面。制作步骤提示:项目实现02任务3:游戏项目制作1.制作游戏界面(4)新建蛇头SnakeHead,为其添加Rigidbody2D组件,取消重力。(5)为蛇头添加BoxCollider2D组件,选中IsTrigger,保证蛇头在移动中能够与食物等发生交互。(6)新建2个空物体foodHolder和bodyHolder,分别用来储存食物和身体,新建一个空物体gameScript,用来添加脚本,同时将头、身体、食物、石头和奖励的宝箱都做成预置体,并分别为它们设置对应的标签,如宝箱的标签为box,石头的标签为stone,食物的标签为food,身体的标签为body。制作步骤提示:项目实现02任务3:游戏项目制作2.实现蛇的移动(1)为蛇头添加HeadMove脚本。制作步骤提示:privatevoidKeyControl(){if(Input.GetKeyDown(KeyCode.Space))

{CancelInvoke();//取消延时

InvokeRepeating("StepMove",0,velocity-0.2f);}if(Input.GetKeyUp(KeyCode.Space))

{CancelInvoke();InvokeRepeating("StepMove",0,velocity);}if(Input.GetKey(KeyCode.W)&&y!=-step)

{transform.localRotation=Quaternion.Euler(0,0,0);x=0;y=step;}if(Input.GetKey(KeyCode.A)&&x!=step)

{transform.localRotation=Quaternion.Euler(0,0,90);x=-step;y=0;

}publicclassHeadMove:MonoBehaviour{publicfloatvelocity=0.35f;//间隔时间

publicintstep=30;//移动步长

privateintx;privateinty;privateVector3headposition;voidStart(){InvokeRepeating("StepMove",0,velocity);

y=step;

x=0;}voidUpdate(){KeyControl();}if(Input.GetKey(KeyCode.S)&&y!=step)

{transform.localRotation=Quaternion.Euler(0,0,180);x=0;y=-step;}if(Input.GetKey(KeyCode.D)&&x!=-step)

{transform.localRotation=Quaternion.Euler(0,0,-90);x=step;y=0;}}privatevoidStepMove()

{headposition=transform.localPosition;transform.localPosition=newVector3(headposition.x+x,headposition.y+y,headposition.z);}}项目实现02任务3:游戏项目制作3.制作蛇头穿越边界(1)为蛇头添加HeadMove脚本。制作步骤提示:privatevoidKeyControl(){if(Input.GetKeyDown(KeyCode.Space))

{CancelInvoke();//取消延时

InvokeRepeating("StepMove",0,velocity-0.2f);}if(Input.GetKeyUp(KeyCode.Space))

{CancelInvoke();InvokeRepeating("StepMove",0,velocity);}if(Input.GetKey(KeyCode.W)&&y!=-step)

{transform.localRotation=Quaternion.Euler(0,0,0);x=0;y=step;}if(Input.GetKey(KeyCode.A)&&x!=step)

{transform.localRotation=Quaternion.Euler(0,0,90);x=-step;y=0;

}publicclassHeadMove:MonoBehaviour{publicfloatvelocity=0.35f;//间隔时间

publicintstep=30;//移动步长

privateintx;privateinty;privateVector3headposition;voidStart(){InvokeRepeating("StepMove",0,velocity);

y=step;

x=0;}voidUpdate(){KeyControl();}if(Input.GetKey(KeyCode.S)&&y!=step)

{transform.localRotation=Quaternion.Euler(0,0,180);x=0;y=-step;}if(Input.GetKey(KeyCode.D)&&x!=-step)

{transform.localRotation=Quaternion.Euler(0,0,-90);x=step;y=0;}}privatevoidStepMove()

{headposition=transform.localPosition;transform.localPosition=newVector3(headposition.x+x,headposition.y+y,headposition.z);}}项目实现02任务3:游戏项目制作4.制作食物随机出现(1)为空物体gameScript添加CreateFood脚本。制作步骤提示:

privateTransformfoodHolder;//用来当做储存食物的父物体

publicGameObjectboxprefab;//奖励宝箱的预制体

publicGameObjectstoneprefab;//石头的预制体

voidStart(){foodHolder=GameObject.Find("foodHolder").transform;MakeFood(false,false);}privatevoidAwake(){_instance=this;}publicvoidMakeFood(boolisBox,boolisStone){GameObjectfood=Instantiate(foodprefab);

food.transform.SetParent(foodHolder,false);

intx=Random.Range(-xLimit,xLimit);//食物的生成范围

inty=Random.Range(-yLimit,yLimit);food.transform.localPosition=newVector3(x*30,y*30,0);usingUnityEngine.UI;publicclassCreateFood:MonoBehaviour{privatestaticCreateFood_instance;//单例模式

publicstaticCreateFoodInstance{get{return_instance;}

}publicintxLimit=21;//蛇头水平方向上移动的最大步数

publicintyLimit=11;//蛇头垂直方向上移动的最大步数

publicGameObjectfoodprefab;//食物预制体if(isBox)

{GameObjectbox=Instantiate(boxprefab);box.transform.SetParent(foodHolder,false);

x=Random.Range(-xLimit,xLimit);y=Random.Range(-yLimit,yLimit);box.transform.localPosition=newVector3(x*30,y*30,0);}if(isStone

{GameObjectstone=Instantiate(stoneprefab);stone.transform.SetParent(foodHolder,false);

x=Random.Range(-xLimit,xLimit);y=Random.Range(-yLimit,yLimit);stone.transform.localPosition=newVector3(x*30,y*30,0);}}}项目实现02任务3:游戏项目制作4.制作食物随机出现(2)修改HeadMove代码。制作步骤提示:elseif(collision.gameObject.CompareTag("body")){}else{switch(collision.gameO){case"up":transform.localPosition=newVector3(transform.localPosition.x,-transform.localPosition.y+30,transform.localPosition.z);break;case"down":transform.localPosition=newVector3(transform.localPosition.x,-transform.localPosition.y-30,transform.localPosition.z);break;

case"left":transform.localPosition=newVector3(-transform.localPosition.x-30,transform.localPosition.y,transform.localPosition.z);break;case"right":transform.localPosition=newVector3(-transform.localPosition.x+30,transform.localPosition.y,transform.localPosition.z);break;}}}}privatevoidOnTriggerEnter2D(Collider2Dcollision){if(collision.tag=="food"){Destroy(collision.gameObject);CreateFood.Instance.MakeFood((Random.Range(0,100)<20)?true:false,(Random.Range(0,100)<20)?true:false);}

elseif(collision.tag=="box"){Destroy(collision.gameObject);}elseif(collision.tag=="stone"){}项目实现02任务3:游戏项目制作5.制作吃食物长身体动画(1)在HeadMove中添加以下的代码。制作步骤提示:if(BodyList.Count>0)

{for(inti=BodyList.Count-2;i>=0;i--){BodyList[i+1].localPosition=BodyList[i].localPosition;}BodyList[0].localPosition=headposition;}}voidGrow(){GameObjectnewbody=Instantiate(bodyprefab,newVector3(2000,2000,0),Quaternion.identity);

newbody.transform.SetParent(bodyparent,false);

BodyList.Add(newbody.transform);

}privatevoidOnTriggerEnter2D(Collider2Dcollision){if(collision.tag=="food")

{Destroy(collision.gameObject);Grow();publicList<Transform>BodyList=newList<Transform>();//身体位置信息publicGameObjectbodyprefab;privateTransformbodyparent;voidAwake(){bodyparent=GameObject.Find("bodyHolder").transform;

}privatevoidStepMove(){headposition=transform.localPosition;transform.localPosition=newVector3(headposition.x+x,headposition.y+y,headposition.z);CreateFood.Instance.MakeFood((Random.Range(0,100)<20)?true:false,(Random.Range(0,100)<20)?true:false);}elseif(collision.tag=="box")

{Destroy(collision.gameObject);Grow();}elseif(collision.tag=="stone"){}elseif(collision.gameObject.CompareTag("body")){}else{switch(collision.gameO){……此处代码与前面一致,省略

}}}项目实现02任务3:游戏项目制作6.制作死亡动画(1)在HeadMove中添加以下代码,如下。制作步骤提示:privateboolisDie=false;//判断蛇是否死亡publicGameObjectdieimage;//死亡后出现的YOUDIE界面的Imageif(Input.GetKeyDown(KeyCode.Space)&&isDie==false)……此处其余代码省略//在KeyControl中所有的if语句后面添加是否死亡的判断条件&&isDie==falsevoidDie(){CancelInvoke();isDie=true;dieimage.SetActive(true);//如果死亡,让死亡界面的Image显示}elseif(collision.tag=="stone"){Die();}elseif(collision.gameObject.CompareTag("body")){Die();}(2)在HeadMove中,找到OnTriggerEnter2D方法,修改其中碰到身体和石头死亡的代码。项目实现02任务3:游戏项目制作7.制作得分和长度显示(1)编写UIController代码。制作步骤提示:

publicintscore=0;//总分

publicintlength=0;//长度

publicTextscoretxt;//显示总分的文本

publicTextlengthtxt;//显示长度的文本

privatevoidAwake(){_instance=this;}publicvoidUpdateUI(ints=5,intl=1)//让蛇每吃到1个食物加5分,长度加1{score+=s;length+=l;scoretxt.text="得分:"+score;lengthtxt.text="长度:"+length;}}usingUnityEngine.UI;publicclassUIController:MonoBehaviour{privatestaticUIController_instance;//单例模式

publicstaticUIControllerInstance{get{return_instance;}}项目实现02任务3:游戏项目制作7.制作得分和长度显示(2)在HeadMove脚本中添加对分数和长度的调用。(3)为gameScript添加UIController脚本。制作步骤提示:privatevoidOnTriggerEnter2D(Collider2Dcollision){if(collision.tag=="food"){Destroy(collision.gameObject);UIController.Instance.UpdateUI();Grow();CreateFood.Instance.MakeFood((Random.Range(0,100)<20)?true:false,(Random.Range(0,100)<20)?true:false);}elseif(collision.tag=="box"){Destroy(collision.gameObject);UIController.Instance.UpdateUI(Random.Range(5,15)*10);//吃到宝箱,让分数随机增加50-150分

Grow();}项目实现02任务3:游戏项目制作8.制作背景随分数改变变色(1)在UIController脚本中添加以下代码。制作步骤提示:case6:case7:case8:ColorUtility.TryParseHtmlString("#FCDEFFFF",outtempcolor);

bgimage.color=tempcolor;break;case9:case10:case11:ColorUtility.TryParseHtmlString("#DFFFD0FF",outtempcolor);

bgimage.color=tempcolor;break;case12:case13:case14:ColorUtility.TryParseHtmlString("#D0FFF7FF",outtempcolor);

bgimage.color=tempcolor;break;case15:case16:case17:ColorUtility.TryParseHtmlString("#C3CCFDFF",outtempcolor);

bgimage.color=tempcolor;break;default:ColorUtility.TryParseHtmlString("#FFD1C8FF",outtempcolor);

bgimage.color=tempcolor;break;}}publicImagebgimage;privateColortempcolor;privatevoidUpdate(){switch(score/100){case0:case1:case2:break;case3:case4:case5:ColorUtility.TryParseHtmlString(“#FFFED0FF”,outtempcolor);

bgimage.color=tempcolor;break;项目实现02任务3:游戏项目制作9.边界判断及场景跳转(1)编写MainmenuController代码。制作步骤提示:

else{transmit.isOn=true;//设置传送标志位

PlayerPrefs.SetInt("border",0);}}publicvoidBorderSeclected(boolisOn){if(isOn){PlayerPrefs.SetInt("border",1);

}}publicvoidTransmitSeclected(boolisOn){if(isOn){PlayerPrefs.SetInt("border",0);

}}publicvoidstartGame(){SceneManager.LoadScene("SampleScene");

}}usingUnityEngine.SceneManagement;usingUnityEngine.UI;publicclassMainmenuController:MonoB

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论