unity贪吃蛇开发记录文档

1.利用ngui插件对界面进行了仿写
在仿写界面途中发现,贪吃蛇这个游戏在界面适应屏幕分辨率,所以在开发中需要注意界面对屏幕的适应性
通过每个图片的宽高 和uiroot的比值,在start方法中对他进行了缩放。
2.利用 ngui 自带的uidragdropItem实现摇杆
界面完成之后,首先对贪吃蛇的摇杆进行了编程。
在unity中的NGUI上,给sprite创建添加一个uidragdropitem 实现了sprite的拖动。
问题:三角函数控制圆心的范围时,摇杆控制蛇不灵活
在三角函数中知道摇杆的中心坐标(x,y)知道摇杆移动到的坐标 能得到圆心到两点的角度,
利用这个角度,知道蛇的当前坐标,假设蛇x+80位置来构建三角形,得到 x,y,利用得到的xy来求出和蛇当前坐标来给蛇进行一个已知角度速度为v的移动。
蛇的移动:
在蛇的移动遇到问题:
思路1:把蛇头每帧经过的坐标用一个结构数组分别存下x和y,层次为0,每节蛇身体经过的路线就是此数组的【i-1】坐标
此思路出现的问题:在游戏开始运行的时候,发现结构数组越界(在start中遍历了蛇的长度先把没个身体的坐标存下来) i++;
之后发现 当i>数组下标的时候越界(i>数组下标{i=0;})
后来蛇运行到下标的时候蛇的身体出现了分离.(over)
思路2:
查找当前这条蛇的长度,取出最后一节身体的对象。
记录下这节身体的预设体。然后删除.
让蛇头移动,每移动一帧的蛇头位置,就把刚才记录的对象创建上去.
此思路出现的问题:
由于最后一个身体是根据他的父物体查找子对象的方法得来的,所以当游戏运行到第二帧的时候,找到的最后一节身体还是原来的那节。(蛇被无限加长).无法解决次问题,以失败。
思路三:
记录下蛇头的初始位置:把他的初始位置作为第二节身体的目标位置。避开了数组等。(最简单的方法)
然后在update中设置一个变量i,每次运行一针。i++。
设置让他运行到某帧的时候在执行蛇Move的方法。
3.游戏被执行的时候给sprite添加添加食物
4.素材中食物有14种食物,先获取到整个地图的大小,如地图大小是20002000
地图的中心是0
那么就可利用随机数random.range(int start int end)方法,start是随机数起始点,end 结束点
Start =-1000;end =1000;
Random.range()
碰撞体的实现:
蛇是运动的物体。所以需要添加一个钢体组件,勾选is Kinematic 不让他受到重力的影响,添加box collider ,在非运动状态下的物体也需要添加这个组件,让后利用OnTriggerEnter()方法来对他进行碰撞检测。
在地图中随机生成的13
20点中,定义一个结构数组,每次蛇吃到了食物都来对他进行存储(食物预设体名,坐标),当蛇吃到的食物到达一定上限的时候,在地图中生成他所吃的点点。食物永不中断,和保证了食物的分布性。
2016年12月23日 10:11:41
玩了手机上的贪吃蛇两个小时,发现:
1.手机上的贪吃蛇是欺骗了用户,其实只要进了游戏,在断网情况也能玩,。
2.当吃到的食物多了蛇会变大,蛇身节点会被覆盖,猜测:应该是改了图片大小,身体节点与节点之间应该是保持不变的,他应该用的也是蛇头坐标传给第一个身体,第一个身体坐标传给第二个身体…
3.食物比较小,蛇头能查找到他180度内的食物,并吃掉,应该是怕食物小了蛇不能正常进食。
经过两天的修改蛇已经和手机上的很相似
4.蛇头能以摇杆偏移度进行旋转。
请添加图片描述

(图1.1)
但是有一个问题,上图,在标记的位置出现抖动,用户肯定是以为机子卡了—待改进
把标记的对象位置绑定了相对uiroot位置,上面的两个标记没出现了抖动,左下角的位置还是会出现抖动。这样不好。
奇怪的是右边的加速按钮也是和uiroot一起移动的,但是没有出现抖动。(个人猜想:应该是update上的问题)
改进(路程)
1.发现当蛇头宽度(width)和蛇的速度有联系,
2.假设蛇身体图片的宽度是w,而蛇的速度是s,那么if(w>s)
{蛇的宽度(w-s)会被覆盖}
在加速的情况下
If(s>w)
{蛇的身体就不会覆盖} 但是蛇会被加长
-------------记录 待改进
试图控制过uiroot上的大小
图1.1 在出现抖动的地方,和右图没有抖动的地方,它们唯一的区别就是有无子物体
重新创建了一个sprite 发现运行的时候一样是抖动

改进:蛇吃到一定长度的时候他的大小发生了变化。
蛇的加速度:
问题:在蛇加速的时候,距离会被拉开,感觉蛇变长了。
问题2:蛇头在移动虚拟摇杆时候,蛇头没有旋转
当蛇头根据角度来旋转的时候,能很好的控制旋转 ,但是发现没有什么用,而且在update上曾大了unity的运算量,unity上调试程序经常会卡的,所有写了方法没有调用。
代码:
public void Xuaanzhuang(float x, float y){(x和y是摇杆移动后得到的坐标)
float m ,j,i,q=0;
m = x * x + y * y;
print (x + “,” + y);
j = Mathf.Sqrt (m);
//print (j +“斜边”);
i = Mathf.Acos (x / j);
//print (i +“弧度”);
if (i != 0) {
q = (180* i) / Mathf.PI;
//print (q +“角度”);

	}
	if(q>=0&&q<=360)
	obj1.transform.rotation = Quaternion.Euler (0, 0, q);
}

加速度时候微微有点变长的现象。(其实不是变长了,是在速度改变的情况下节点与节点之间出现了分离)
感觉有吸力的贪吃蛇:
在蛇头上添加了一个更大的碰撞体,当更大的碰撞体碰撞到食物的时候,让食物岩蛇头位置位移,位移到蛇头位置消失让后增加蛇的长度。(由于食物做的比较大,而且吃到了两个食物蛇就被增加一节,那么就没必要做更大碰撞体-----已经测试过了(手机上有吸力的原因是因为怕用户吃不到食物,影响用户体验感,所有自我感觉没这个必要))
手机贪吃蛇:
在食物吃到了一定大的时候,就发现节点和蛇头变大了,然而有些节点就被覆盖掉了。
改进:
有三种情况:
1.如果蛇身体有100个的话,图片width和height都增加3像素,让用户感觉蛇变大了。
2.到200的时候在给图片增大,蛇头也跟着一起增大。(已经解决)

3.加速度的改进:
在加速度的时候,由于两个节点的距离是成正比的。
把两个距离减了一点点,感觉不是那么明显,当蛇吃到50+食物的时候已经不会被加长了,但是还需要研究,肯定有更好的方法来解决这个问题。
刚开始游戏运行的时候就能加速度。而且加速度的时候,给用户感觉蛇变长了这种情况,所以进行了如下改进:
1.身体的节点没吃到30个的食物,不能进行加速度。
2.为了方便电脑控制鼠标右键也可以加速
遇到的问题:本来在点击加速按钮的时候对他进行判断,是down还是up 后来发现点击函数要在up后才执行,所以他执行点击函数的时候down已经过了—
在update上操作,射线问题,给sprite添加了刚体,添加了boxcollider,但是鼠标mousedown的时候就是一直获取不到该物体。

界面的改动,在页面跳转的时候出现问题:
由于两个界面相差很远的距离,所以他有一个position动画。(时间大概两到三秒,在这个期间能看到uiroot的底板,算是个小bug)
虽然用的ngui插件

请添加图片描述

游戏运行流畅,摇杆控制自如,图片在屏幕的适应性很好。
蛇头旋转后《在蛇头旋转后发现当蛇身体增长了之后,游戏变得卡帧,但是没旋转也不觉得多难看,所以这个问题还有必要研究一下》我相信如果把Ai写了更有吸引力.
在加速控制的时候,因为是电脑的缘故,只让他点击才能能加速,然后设置了右键加速,目的是因为在手机点击等于鼠标左键,两个手指一起按下去等于鼠标右键,这样在手机上移动摇杆的同时按下右手手指就能方便的控制到这条蛇。所以这条蛇。
遇到的问题:在手机玩一般手机要横的放,所以uiroot应该是width>height
而在电脑却是相反,然而我那些图片是根据uiroot的框和高比例给他大小的,这样就造成了,当你的手机是竖放的时候,屏幕比例正常,但是你横的放的时候,图片就不协调了。我觉得如果贪吃蛇大作战上的也可以旋转了话,那么他的图片也肯定是不协调的,他应该是把他禁用掉了。如图:

请添加图片描述

请添加图片描述

遇到问题Uiroot在移动的时候,他里面的物体出现抖动
开始问了同事,说要两个摄像机,一个是静止的一个是移动的,这样他就不会抖动了。
物体抖动已经解决了,也找到了原因:因为蛇头的移动是通过Rigidbody驱动的,所以摄像机跟随后想要的把Update()改成FixedUpdate()就正常了。
区别
update是在每次渲染刷新的一帧的时候才会调用,FixedUpdate是在固定的事件间隔执行,不受游戏帧率(fps)的影响FixedUpdate的事件间隔可以在项目设置中更改,测试可用:
Edit>project setting >time 找到fixed timestep 就可以修改了

AI的开始,移动逻辑:
整体只考虑三个前景:
1.首先先判断蛇首的简介范围是否有其他蛇死亡了留下的食物,如果有的话设置当前朝向为星星方向,便设置移动倍率为2,否则判断第三种情况;
3.随机朝某个位置移动。如果每帧AI都在更新的话,蛇的反映速度依然会更快,需要设置一下AI的更新间隔,通过调整这个间隔和蛇首的简介方位来调整AI的反映速度,目的是能够让玩家有机会撞死AI。
AI 移动的方向分析:
AI在一个平面上运动,坐标就只有两个<x,y> 把他用0和1表示为:
----- 4个方向 上下左右
(0,0) (0,1) (0,-1) (-1,0) (1,0)
四个角度 象限。
(-1,1) (1,1) (-1,-1) (1,-1)
设计思路就是把AI蛇也当作是用摇杆来控制的。那么AI就方便写多了,只是 在还没开始写之前,要考虑的就是AI蛇多了之后程序会不会卡死了。在使用线程控制的过程中发现了一个问题,cup利用率太高。所以想先尝试一下在update上操作。如果不行的在想其他的办法。
设计:
把每个AI蛇都相当于人在控制他。那么想象一下虚拟摇杆,用一个数组来存这些虚拟摇杆的位移坐标
把每条AI蛇的长度也记录下来,默认长度就20
错误:
NullReferenceException: Object reference not set to an instance of an object
AI6control.flootAIOneBody6 (Vector3 V) (at Assets/AI6control.cs:57)
AI6control.AIsix () (at Assets/AI6control.cs:40)
AI6control.Update () (at Assets/AI6control.cs:13)
该错误在百度上说:没有实例化的问题
最后一个下午的代码调试 发现由于自己的粗心 导致了把<符号写成了<=符号
就因为这个问题,让贪吃蛇变成了 卡神,害我看了好几天,现在解决了,贪吃蛇也变流畅了好多.
Ai蛇也需要吃食物。长大,在游戏刚启动的时候就让Ai蛇在地图中吃食物,成长,当用户进入游戏的时候AI蛇已经吃到了一定的食物。测试了AI蛇确实发现他能吃食物。死后的处理也处理了。
在AI蛇吃食物的时候 ,地图中食物太多,控件太多。没法知道他是什么时候,查了资料说是要遍历地图中的对象,测试了一下,发现对象太多,程序卡得不要不要的,只能用触发器,避免遍历食物让程序运行不流畅或者变得死机等情况。
这样的话 在游戏中运行10-20条蛇是没有问题的。
地图中有10个点,这10个点是用来AI蛇死后复活的地方。
增加了限定时间模式.
经过很多的测试,也发现了很多的bug 不过都基本改完了,现在暂时没有发现bug

  • 27
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值