文章目录
零、教程目录一、前言二、本篇目标三、飞机基类:BaseAircraft.cs四、主角飞机类:PlayerAircraft.cs五、飞机碰撞体六、飞机工厂类:AircraftFactory.cs七、游戏管理器添加调用八、运行测试九、下篇预告零、教程目录
使用Unity 制作仿微信小游戏飞机大战教程已完结。
文章目录如下:
《第一篇:开始游戏界面》
《第二篇:搭建基础游戏框架》
《第三篇:战斗界面UI》
《第四篇:主角飞机序列帧动画》
《第五篇:主角飞机的飞行控制》
《第六篇:根据配置随机生成敌机》
《第七篇:主角飞机碰撞与爆炸》
《第八篇:主角飞机开炮》
《第九篇:敌机受击与爆炸》
《第十篇:敌机血量与得分》
《第十一篇:核弹掉落与全屏炸机》
《第十二篇:敌机开炮》
《第十三篇:游戏暂停、结束与重新开始》
一、前言
嗨,大家好,我是新发。相信很多人玩过微信小游戏经典的飞机大战,如下:
想重温或体验微信这款经典的飞机大战的同学可以点这里:https://gamemaker./ide#/
在网上已经有一些人已经出了Unity
的制作教程,但是比较陈旧,里面使用了已经弃用的组件和写法,用了很陈旧的NGUI
版本,如果使用Unity
或以上版本打开会各种报错,对新入门Unity
的同学不大友好。
于是,我决定写一个全新的教程:《使用Unity制作仿微信小游戏飞机大战》,会使用最新的写法,并且使用尽量简洁的设计与代码来完成。
本教程的工程已上传到Github
,感兴趣的同学自行下载学习。
喜欢的同学记得给个星星~
Github
地址:/linxinfa/UnityAircraftFight
对Unity
游戏开发有任何问题的,都欢迎在评论区留言,我都会看到的,并会进行认真解答,希望能帮助到想学Unity
开发的同学,共勉。
二、本篇目标
主角飞机的飞行控制。
本篇的效果:
三、飞机基类:BaseAircraft.cs
又到了写代码的时候了,在开始写代码之前,我们先思考一下:游戏中有主角飞机,也有敌机,它们都是飞机,根据面向对象编程的思想:封装、继承、多态。我们应该思考一下主角飞机与敌机的共性,看看是否需要封装一个基类,然后再进行继承实现。
经过思考,我们可以得出如下的飞机基类:
根据这个思路,创建一个BaseAircraft.cs
脚本,
代码如下:
// BaseAircraft.csusing UnityEngine;/// <summary>/// 飞机基类/// </summary>public class BaseAircraft : MonoBehaviour{public AircraftType aircraftType;public int blood;public Animator ani;protected Transform m_selfTrans;protected GameObject m_selfGo;protected virtual void Awake(){m_selfGo = gameObject;m_selfTrans = m_selfGo.transform;ani = GetComponent<Animator>();}/// <summary>/// 碰撞检测/// </summary>/// <param name="other"></param>public virtual void OnTriggerEnter2D(Collider2D other){// TODO }/// <summary>/// 受击/// </summary>public virtual void UnderAttack(){}/// <summary>/// 爆炸/// </summary>public virtual void Explode(){// TODO }public virtual void DestroySelf(){}}
四、主角飞机类:PlayerAircraft.cs
主角飞机需要根据鼠标控制飞行:鼠标按住飞机后,移动鼠标,飞机跟着移动。
创建主角飞机脚本:PlayerAircraft.cs
。
代码如下:
// PlayerAircraft.csusing System.Collections;using System.Collections.Generic;using UnityEngine;/// <summary>/// 主角飞机/// </summary>public class PlayerAircraft : BaseAircraft{private bool m_isPress = false;private const float SCREEN_INNER_OFFSET = 20;/// <summary>/// 鼠标按中主角飞机/// </summary>protected void OnMouseDown(){m_isPress = true;}/// <summary>/// 鼠标抬起/// </summary>protected void OnMouseUp(){m_isPress = false;}protected void Update(){if(Input.GetMouseButton(0) && m_isPress){// 根据鼠标位置设置飞机坐标var mosePos = Input.mousePosition;// 限制坐标在屏幕内if (mousePos.x < SCREEN_INNER_OFFSET){mousePos.x = SCREEN_INNER_OFFSET;}else if(mousePos.x > Screen.width - SCREEN_INNER_OFFSET){mousePos.x = Screen.width - SCREEN_INNER_OFFSET;}if (mousePos.y < SCREEN_INNER_OFFSET){mousePos.y = SCREEN_INNER_OFFSET;}else if (mousePos.y > Screen.height- SCREEN_INNER_OFFSET){mousePos.y = Screen.height - SCREEN_INNER_OFFSET;}var worldPos = Camera.main.ScreenToWorldPoint(new Vector3(mosePos.x, mosePos.y, 10));m_selfTrans.position = worldPos;}}}
五、飞机碰撞体
由于我们需要在脚本中检测飞机是否被鼠标按到,所以飞机预设上需要挂一个碰撞体:BoxCollidder2D
。
如下:
这个碰撞区域不是很合理,我们调节一下碰撞体的大小和位置,如下:
六、飞机工厂类:AircraftFactory.cs
游戏中的飞机(包括主角飞机)需要有一个工厂类来生产,所以,封装一个简单工厂类:AircraftFactory.cs
。
代码如下:
// AircraftFactory.csusing UnityEngine;public class AircraftFactory {/// <summary>/// 创建飞机/// </summary>/// <param name="t"></param>/// <returns></returns>public static BaseAircraft CreateAircraft(AircraftType t){if(null == s_aircraftFactoryRoot){var rootObj = new GameObject("AircraftFactoryRoot");s_aircraftFactoryRoot = rootObj.transform;}BaseAircraft aircraft = null;switch (t){case AircraftType.Player:{var prefab = ResourceMgr.instance.LoadRes<GameObject>("Player/Player");var obj = Object.Instantiate(prefab);aircraft = obj.AddComponent<PlayerAircraft>();break;}case AircraftType.Enemy1:case AircraftType.Enemy2:case AircraftType.Enemy3:{// TODO break;}}aircraft.transform.SetParent(s_aircraftFactoryRoot, false);aircraft.aircraftType = t;return aircraft;}private static Transform s_aircraftFactoryRoot;}/// <summary>/// 飞机类型/// </summary>public enum AircraftType{Player,Enemy1,Enemy2,Enemy3,}
七、游戏管理器添加调用
在游戏管理器中,游戏开始事件的响应函数中添加创建主角飞机的调用。
// GameMgr.cs/// <summary>/// 开始游戏/// </summary>public void StartGame(){// 关闭开始游戏界面PanelMgr.instance.HidePanel<StartGamePanel>();// 显示游戏战斗界面PanelMgr.instance.ShowPanel<MainGamePanel>();// 创建主角飞机player = AircraftFactory.CreateAircraft(AircraftType.Player);gameState = GameState.Playing;}public BaseAircraft player;
八、运行测试
运行Unity
,测试效果如下:
九、下篇预告
根据配置随机生成敌机。