1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 【游戏开发实战】使用Unity 制作仿微信小游戏飞机大战(九):敌机受击与爆炸

【游戏开发实战】使用Unity 制作仿微信小游戏飞机大战(九):敌机受击与爆炸

时间:2019-01-16 19:08:12

相关推荐

【游戏开发实战】使用Unity 制作仿微信小游戏飞机大战(九):敌机受击与爆炸

文章目录

零、教程目录一、前言二、本篇目标三、主角子弹Tag四、敌机动画状态机1、动画变量2、组织动画状态过渡3、设置过渡条件4、设置爆炸动画的帧事件 五、敌机类添加碰撞处理六、运行测试七、下篇预告

零、教程目录

使用Unity 制作仿微信小游戏飞机大战教程已完结。

文章目录如下:

《第一篇:开始游戏界面》

《第二篇:搭建基础游戏框架》

《第三篇:战斗界面UI》

《第四篇:主角飞机序列帧动画》

《第五篇:主角飞机的飞行控制》

《第六篇:根据配置随机生成敌机》

《第七篇:主角飞机碰撞与爆炸》

《第八篇:主角飞机开炮》

《第九篇:敌机受击与爆炸》

《第十篇:敌机血量与得分》

《第十一篇:核弹掉落与全屏炸机》

《第十二篇:敌机开炮》

《第十三篇:游戏暂停、结束与重新开始》

一、前言

嗨,大家好,我是新发。相信很多人玩过微信小游戏经典的飞机大战,如下:

想重温或体验微信这款经典的飞机大战的同学可以点这里:https://gamemaker./ide#/

在网上已经有一些人已经出了Unity的制作教程,但是比较陈旧,里面使用了已经弃用的组件和写法,用了很陈旧的NGUI版本,如果使用Unity 或以上版本打开会各种报错,对新入门Unity的同学不大友好。

于是,我决定写一个全新的教程:《使用Unity制作仿微信小游戏飞机大战》,会使用最新的写法,并且使用尽量简洁的设计与代码来完成。

本教程的工程已上传到Github,感兴趣的同学自行下载学习。

喜欢的同学记得给个星星~

Github地址:/linxinfa/UnityAircraftFight

Unity游戏开发有任何问题的,都欢迎在评论区留言,我都会看到的,并会进行认真解答,希望能帮助到想学Unity开发的同学,共勉。

二、本篇目标

敌机受击与爆炸。

本篇的效果:

三、主角子弹Tag

添加一个PlayerBulletTag

将主角子弹预设的Tag设置为PlayerBullet

四、敌机动画状态机

在写敌机受击与爆炸的逻辑之前,我们需要先处理下敌机的动画状态机和帧事件。

以敌机2的动画位例。

1、动画变量

双击打开Enemy_2动画控制器。

添加两个Bool类型的变量:explodeunderattack

2、组织动画状态过渡

组织动画状态过渡如下,注意受击后要回到Normal状态。

3、设置过渡条件

设置NormalUndderAttack的过渡条件为underattacktrue,并去掉Has Exit Time的勾选。

设置NormalExplode的过渡条件为explodetrue,并去掉Has Exit Time的勾选。

同理另外两个敌机的动画也这样设置(注意敌机1没有受击动画)。

4、设置爆炸动画的帧事件

因为我们需要监听爆炸播放完毕的帧事件然后回收敌机,所以我们需要给敌机的爆炸动画添加帧事件。

以敌机2的爆炸动画为例,双击打开爆炸动画Enemy_2_Explode

此时会打开Animation窗口,在最后一帧的下一帧添加一个帧事件。

编辑帧事件的响应函数为OnAnimationEvent,字符串参数为explode_finish

另外,把动画帧率统一调成8帧每秒,不然动画帧率太快的话,爆炸的效果一下子就结束了。

同理,编辑另外两个敌机的爆炸动画帧事件。

五、敌机类添加碰撞处理

先给飞机基类BaseAircraft添加个碰撞体成员。

// BaseAircraft.csprotected Collider2D m_collider;protected virtual void Awake(){// ...m_collider = GetComponent<Collider2D>();}

然后实现敌机的碰撞处理函数,最终敌机脚本EnemyAircraft如下:

// EnemyAircraft.csusing UnityEngine;using System;/// <summary>/// 敌机类/// </summary>public class EnemyAircraft : BaseAircraft{public float moveSpeed = 0;public Action backToPoolAction;private bool m_underAttack = false;protected override void Awake(){base.Awake();m_aniEvent.aniEventCb = (msg) =>{if ("explode_finish" == msg){BackToPool();}};}/// <summary>/// 随机一个起始位置/// </summary>public void RandomStartPos(){var randomX = UnityEngine.Random.Range(0, Screen.width);m_selfTrans.position = Camera.main.ScreenToWorldPoint(new Vector3(randomX, Screen.height, 5));}private void Update(){// 敌机下落m_selfTrans.position += new Vector3(0, -moveSpeed * Time.deltaTime, 0);// 超过屏幕下面if (Camera.main.WorldToScreenPoint(m_selfTrans.position).y <= -50){BackToPool();}}/// <summary>/// 碰撞处理/// </summary>/// <param name="other"></param>public override void OnTriggerEnter2D(Collider2D other){if ("PlayerBullet" == other.tag){--blood;if (blood > 0){// 受击UnderAttack();}else{// 爆炸Explode();}}}private void LateUpdate(){if (m_underAttack){m_underAttack = false;ani.SetBool("underattack", m_underAttack);}}/// <summary>/// 对象回收/// </summary>private void BackToPool(){ActiveSelf(false);if (null != backToPoolAction)backToPoolAction();}/// <summary>/// 激活/// </summary>public void ActiveSelf(bool active){m_collider.enabled = active;m_selfGo.SetActive(active);}/// <summary>/// 受击/// </summary>public override void UnderAttack(){m_underAttack = true;ani.SetBool("underattack", m_underAttack);}/// <summary>/// 爆炸/// </summary>public override void Explode(){// 爆炸时,把碰撞体禁用m_collider.enabled = false;ani.SetBool("explode", true);}}

六、运行测试

运行Unity,测试效果如下:

七、下篇预告

下篇讲敌机血量和得分。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。