标签:水果 rowIndex Unity 消消 fruit 消除 new dropdownFruit
文章目录
一、前言
嗨,大家好,我是新发。下班坐地铁的时候,好几次看到其他人在玩消消乐,既然大家都这么喜欢玩,那我就写个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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。