使用Unity 2019制作仿微信小游戏飞机大战(十):敌机血量与得分

文章目录

一、前言

嗨,大家好,我是新发。相信很多人玩过微信小游戏经典的飞机大战,如下:
使用Unity 2019制作仿微信小游戏飞机大战(十):敌机血量与得分
想重温或体验微信这款经典的飞机大战的同学可以点这里:https://gamemaker.weixin.qq.com/ide#/
使用Unity 2019制作仿微信小游戏飞机大战(十):敌机血量与得分

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

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

我会根据内容点分成多篇文章来讲解,完结后会将工程上传到GitHub,大家请耐心等待。

二、本篇目标

敌机血量与得分。
本篇的效果:
使用Unity 2019制作仿微信小游戏飞机大战(十):敌机血量与得分

三、敌机血量

之前我们在EnemyGenerator脚本中创建敌机时,是简单地以敌机类型赋值给血量。

 /// <summary>
/// 随机生成一个敌机
/// </summary>
private void RandomGenerateEnemy()
{
	// ...
	enemy.blood = config.Index;
	// ...
}

现在,我们在配置中加一个血量字段。打开Resources/Config文件夹中的GameConfig
使用Unity 2019制作仿微信小游戏飞机大战(十):敌机血量与得分
添加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";
}

GameMgrScore被赋值时抛出这个事件。

// 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,测试效果如下:
使用Unity 2019制作仿微信小游戏飞机大战(十):敌机血量与得分

六、下篇预告

核弹掉落与全屏炸机。

上一篇:208E.Blood Cousins(离线+倍增LCA+树上启发式合并)


下一篇:【First Blood】人生第一个程序——银行的客户经理们用来写调查报告的辅助程序【尽调辅助】。