其他分享
首页 > 其他分享> > 使用Unity制作水果消消乐游戏教程(六):水果下落与新水果生成

使用Unity制作水果消消乐游戏教程(六):水果下落与新水果生成

作者:互联网

文章目录

一、前言

嗨,大家好,我是新发。下班坐地铁的时候,好几次看到其他人在玩消消乐,既然大家都这么喜欢玩,那我就写个Unity制作水果消消乐的教程吧。
我会根据内容点分成好几篇文章来讲(完结后会将Demo工程上传到GitHub,大家耐心等待)。

注:我使用的Unity版本为2020.1.14f1c1

本篇讲水果下落与新水果生成,本篇的效果:
在这里插入图片描述

二、水果下落

消除掉水果后,上方的水果需要下落,就是把上方的水果的rowIndex减一,然后更新坐标。

// FruitSpawner.cs

/// <summary>
/// 消除掉的水果上方的水果下落
/// </summary>
private void DropDownOtherFruit()
{
    for (int i = 0; i < m_matchFruits.Count; ++i)
    {
        var fruit = m_matchFruits[i] as FruitItem;
        for (int j = fruit.rowIndex + 1; j < GlobalDef.ROW_COUNT; ++j)
        {
            var dropdownFruit = GetFruitItem(j, fruit.columIndex);
            dropdownFruit.rowIndex--;
            SetFruitItem(dropdownFruit.rowIndex, dropdownFruit.columIndex, dropdownFruit);
            dropdownFruit.UpdatePosition(dropdownFruit.rowIndex, dropdownFruit.columIndex, true);
        }
        ReuseRemovedFruit(fruit);
    }
}

三、生成新水果

上方的水果下落后,顶部就会空出一些格子,这些格子需要生成新的水果,我们可以复用被消除的水果对象,让它们直接作为顶部的水果对象,只是随机成别的水果类型。

// FruitSpawner.cs

/// <summary>
/// 复用被消除的水果,作为新水果放到顶部
/// </summary>
private void ReuseRemovedFruit(FruitItem fruit)
{
    // 随机一个水果类型
    var fruitType = Random.Range(0, fruitPrefabs.Length);
    fruit.rowIndex = GlobalDef.ROW_COUNT;
    fruit.CreateFruitBg(fruitType, fruitPrefabs[fruitType]);
    // 先放到最顶部外面
    fruit.UpdatePosition(fruit.rowIndex, fruit.columIndex);
    // 让其下落一格
    fruit.rowIndex--;
    SetFruitItem(fruit.rowIndex, fruit.columIndex, fruit);
    fruit.UpdatePosition(fruit.rowIndex, fruit.columIndex, true);
}

四、递归检测水果消除

消除水果后,由于上方的水果落下和新生成水果,所以有可能会出现不需要移动水果就可以消除的情况,所以我们在消除后需要再执行一次检测并消除,实现递归。

// FruitSpawner.cs

/// <summary>
/// 自动递归检测水果消除
/// </summary>
/// <returns></returns>
IEnumerator AutoMatchAgain()
{
    if (CheckHorizontalMatch() || CheckVerticalMatch())
    {
        RemoveMatchFruit();
        yield return new WaitForSeconds(0.2f);
        DropDownOtherFruit();

        m_matchFruits = new ArrayList();

        yield return new WaitForSeconds(0.6f);
        // 递归调用
        StartCoroutine(AutoMatchAgain());
    }
}

五、调用

最终,在ExchangeAndMatch中调用上面封装的方法。

// 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.2f);
        //上面的水果掉落下来,生成新的水果
        DropDownOtherFruit();
        m_matchFruits = new ArrayList();
		yield return new WaitForSeconds(0.6f);
        // 再次执行一次检测
        StartCoroutine(AutoMatchAgain());
    }
    else
    {
        // 没有任何水果匹配,交换回来
        Exchange(item1, item2);
    }
}

六、首次自动检测

首次生成整个水果阵列后,需要自动执行一次检测。

// FruitSpawner.cs

private void Start()
{
    SpawnFruitArrayList();

    // 首次生成水果后,执行一次自动检测
    StartCoroutine(AutoMatchAgain());
}

七、运行测试

运行Unity,测试效果如下:
在这里插入图片描述
下一篇讲水果消除特效与加分逻辑。

标签:水果,rowIndex,Unity,消消,fruit,消除,new,dropdownFruit
来源: https://blog.csdn.net/linxinfa/article/details/114156227