消消乐简易填充算法

这篇博客介绍了作者如何实现一个简易的消消乐游戏填充算法,通过3个核心脚本实现基本游戏逻辑。虽然算法简单,但能观察到实际效果。文中提供了一个效果预览,并分享了项目的包地址供下载。

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

消除类游戏一直都比较受欢迎,像什么<开心消消乐>,<宾果消消乐>...

我用自己的思路实现了一个简易填充算法,基本效果还行(虽然算法自身不咋地,但还是能看到效果😂)

效果预览:

实现原理代码注释里都写了,一共3个脚本(但是连通测试脚本和item属性脚本)

GameMgr.cs(主逻辑)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;

public class GameMgr : MonoBehaviour
{
    //创建源
    public GameObject itemObj;
    //顶部节点,中间节点
    public Transform itemTopRoot,itemMidRoot;
    //顶部排布布局
    public GridLayoutGroup topGlg;

    //游戏数据
    int[] gameMap = new int[100];
    //数据备份(似乎可以不用)
    int[] oldMap = new int[100];
    //顶部物品表
    List<Transform> _itemTopList = new List<Transform>();
    //中间物品表
    List<Transform> _itemMidList = new List<Transform>();
    

    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine(CreateTopItem());
        float timeCount = 0.1f;
        DOTween.To(() => timeCount, a => timeCount = a, 1, 3).OnComplete(() =>
        {
            StartCoroutine(TopItemDrop());
        });
    }

    //创建顶部item(合理使用布局组件自动排列)
    IEnumerator CreateTopItem()
    {
        gameMap = new int[100];
        topGlg.enabled = true;
        yield return null;

        _itemTopList.Clear();
        for (int i = 0; i < 100; i++)
        {
            Transform t = CreateOneTopItem();
            t.name = i.ToString();
            _itemTopList.Add(t);
        }

        yield return null;
        topGlg.enabled = false;
    }

    //创建单个item
    Transform CreateOneTopItem()
    {
        GameObject go = Instantiate(itemObj);
        go.transform.SetParent(itemTopRoot);
        go.transform.localScale = Vector3.one;
        return go.transform;
    }

    //顶部下落(为了保证动画效果一致,每个item下落
    //距离都是一样的,即自身y-1200)
    IEnumerator TopItemDrop()
    {
        int delay = 0;
        //从左到右按列分组(从左到右,从上到下效果)
        for (int i = 0; i < 10; i++)
        {
            delay++;
            for (int j = 9; j >= 0; j--)
            {
                int idx = i + j * 10;
                Transform item = _itemTopList[idx];
                item.SetParent(itemMidRoot);
                Tween tw = item.DOLocalMoveY(item.localPosition.y - 1200, 0.25f);
                tw.SetDelay(((delay + (10 - j) * 0.5f) /8.0f));
                tw.SetEase(Ease.InSine);
                tw.Play();
                //最后一个
                if (idx == 9)
                {
                    tw.OnComplete(() =>
                    {
             
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值