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

本文介绍如何在Unity2019中为仿微信小游戏飞机大战添加敌机血量配置及实现得分逻辑与显示。通过XML配置文件设置不同敌机的血量,并在敌机爆炸时增加玩家得分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

零、教程目录

使用Unity 2019制作仿微信小游戏飞机大战教程已完结。
文章目录如下:
《第一篇:开始游戏界面》
《第二篇:搭建基础游戏框架》
《第三篇:战斗界面UI》
《第四篇:主角飞机序列帧动画》
《第五篇:主角飞机的飞行控制》
《第六篇:根据配置随机生成敌机》
《第七篇:主角飞机碰撞与爆炸》
《第八篇:主角飞机开炮》
《第九篇:敌机受击与爆炸》
《第十篇:敌机血量与得分》
《第十一篇:核弹掉落与全屏炸机》
《第十二篇:敌机开炮》
《第十三篇:游戏暂停、结束与重新开始》

一、前言

嗨,大家好,我是新发。相信很多人玩过微信小游戏经典的飞机大战,如下:
在这里插入图片描述
想重温或体验微信这款经典的飞机大战的同学可以点这里:https://gamemaker.weixin.qq.com/ide#/
在这里插入图片描述

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

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

本教程的工程已上传到Github,感兴趣的同学自行下载学习。
喜欢的同学记得给个星星~
Github地址:https://github.com/linxinfa/UnityAircraftFight
在这里插入图片描述
Unity游戏开发有任何问题的,都欢迎在评论区留言,我都会看到的,并会进行认真解答,希望能帮助到想学Unity开发的同学,共勉。

二、本篇目标

敌机血量与得分。
本篇的效果:
在这里插入图片描述

三、敌机血量

之前我们在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";
}

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

protected override void OnShow()
{
	// 注册事件
    EventDispatcher.instance.Regist(EventDef.EVENT_UPDATE_SCORE, OnEventUpdateScore);
}

protected override void OnHide()
{
	// 注销事件
    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,测试效果如下:
在这里插入图片描述

六、下篇预告

核弹掉落与全屏炸机。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林新发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值