【游戏开发实战】使用Unity制作水果消消乐游戏教程(五):水果的消除检测,实现消除效果

一、前言

嗨,大家好,我是新发。下班坐地铁的时候,好几次看到其他人在玩消消乐,既然大家都这么喜欢玩,那我就写个Unity制作水果消消乐的教程吧。

我会根据内容点分成好几篇文章来讲,希望对想学Unity的同学有所帮助,创作不易,喜欢的同学欢迎关注、点赞、收藏,文章目录如下:
第一篇:生成冰块阵列
第二篇:随机生成水果
第三篇:水果拖动与交换逻辑
第四篇:使用DOTween插件实现水果的滑动效果
第五篇:水果的消除检测,实现消除效果
第六篇:水果下落与新水果生成
第七篇:水果消除特效
第八篇:游戏得分加分效果
第九篇:使用UGUI显示游戏UI

游戏运行效果如下:
在这里插入图片描述
最终的Demo工程已上传到GitHub,感兴趣的同学可以自行下载下来学习。
GitHub地址:https://github.com/linxinfa/UnityXiaoXiaoLeDemo
注:我使用的Unity版本为2020.1.14f1c1
在这里插入图片描述


本篇讲水果的消除检测,实现消除效果,本篇的效果:
在这里插入图片描述

二、遍历检测函数

我们思考一下,什么条件可以消除水果?
横向或者纵向,有三个或以上相同的水果连在一起,则可以消除掉。
我们把需要消除的水果先缓存到一个数组中,定义个数组,并封装一个AddMatchFruit函数。

// FruitSpawner.cs

/// <summary>
/// 需要消除掉的水果数组
/// </summary>
private ArrayList m_matchFruits;


/// <summary>
/// 添加匹配的水果到缓存中(匹配的水果会被消除掉)
/// </summary>
private void AddMatchFruit(FruitItem item)
{
    if (null == m_matchFruits)
        m_matchFruits = new ArrayList();
    int index = m_matchFruits.IndexOf(item);
    if (-1 == index)
        m_matchFruits.Add(item);
}

现在,我们先写一个横向的检测,遍历每一行,判断a、a+1、a+2是否相同,相同则把这些水果塞入到m_matchFruits中。

// FruitSpawner.cs

/// <summary>
/// 横线检测水果
/// </summary>
private bool CheckHorizontalMatch()
{
    bool isMatch = false;
    for (int rowIndex = 0; rowIndex < GlobalDef.ROW_COUNT; ++rowIndex)
    {
        for (int columIndex = 0; columIndex < GlobalDef.COLUM_COUNT - 2; ++columIndex)
        {
            var item1 = GetFruitItem(rowIndex, columIndex);
            var item2 = GetFruitItem(rowIndex, columIndex + 1);
            var item3 = GetFruitItem(rowIndex, columIndex + 2);
            if (item1.fruitType == item2.fruitType && item2.fruitType == item3.fruitType)
            {
                isMatch = true;
                AddMatchFruit(item1);
                AddMatchFruit(item2);
                AddMatchFruit(item3);
            }
        }
    }
    return isMatch;
}

同理,纵向检测的也封装一个函数。

// FruitSpawner.cs

/// <summary>
/// 纵向检测水果
/// </summary>
/// <returns></returns>
private bool CheckVerticalMatch()
{
    bool isMatch = false;
    for (int columIndex = 0; columIndex < GlobalDef.COLUM_COUNT; ++columIndex)
    {
        for (int rowIndex = 0; rowIndex < GlobalDef.ROW_COUNT - 2; ++rowIndex)
        {
            var item1 = GetFruitItem(rowIndex, columIndex);
            var item2 = GetFruitItem(rowIndex + 1, columIndex);
            var item3 = GetFruitItem(rowIndex + 2, columIndex);
            if (item1.fruitType == item2.fruitType && item2.fruitType == item3.fruitType)
            {
                isMatch = true;
                AddMatchFruit(item1);
                AddMatchFruit(item2);
                AddMatchFruit(item3);
            }
        }
    }
    return isMatch;
}

三、水果消除

现在,检测到匹配的水果已经塞到m_matchFruits数组中,我们要消除水果,则遍历这个数组进行消除即可。
先给FruitItem封装一个销毁水果图片的接口。

// FruitItem.cs

/// <summary>
/// 销毁水果图片
/// </summary>
public void DestroyFruitBg()
{
    Destroy(fruitSpriteObj);
    fruitSpriteObj = null;
}

接着,在FruitSpawner中封装一个

/// <summary>
/// 消除水果
/// </summary>
private void RemoveMatchFruit()
{
    for (int i = 0; i < m_matchFruits.Count; ++i)
    {
        var item = m_matchFruits[i] as FruitItem;
        item.DestroyFruitBg();
       
    }
}

四、ExchangeAndMatch函数

现在,我们可以在FruitSpawnerExchangeAndMatch函数中调用上面封装的函数了,如下:

// FruitSpawner.cs

/// <summary>
/// 交换水果并检测是否可以消除
/// </summary>
IEnumerator ExchangeAndMatch(FruitItem item1, FruitItem item2)
{
    Exchange(item1, item2);
    yield return new WaitForSeconds(0.3f);
    if (CheckHorizontalMatch() || CheckVerticalMatch())
    {
        // 消除匹配的水果
        RemoveMatchFruit();
        yield return new WaitForSeconds(0.6f);
        // TODO 上面的水果掉落下来
		// TODO 生成新的水果
		
		m_matchFruits = new ArrayList();
		
        // TODO 再次执行一次检测
    }
    else
    {
        // 没有任何水果匹配,交换回来
        Exchange(item1, item2);
    }
}

五、运行测试

运行Unity,测试效果如下:
在这里插入图片描述
我们看到,水果消除成功了,不过消除后上面的水果不会掉下来,也不会生成新的水果。
下一篇就讲消除后水果下落和新水果生成。
[点击进入下一篇]

花八门的游戏分类中,益智游戏是不可或缺的一大板块;而在益智游戏这个分类中,消除合成类游戏又是当之无愧的No.1。从考古级别的《俄罗斯方块》到现在风靡全国的《开心消消乐》,消除合成类游戏经久不衰,并且不断地涌现出新的经典作品,带给我们新的启发和乐趣。作为Unity3D的初级开发者,从头到尾独立完成一款简单的2D棋盘消除合成小游戏是你初级实战的最好选择。既能全面而详细的检验你的基础框架能力、C#编程能力、UGUI适配技巧,又可以在此基础上,较为深入的学习协程方法、DoTween插件和消除合成类的核心算法,一举数得。一言以蔽之,消除合成类游戏不难,但要写好却并不容易。它琐碎的功能逻辑、层出不穷的延时操作以及复杂的状态控制很容易让人顾此失彼,手忙脚乱,最后的结果往往是,费劲九牛二虎之力把功能实现好了,但代码已经乱成一团糟,定位Bug难、扩展新功能难,甚至自己读起来也难。本课程的最大目的,就是帮初级开发者梳理逻辑,写出规范而有条理的代码,避免陷入以上尴尬境地。条理捋清楚了,你就会觉得一切似乎变得简单了,很多地方都会顺理成章。本课程没有什么高深的编程技巧,更没有炫酷的视觉效果,只是一步一步教你如何踏踏实实、稳稳当当的完成一款《简单消消乐》。因此,资深大牛你就别进了,想学高深知识的你就别点了,自认为消除小case、分分钟搞定的高手你也趁早走人。在这门课程里,你能够学到的,只有以下几点:1、如何使用UGUI搭建棋盘游戏的基础阵列;2、如何快速的实现通用的三消逻辑;3、如何使用Dotween插件实现物体的位移、缩放、旋转动画;4、如何熟练的使用协程方法完成延时操作逻辑;5、数组、集合、引用类型、Prefab等基础知识的巩固;6、如何写出规范而有条理的代码;7、益智小游戏的通用模板。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

林新发

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

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

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

打赏作者

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

抵扣说明:

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

余额充值