文章目录
一、前言
嗨,大家好,我是新发。相信很多人玩过微信小游戏经典的飞机大战,如下:
想重温或体验微信这款经典的飞机大战的同学可以点这里:https://gamemaker.weixin.qq.com/ide#/
在网上已经有一些人已经出了Unity
的制作教程,但是比较陈旧,里面使用了已经弃用的组件和写法,用了很陈旧的NGUI
版本,如果使用Unity 2019
或以上版本打开会各种报错,对新入门Unity
的同学不大友好。
于是,我决定写一篇全新的教程:《使用Unity2019制作仿微信小游戏飞机大战》,会使用最新的写法,并且使用尽量简洁的设计与代码来完成。
我会根据内容点分成多篇文章来讲解,完结后会将工程上传到GitHub
,大家请耐心等待。
二、本篇目标
敌机血量与得分。
本篇的效果:
三、敌机血量
之前我们在EnemyGenerator
脚本中创建敌机时,是简单地以敌机类型赋值给血量。
/// <summary>
/// 随机生成一个敌机
/// </summary>
private void RandomGenerateEnemy()
{
// ...
enemy.blood = config.Index;
// ...
}
现在,我们在配置中加一个血量字段。打开Resources/Config
文件夹中的GameConfig
。
添加Blood
的配置。
<?xml version="1.0"?>
<GameConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Levels>
<Level EnemySpawnTime="0.5" ID="1" Score="0">
<Enemies>
<Enemy Index="1" MaxSpeed="1.4" MinSpeed="1.1" Blood="1" Weight="90" />
<Enemy Index="2" MaxSpeed="1.6" MinSpeed="1.1" Blood="3" Weight="10" />
<Enemy Index="3" MaxSpeed="0.9" MinSpeed="0.8" Blood="5" Weight="0" />
</Enemies>
</Level>
<Level EnemySpawnTime="0.3" ID="2" Score="10000">
<Enemies>
<Enemy Index="1" MaxSpeed="1.65" MinSpeed="1.35" Blood="2" Weight="70" />
<Enemy Index="2" MaxSpeed="2.1" MinSpeed="1.4" Blood="6" Weight="20" />
<Enemy Index="3" MaxSpeed="1.2" MinSpeed="1.1" Blood="10" Weight="10" />
</Enemies>
</Level>
<Level EnemySpawnTime="0.2" ID="3" Score="50000">
<Enemies>
<Enemy Index="1" MaxSpeed="1.8" MinSpeed="1.5" Blood="3" Weight="60" />
<Enemy Index="2" MaxSpeed="2.4" MinSpeed="1.55" Blood="12" Weight="20" />
<Enemy Index="3" MaxSpeed="1.35" MinSpeed="1.25" Blood="20" Weight="20" />
</Enemies>
</Level>
</Levels>
</GameConfig>
相应的,在EnemyConfig
类中添加Blood
属性。
public class EnemyConfig
{
// ...
/// <summary>
/// 获取或设置敌机血量。
/// </summary>
[XmlAttribute("Blood")]
public int Blood { get; set; }
}
回到EnemyGenerator
脚本,使用配置的Blood
赋值给敌机。
// EnemyGenerator.cs
/// <summary>
/// 随机生成一个敌机
/// </summary>
private void RandomGenerateEnemy()
{
// ...
enemy.blood = config.Blood;
// ...
}
四、得分逻辑与得分显示
在敌机脚本EnemyAircraft
的爆炸的函数中添加得分逻辑,这里就简单以敌机的类型乘以1000
作为得分好了。
/// <summary>
/// 爆炸
/// </summary>
public override void Explode()
{
// 爆炸时,把碰撞体禁用
m_collider.enabled = false;
ani.SetBool("explode", true);
// 加分
GameMgr.instance.Score += (int)aircraftType * 1000;
}
然后再定义一个EVENT_UPDATE_SCORE
事件。
// EventDef.cs
/// <summary>
/// 事件定义
/// </summary>
public class EventDef
{
// ...
/// <summary>
/// 更新得分
/// </summary>
public const string EVENT_UPDATE_SCORE = "EVENT_UPDATE_SCORE";
}
在GameMgr
的Score
被赋值时抛出这个事件。
// GameMgr.cs
/// <summary>
/// 获取或设置游戏的当前分数。
/// </summary>
public int Score
{
get { return m_score; }
set
{
m_score = value;
if (m_nextLevel != null && m_nextLevel.Score <= value)
Level = m_nextLevel;
// 抛出分数更新时间
EventDispatcher.instance.DispatchEvent(EventDef.EVENT_UPDATE_SCORE, Score);
}
}
最后就是游戏界面脚本MainGamePanel
监听这个事件,然后更新分数的Text
了。
// MainGamePanel.cs
public override void Awake()
{
// ...
// 注册事件
EventDispatcher.instance.Regist(EventDef.EVENT_UPDATE_SCORE, OnEventUpdateScore);
}
private void OnDestroy()
{
// 注销事件
EventDispatcher.instance.UnRegist(EventDef.EVENT_UPDATE_SCORE, OnEventUpdateScore);
}
/// <summary>
/// 更新得分显示
/// </summary>
/// <param name="score"></param>
private void UpdateScoreText(int score)
{
m_scoreText.text = score.ToString();
}
private void OnEventUpdateScore(params object[] args)
{
UpdateScoreText(GameMgr.instance.Score);
}
五、运行测试
运行Unity
,测试效果如下:
六、下篇预告
核弹掉落与全屏炸机。