首页 unity3d实例教程

unity3d实例教程

举报
开通vip

unity3d实例教程61五、每期教程本期教程还是比较简卑癿,我们打算做一个Unity3D癿系列教程,至亍入门教程请百度一下嗨嗨癿Unity3D入门教程。那个是规频癿,非常简卑。一看就懂,如果丌懂,找坑豆腐撞死。下面我们来看看本期教程,俄罗斯斱坑……………..=。=..俄罗斯方块转自http://u3dpro.com作者小晕晕首先来看一下做完之后的效果图:62第一步,我们先来理一下俄罗斯方块的玩法及其功能:1、游戏共有7种形状,每一种形状都由4个方块组成2、游戏一开始...

unity3d实例教程
61五、每期教程本期教程还是比较简卑癿,我们打算做一个Unity3D癿系列教程,至亍入门教程请百度一下嗨嗨癿Unity3D入门教程。那个是规频癿,非常简卑。一看就懂,如果丌懂,找坑豆腐撞死。下面我们来看看本期教程,俄罗斯斱坑……………..=。=..俄罗斯方块转自http://u3dpro.com作者小晕晕首先来看一下做完之后的效果图:62第一步,我们先来理一下俄罗斯方块的玩法及其功能:1、游戏共有7种形状,每一种形状都由4个方块组成2、游戏一开始或者每个形状落地之后都会在最上方生成一个新形状3、形状在没落地之前每隔大约0.5秒会自动下落一个方块的距离4、形状可以通过左右方向键向左右移动5、按上键可以旋转形状,每点一下上键则逆时针(我用的逆时针)旋转90°6、每满一行,则这一行消失掉,上面的自动递补到下面7、游戏带计分功能,每消掉一行加1分8、游戏界面右上角显示下一个将要生成的形状9、每一种形状都会随机赋予颜色10、游戏有边界,如图左、右、下蓝色砖块区域。所有形状不可以移动到边界以外,形状在旋转的时候也不允许插到边界里面或者伸出边界第二步,思考游戏在unity3d中的大致实现方式通过观察,很容易发现,每个形状里面都有一个核心方块,其他3个方块都围绕核心方块来转动,同时也可以考虑到其他3个方块的下落、左右移动,也是随着核心方块走的。根据这个思想,我们可以先实现一个方块的“生成”、“自动下落”、“落地判断”这三个功能。1、方块的生成整个俄罗斯方块的游戏界面其实就可以想象成一个二维数组,row是行63号,col是列号,通过给数组元素赋值0、1来控制方块显示的位置,如:PrivateVarrow:int;Privatevarcol:int;block[row,col]=1;可以理解为第row行col列位置的方块显示可能又有同学在想:这只是在数组里面把这个位置的值置为1,怎么让他真正显示在游戏场景里面呢?这个就可以用到GUI里面的GUI.Button或者GUI.DrawTexture,我这里用的GUI.Button,当然,必须自定义一个GUISkin,不然GUI.Button画出来的按钮将是untiy3d默认的按钮样式而不会是上图中的样子。2、方块的自动下落这个说白了就是改变数组里面的值,OnGUI函数里面一直在检测上面所说的那个二维数组里面的值,如果为1就显示这个方块,如果为0就不显示。代码如下:for(row=0;row<30;row++){GUI.Button(Rect(200,row*20,20,20),blockpic,"cusblock01");//画右墙壁GUI.Button(Rect(0,row*20,20,20),blockpic,"cusblock01");//画左墙壁}for(col=0;col<11;col++){GUI.Button(Rect(col*20,620,20,20),blockpic,"cusblock01");//画底部墙壁}for(row=0;row<29;row++){for(col=1;col<10;col++){64if(stateArry[row,col]==1){GUI.Button(Rect(col*20,row*20,20,20),mainBlockpic[colorArry[row,col]],"cusblock01");//刷新显示游戏界面的方块}}}3、碰撞检测在start函数里面预定义墙壁位置的方块们对应数组元素的值为1,代码如下:for(i=0;i<30;i++){stateArry[i,0]=1;stateArry[i,10]=1;}for(i=0;i<11;i++){stateArry[29,i]=1;}这样,如果按下左键向左移动的时候,就检测方块所处位置左边一个位置的值,如果为0则移动方块,如果为1则说明左边有方块,不做任何动作。向下和向右的碰撞检测同理。4、砖块的移动就拿按↓方向键来说,按一下↓那么方块就下落一个方块的位置,我用到了如下代码:Input.GetKey("down")&&pressInterval>=0.02;这里的pressInterval一个按键间隔变量,控制按键的检测时间间隔,因为GetKey函数用来实时监测按键的当前状态,所以如果不加这个时间间隔变量的话,将会出现你按住向下键方块以极快的速度下落的景象。65(这里顺带说一下GetKey和GetKeyDown这两个函数的区别:GetKey用来实时监测按键的状态,如果你一直按着某个按键的话,按键所对应的事件将会一直触发,一直到你松开这个按键;GetKeyDown则不同,就算你一直按着某个键,这个按键所对应的事件也只会执行一次。)是是在update里面让这个值跟随时间而增加,代码如下:pressInterval+=1*Time.deltaTime;向左、向右和向下移动是相同的,只是向左和向右需要监测左右边界的碰撞,向下需要监测下边界碰撞,和上面讲的碰撞一样,按下相应的按键之后,先监测是否碰撞,如果碰撞则不做动作,如果不碰撞,则向对应方向移动一格。5、方块的变形这里和上面的移动不相同,先看代码:Input.GetKeyDown("up");这里用到的是GetKeyDown函数,移动用的则是GetKey函数,因为我们不想按住向上键的时候方块在一直变形,当然,如果你思想足够YD的话可以使用GetKey加一个足够小的时间间隔变量来满足你疯狂变形的欲望。。碰撞检测还是要的,原理还是一样,监测变形之后的四个组成块所处的位置是否与边界有重叠,如果有则不变形。6、提示下一个方块从思想的角度,这个东西很容易做。。。做起来稍微有点复杂,其实原理66很简单,就是预先生成下一个方块,算法上具体怎么做则因人而异。第三步,添加一些更炫更实用的功能比如每个形状拥有随机的颜色(形状的四个组成块颜色相同),自然而然考虑到random,其实就是用random,定义一个textur2D[],里面放入所有颜色的方块,利用随机数,来随机出本次显示的形状使用哪个颜色的方块,具体实现靠你自己啦。记分模块,比如消掉一行加一分,这个就一行代码,利用GUI.Label来显示。还有好多功能,这里就看各位的自由发挥了~OK俄罗斯方块到此为止,,但是我想了下,干脆一不做二不休,吧其他两个教程也送上来。买一送二晒。。。同样转自http://u3dpro.com/不过本次教程作者为稻草67扫雷编程工具:Unity3D2.6脚本种类:JavaScript脚本第一部分——开发思路:首先思考扫雷游戏的特点。每个雷块周围8个区域都会相应的给出雷个数的提示。左键点击空白处,立即会扫出大片空白区域(排空)。右键设定是否为雷。脚本初始,设置空白区域为0,所有雷为1。我们不妨设扫雷的区域为5X5(用for语句来实现)。用GUI来显示我们的5X5区域。如图:雷区显示出来后,就该进行地雷的随机处理了,在这里留好地雷数目的接口,以便更改雷数和游戏难度。用JavaScript中的Random循环来随机雷数,确定范围(让地雷不能跑出5X5的区域)。这里规定雷数为5个,由数字1 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 示。如图:68为了进一步确定每次随机出来的雷数都在5X5的区域中。我们可以在脚本中设置一个重置按钮(在这里格子区域留好接口变量,以便扩充区域)。如图:(游戏后期可将重置按钮变为笑脸图块)接下来要做的是设定地雷周边8个土块的数字的确定。雷区外围边界要留好位置(在这里要当心数组越界的问题)在雷区旁边画出5X5的雷区域(雷周边的数字)与之相对应。相应的定义出两个数组://定义一个二维数组,包含扫雷区域//定义一个数组,存放雷//定义一个二维数组,包含地雷周围数字(此数字的值等于其周围698个数字之和,具体由雷数的多少和密集程度在1-8的数字之内)如图:之后我们将考虑鼠标的互动和图块的变化,定义一个图片数组,加载基本图片如图:将所有的雷区域全部覆盖成扫雷的盖子图块//定义一个二维图片数组,包含所有图片//定义单位图片,属于shuzuPic的元素70如图:利用二维数组图片包含单位图片shuzuPic[Pic[x,y]]可以轻松的更换button图片,用鼠标左键Fire1,确定鼠标事件;用for循环确定事件区域;用mousePosition.x/y来确定点是否正确的点击到了确切的位置。之后确定点击的条件ifelse语句即可。例如:点击位置如果是0更换相应的空白图块如图:相应的鼠标右键Fire2同理右键点击为旗子,在点击为问号。(这里做判断如果是旗子,则鼠标左键不能点击)71如图:接下来就是排空白区域。鼠标如果点击的块值为0,那么其周边的为0的区域将自动展开。为了方便调试,我们将利用开始时的雷区接口把雷区扩大为10X8。这里利用递归算法分别调用点击某个图块的上下左右四个块的值。如图:72至此扫雷的核心内容基本上已解决。剩下的问题是,游戏时间,雷数的变化。和具体的界面细节。如图:时间可由float=0.0;在由parseInt()进行转换。雷数直接由它的接口进行++或--即可。73第二部分——地雷的生成在雷区中,雷数的分布是不固定的,即:每初始化雷区一次,地雷重新随机分布一遍。所以先定义functionSuiJiLei(){}//随机地雷在functionStart(){这里有个for语句{SuiJiLei();}(根据你定义的雷数的多少)}运行之后思考如何随机地雷,尚且规定雷区为5X5雷数为5。定义随机在雷区域内的雷为:privatevarbulei:int;定义一个数组,存放随机的地雷:vararray:int[];即我们用Random随机函数可以得到bulei=Random.Range(1,26);这里表示随机函数会从1~25的数字之间每次随机出一个数来。如果我们想得到地雷的信息,我们将需要地雷的坐标。varlei_x:int;varlei_y:int;在这之前,我们现在已完成的是5X5的区域,我们将把他们的每个块设为0(x,y)。我们还知道每次会在(1~26)随机出一个数成为地雷,设置为1。放置在雷区中。\12345——————————————1|123452|6789103|11121314154|16171819205|2122232425如上所示:如果随机数是bulei=19。则它的位置坐标为(4,4)那么,我们如何用随机数来表示雷区坐标就是随机雷的关键了。74根据每排的规律,如果随机出来的数bulei%5=0(这里的5为5X5区域的横坐标),则每排都有会一个这样的数(不论你是如何设值你的雷区)。而且在同一个横坐标中。如上事例为5、10、15、20、25同理每一个横排的其他数字也可由bulei%row(雷区的横坐标值)来表示。知道这些,随机地雷的横、纵坐标也就不难表示了。我们现在有雷区,且每一块区域都用0表示。则代码表示为:functionSuiJiLei(){bulei=Random.Range(1,26);if(array[bulei]==0){//加载地雷进入雷区。array[bulei]=1;//定义存放的数组地雷为1;if(bulei%5==0){//如上所述有规律的部分lei_x=5;lei_y=bulei/5;}else{//其他雷区的部分lei_x=bulei%5;lei_y=bulei/5+1;}}else{Suiji();//不能使随机的雷重复出现在同一个坐标区域中}}第三部分——雷区周围地雷周边八个数字的确定。首先我们会有这样类似的定义varshuzu=MultiDim.IntArray(100,100);//定义一个二维数组,包含扫雷区域。且每块用0代表vararrayk=MultiDim.IntArray(100,100);//定义一个二维数组,包含地雷75周围数字(这里(100,100)是数组大小,根据你定义的区域设置具体大小,防止数组越界的发生)publicclassMultiDim{publicstaticint[,]IntArray(inta,intb){returnnewint[a,b];}}这是Unity开发二维数组cs的定义。在functionOnGUI(){中画雷区与地雷周边数字(这是两个区域,分开可以更清晰的表现出来)for(vari=1;i<=row;i++){//画雷区for(varj=1;j<=col;j++){GUI.Label(Rect(10+i*30,10+j*30,30,30),shuzu[i,j].ToString);}}for(varm=1;m<=row;m++){//画地雷周边数字for(varn=1;n<=col;n++){GUI.Label(Rect(620+m*30,10+n*30,30,30),""+arrayk[m,n]);}}下面的代码是如何显示雷周边的数字,很显然每一块周边的8个块如果有地雷将会把地雷数相加。我们已经规定所画的雷区每块为0,如果定义地雷为1的话,则任意一块的雷周边数字将会很容易的表示出来。functionroundlei(){for(varxx=1;xx<=row;xx++){for(varyy=1;yy<=col;yy++){arrayk[xx,yy]=shuzu[xx-1,yy-1]+shuzu[xx,yy-1]+shuzu[xx+1,yy-1]+shuzu[xx-1,yy]+shuzu[xx+1,yy]+shuzu[xx-1,yy+1]+shuzu[xx,yy+1]+shuzu[xx+1,yy+1];}}}这样,76GUI.Label(Rect(620+m*30,10+n*30,30,30),""+arrayk[m,n]);将会表式出地雷周边的数字第四部分——空白区域排空扫雷区域空白区域排空算法如果我们所点击的扫雷位置为空,也就是什么也没有的块。这时系统会自动从这个点的上下左右开始向外扩展。如果到达地雷的位置,则排空结束。这种方法就是由递归来进行四处扩展的。我们以向上排空为例(前提是这个块为空)funcitonPaiKong(X:int,Y:int){//这里的坐标为(x,y)的上方坐标(X,Y-1)if((先判断X、Y在横纵坐标的范围)&&图片规定判断&&判断){图片更换;PaiKong(X,Y-1);//递归}elseif(//这里判断排空时雷周边一边排开的数字范围1~8){更换图片}}扫雷教程介绍,下面转换到GUI实现简单贪吃蛇教程出处依然还是http://u3dpro.com作者秋语77GUI实现简单贪吃蛇教程先上一张游戏做成之后的全景图,整个游戏都是使用GUI画出来的,自己可以替换图片为想要的,图中@的方块是豆子,没有@的是贪食蛇的身子,四周是墙壁。贪食蛇教程:贪吃蛇游戏的基本就是有个地图有一条蛇,蛇能够走,能吃豆并且变长下面给出代码可以理解为伪代码,可能会有程序上的语法错误,代码只是作为参考!一、实现地图首先声明贪吃蛇的地图数组和宽高用一个二维数组存储地图数据地图的宽高能在unity菜单中直接调节781.privatevarmap=newArray();2.varmapx=10;3.varmapy=10;4.在Start中初始化地图数据5.for(vari=0;i<mapx;i++){6.map=newArray(mapy);//声明二维数组7.for(varj=0;j<mapy;j++){8.map[j]=0;//初始化数据为09.}10.}在OnGUI中画出地图1.for(varx=0;x<mapx;x++){2.for(vary=0;y<mapy;y++){3.if(map[x][y]==0){4.GUI.Box(Rect(40*x,40*y,40,40),"");5.}6.}7.}79地图就可以显示了,现在开始写蛇二、绘制蛇定义全局变量蛇的长度和蛇的每节的坐标数组和蛇的方向1.Shelong=5;//蛇的长度能够在untiy中调节,但是初始坐标加上长度不能超出地图超出地图就会数组越界2.privatevarShex=newArray();//蛇每节的横坐标3.privatevarShey=newArray();//蛇每节的纵坐标4.privatevarSheFX:int;//蛇的方向5.在Start函数中初始化蛇的坐标和方向6.SheFX=0;//方向0为上1为下2为做3为右7.for(varl=0;l<Shelong;l++){8.Shex[l]=5;//初始x坐标9.Shey[l]=5+l;//初始y坐标因为初始方向为上所以y+l10.map[Shex[l]][Shey[l]]=1;11.}在Update函数中控制移动方向1.if(Input.GetKeyDown("w")){2.if(SheFX!=2)//不能直接回头803.SheFX=0;4.}以此类推写出wasd控制方向按键可以自己随意改变在OnGUI中绘制地图的循环中加入1.if(map[x][y]==0){//地图已经不用总显示了2.//GUI.Box(Rect(40*x,40*y,40,40),"");3.}elseif(map[x][y]==1){4.GUI.Box(Rect(40*x,40*y,40,40),"");5.}现在可以显示蛇了但是蛇还不会动三、控制蛇的移动写一个让蛇自己可移动的函数811.functionyidong(){2.while(true){3.switch(fangx){4.case0:5.if(shey[0]>0){//蛇不能跑出地图边界6.if(shey[0]==1){7.print("碰到墙壁了")8.}else9.shey[0]-=1;10.}11.break;12.case1:13.break;14.case2:15.bteak;16.case3:17.bteak;18.}19.for(vari=5;i<changdu;i++){//*从第五节开始检测是否撞到自己因为前4节不会碰到减少循环次数提高效率*//20.if(shex[0]==shex&&shey[0]==shey){21.print("撞到自己了")22.}23.}24.}蛇可以移动了但是移动的很快而且地图没有刷新蛇看起来像是一直在变长写一个函数刷新地图1.functiongxmap(){2.while(true){3.for(vari=0;i<mapx;i++){4.for(varj=0;j<mapy;j++){5.if(i==0||i==mapx-1||j==0||j==mapy-1){6.map[j]=3;//绘制围墙7.}elseif(map[j]=1){8.map[j]=0;//擦掉蛇9.}10.}11.}12.for(varl=Shelong-1;l>0;l--){13.shex=shex[i-1];8214.shey=shey[i-1];//把已经移动的蛇从新画到地图上15.}16.}17.}在OnGUI函数中在加上1.if(map[x][y]==0){2.//GUI.Box(Rect(40*x,40*y,40,40),"");3.}elseif(map[x][y]==1){4.GUI.Box(Rect(40*x,40*y,40,40),"");5.}elseif(map[x][y]==3){6.GUI.Box(Rect(40*x,40*y,40,40),"");7.}在Start函数中调用yidong();和gxmap();函数现在蛇能走了能撞墙了但是走的很快我们再加一个变量控制速度四、控制移动刷新的速度1.varspeed=1;//在代码外部也可以改变刷新速度在yidong();和gxmap();函数的while(true)循环里第一句加入1.yieldWaitForSeconds(speed);speed数值越小蛇走的越快83五、生成可以吃的豆子现在开始写豆子蛇吃了豆子才会变长1.functiondou(){2.while(true){3.yieldWaitForSeconds(speed);4.doux=Random.Range(1,mapx-2);//第0和mapx-2已经是墙壁了5.douy=Random.Range(1,mapy-2);6.map[doux][douy]=9;7.}8.}在Start中调用dou();在yidong()while循环最后加上1.if(map[shex[0]][shey[0]]==9){2.Shelong++;3.}84在OnGUI中加入1.if(map[x][y]==0){2.//GUI.Box(Rect(40*x,40*y,40,40),"");3.}elseif(map[x][y]==1){4.GUI.Box(Rect(40*x,40*y,40,40),"");5.}elseif(map[x][y]==3){6.GUI.Box(Rect(40*x,40*y,40,40),"");7.}elseif(map[x][y]==9){8.GUI.Box(Rect(40*x,40*y,40,40),"@");9.}最后还有一些细节问题均可自己解决贪吃蛇的基本框架基本功能都已实现Ps:可更改项1外部传入地图2豆子刷新添加一个boolean变量当地图上有豆子时不再生成新豆子当豆子消失时再刷新 俄罗斯方块 扫雷 贪吃蛇
本文档为【unity3d实例教程】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
王秀萍
本人自上班以来,兢兢业业,被评为先进个人,优秀教师优秀班主任等荣誉称号
格式:pdf
大小:4MB
软件:PDF阅读器
页数:0
分类:互联网
上传时间:2019-07-15
浏览量:6