一、前言
嗨,大家好,我是新发。下班坐地铁的时候,好几次看到其他人在玩消消乐,既然大家都这么喜欢玩,那我就写个Unity
制作水果消消乐的教程吧。
我会根据内容点分成好几篇文章来讲,希望对想学Unity
的同学有所帮助,创作不易,喜欢的同学欢迎关注、点赞、收藏,文章目录如下:
第一篇:生成冰块阵列
第二篇:随机生成水果
第三篇:水果拖动与交换逻辑
第四篇:使用DOTween插件实现水果的滑动效果
第五篇:水果的消除检测,实现消除效果
第六篇:水果下落与新水果生成
第七篇:水果消除特效
第八篇:游戏得分加分效果
第九篇:使用UGUI显示游戏UI
游戏运行效果如下:
最终的Demo
工程已上传到GitHub
,感兴趣的同学可以自行下载下来学习。
GitHub
地址:https://github.com/linxinfa/UnityXiaoXiaoLeDemo
注:我使用的Unity
版本为2020.1.14f1c1
。
本篇讲游戏得分加分效果,本篇的效果:
二、使用TextMeshPro显示得分
使用UGUI
的Text
可以显示得分,不过我这里想顺便介绍一下TextMeshPro
,所以我决定使用TextMeshPro
来显示得分。
关于TextMeshPro
的教程可以参见我之前写的这篇文章:https://blog.csdn.net/linxinfa/article/details/113525008
这里我就简单讲下制作流程。
1、导入TTF字体到工程中
导入一个TTF
格式的字体库到Unity
工程中。
如下:
2、创建字源txt文件
创建一个character.txt
文本文件。
里面写入我们需要用到的字符,因为我们只需要数字,所以只需要0123456789
。
3、生成字体asset
设置Source Font File
为我们刚刚导入的TTF
字体,设置Character Set
为Characters from FIle
,选择Character File
为我们刚刚创建的character.txt
文件,最后点击Generate Font Atlas
。
生成后,再点击Save
按钮。
保存字体asset
到Fonts
文件夹中。
这样,字体asset
就制作好了。
4、制作得分预设
在EffectSpawner
节点下创建一个空物体,重命名为ScoreEffect
。
添加TextMeshPro - Text
组件。
设置Font Asset
为我们刚刚生成的字体asset
。
在Text Input
输入要显示的数字,调整字体大小和对齐方式。
这样,我们就可以在场景中看到数字了。
加个描边效果。
效果如下:
将ScoreEffect
保存为预设。
三、得分数字动画
ScoreEffect
目前还是一个静态的文本显示,不够生动,我们给它制作一个出现和消失的动画。
点击菜单Window - Animation - Animation
,打开动画窗口。
选中ScoreEffect
,然后点击Animation
窗口中的Create
按钮。
保存动画文件到Animations
文件夹中。
做一个出现和消失的效果。
在最后一帧加上帧事件,填写响应函数为OnAnimationEvent
,String
参数为finish
。
给ScoreEffect
挂上AnimationEvent
组件。
AnimationEvent
组件在上一篇已经讲过,它代码如下:
// AnimationEvent.cs
using UnityEngine;
using System;
public class AnimationEvent : MonoBehaviour
{
/// <summary>
/// 委托
/// </summary>
public Action<string> aniEventCb;
/// <summary>
/// 动画帧事件响应函数
/// </summary>
public void OnAnimationEvent(string str)
{
// 调用委托
if (null != aniEventCb)
aniEventCb(str);
}
}
四、得分代码
有了得分资源,现在就是用代码来显示这个得分效果了。
我们依然在EffectSpawner.cs
中添加逻辑。
依然使用对象池的方式来显示。
// EffectSpawner.cs
// ...
/// <summary>
/// 得分特效预设
/// </summary>
public GameObject scoreEffectPrefab;
/// <summary>
/// 得分效果对象池
/// </summary>
private Queue<TextMeshPro> m_scoreEffectPool = new Queue<TextMeshPro>();
private void OnFruitDisappear(params object[] args)
{
var pos = (Vector3)args[0];
ShowDisappearEffect(pos);
// 先写死加10分
ShowScoreEffect(pos, 10);
}
public void ShowScoreEffect(Vector3 pos, int addScore)
{
TextMeshPro textMesh = null;
if (m_scoreEffectPool.Count > 0)
textMesh = m_scoreEffectPool.Dequeue();
else
{
var obj = Instantiate(scoreEffectPrefab);
obj.transform.SetParent(m_effectRoot, false);
textMesh = obj.GetComponent<TextMeshPro>();
var aniEvent = obj.GetComponent<AnimationEvent>();
aniEvent.aniEventCb = (str) =>
{
if ("finish" == str)
{
obj.SetActive(false);
m_scoreEffectPool.Enqueue(textMesh);
}
};
}
textMesh.gameObject.SetActive(true);
textMesh.transform.position = pos;
textMesh.text = addScore.ToString();
}
最后,记得给EffectSpawner
赋值ScoreEffect
预设对象。
五、运行测试
运行Unity
,测试效果如下:
下一篇讲使用UGUI
显示游戏UI
。
[点击进入下一篇]