消除类游戏一直都比较受欢迎,像什么<开心消消乐>,<宾果消消乐>...
我用自己的思路实现了一个简易填充算法,基本效果还行(虽然算法自身不咋地,但还是能看到效果😂)
效果预览:
实现原理代码注释里都写了,一共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(() =>
{