这个游戏呢是按照unity官方教程的SPACE SHOOTER来改编的,有的人可能会问为什么老是要做官方教程的例子。
这个呢我觉得既然学人家的东西,别人在官方中发布的教程肯定是比较有用的,每个游戏中涵盖的知识点都不同,而且最最最重要的官方教程的模型做好了,不用你操心,可以随时随地免费下载,国内有些教程也是不错的,但是涉及到收费这些问题,大家就自己去衡量一下值不值了。
话不多说,直接进入游戏主题,这个太空射击呢,我觉得相比滚球游戏要难一点
游戏的初始界面,由于我没有弄开始的界面,所以一开始就是游戏的开始了,没有“开始游戏”按钮这些东西
大家可以看到与官方例子是有些不同的,首先多了个血条
开始射击敌机、陨石,设定是每射击一个敌机加50分,一个陨石加10分
子弹我也修改了,原来的激光我个人感觉没有什么打击感,因为他的素材是图片的原因吧,所以我选择这个小钢球
当主角被敌机子弹打中时,血量是随机扣的,随机范围在10~20之间,这是被打了一下之后
这里能看到血量扣了15 并且有粒子特效的,就是中弹时会发出一个中弹特效
与敌机、陨石碰撞或血量为0时,主角阵亡
这个游戏中最大的改动是引入了一个boss,当分数达到12000时才会出现
只有击败boss才能胜利
关于这个游戏的代码有几个难点
1.控制敌人的间隔生成和敌人射击的间隔
void update()
{
i++;
if(i%100==0&&Random.value<=0.8)
//shoot() or produceEnemy();
}
但其实这个方法并不好,因为这个游戏update函数的话是看电脑配置的,配置高的话就每秒执行的帧数多,反之则少。通过后面的学习我学习了一种新的方法,就是用计时器,比如说我设定每隔5秒生成敌人或射击
void update()
{
timer+=Time.detaltime;
if(timer>=5)
{
timer=0;
//shoot() or produceEnemy()
}
}
这里的Time.detaltime就是执行一帧的时间。这样就能比较靠谱的按时间执行命令
2.子弹朝主角方向飞行
一开始我是用movePosition(),查API的时候感觉应该是行的,可能是不清楚里面的原理,实战中并不可行,后来通过学习vector3方向向量时发现两个向量相减得到就是一个相对方向
GameObject go1 = GameObject.Instantiate(bullet, shoot1.position, shoot1.rotation);
Vector3 targetPosition = GameObject.Find("Player").GetComponent<PlayerMove>().getPosition();
Vector3 targetDir1 = targetPosition - go1.GetComponent<Transform>().position;
go1.GetComponent<Rigidbody>().velocity = targetDir1 * speed;
其中target Position就是主角的当前位置
3.控制主角,敌机飞出边界
用Mathf.Clamp这个函数是限制某个变量的值,例Mathf.Clamp(a,0,10)就是限制a的值在0,10之间,最小最大值均包含。
4.控住主角左右移动时侧身
用Quaternion.Euler这个函数返回围绕某个轴旋转多少度,在游戏中我们需要的是主角绕Z轴来旋转,所以
this.rotation = Quaternion.Euler(0.0f, 0.0f, GetComponent<Rigidbody>().velocity.x * -tilt);
为什么最后一个参数velocity.x不是z呢,因为这里左右控制的是要靠X轴上发生位移产生 tilt的话只是一个衡量他旋转角度的一个变量
5.滚动背景,首先的话要将两个场景(相同的)一上一下拼接好
代码的话每当第一张滚动完了就回到第一张的初始位置
transform.Translate(-Vector3.up * Time.deltaTime * mSpeed);
剩下的,我个人认为不是特别的难而且网上教程很多,大家可以自行去查阅
下面给个游戏的链接,有兴趣的小伙伴可以自己下载来玩
链接:https://share.weiyun.com/5NijeZZ 密码:ps96wk
总体的来说,这个游戏看起来不难,但是很多细节也让人头疼,就好像场景滚动,我是用两张图片拼接一起,然后当第一张滚动播放完毕马上“回到”原来一开始的位置,有的人可能会问为什么不能用一张图片,因为一张图片的播放完之后会看到黑色的背景,不好看