一、前言
嗨,大家好,我是新发。下班坐地铁的时候,好几次看到其他人在玩消消乐,既然大家都这么喜欢玩,那我就写个Unity
制作水果消消乐的教程吧。
我会根据内容点分成好几篇文章来讲,希望对想学Unity
的同学有所帮助,创作不易,喜欢的同学欢迎关注、点赞、收藏,文章目录如下:
第一篇:生成冰块阵列
第二篇:随机生成水果
第三篇:水果拖动与交换逻辑
第四篇:使用DOTween插件实现水果的滑动效果
第五篇:水果的消除检测,实现消除效果
第六篇:水果下落与新水果生成
第七篇:水果消除特效
第八篇:游戏得分加分效果
第九篇:使用UGUI显示游戏UI
游戏运行效果如下:
最终的Demo
工程已上传到GitHub
,感兴趣的同学可以自行下载下来学习。
GitHub
地址:https://github.com/linxinfa/UnityXiaoXiaoLeDemo
注:我使用的Unity
版本为2020.1.14f1c1
。
本篇讲冰块阵列的生成,本篇的效果:
二、创建工程
我们要做的是一个2D
的水果消消乐游戏,所以直接创建一个2D
的Unity
工程,工程名称叫UnityXiaoXiaoLeDemo
。
创建成功。
三、导入冰块图片素材
新建一个RawAssets
文件夹。
再新建Textures
子目录,用于存放图片素材。
把冰块和水果图片素材导入到工程中。
如下:
注意图片类型设置为Sprite (2D and UI)
。
四、创建冰块阵列
在场景中创建一个空物体(Create Empty
),重名名为Play
,坐标归零。
同理创建一个空子节点IceSpawner
,
把冰块图片拖入到IceSpawner
子节点中,此时会自动创建一个Sprite Renderer
来显示图片。
可以看到场景中显示了冰块了。
我们现在要创建一个9行7列
的冰块阵列,先定义一些全局变量,因为要写脚本了,所以先创建一个Scripts
文件夹。
创建一个GlobalDef.cs
用于定义全局变量。
// GlobalDef.cs
// 定义一些全局变量
public class GlobalDef
{
/// <summary>
/// 行数
/// </summary>
public const int ROW_COUNT = 9;
/// <summary>
/// 列数
/// </summary>
public const int COLUM_COUNT = 7;
/// <summary>
/// 每个格子大小
/// </summary>
public const float CELL_SIZE = 0.9f;
}
再创建一个脚本:IceSpawner.cs
,用于动态生成冰块阵列。
// IceSpawner.cs
using UnityEngine;
/// <summary>
/// 冰块生成器
/// </summary>
public class IceSpawner : MonoBehaviour
{
public GameObject iceObj;
void Start()
{
// 生成冰块整列
for (int rowIndex = 0; rowIndex < GlobalDef.ROW_COUNT; ++rowIndex)
{
for (int columIndex = 0; columIndex < GlobalDef.COLUM_COUNT; ++columIndex)
{
// 实例化冰块物体
var obj = Instantiate(iceObj);
obj.transform.SetParent(iceObj.transform.parent, false);
obj.transform.localPosition = new Vector3((columIndex - GlobalDef.COLUM_COUNT / 2f) * GlobalDef.CELL_SIZE + GlobalDef.CELL_SIZE / 2f, (rowIndex - GlobalDef.ROW_COUNT / 2f) * GlobalDef.CELL_SIZE + GlobalDef.CELL_SIZE / 2f, 0);
}
}
iceObj.SetActive(false);
}
}
把IceSpawner
脚本挂到场景中的IceSpawner
节点上,并赋值Ice Obj
物体。
运行Unity
,效果如下:
我们调节一下IceSpawner
节点的Scale
缩放为0.8
,可以看到冰块阵列可以完整在屏幕中显示了。
五、分辨率适配
上面我们看到冰块阵列创建出来后,我们在720*1280
分辨率下可以完整显示冰块阵列了,但是在其他分辨率中,则依然可能会出现显示不全的情况,比如在1080*2280
分辨率下的显示:
我们要确保在不同分辨率下都能让冰块阵列完整地显示在屏幕中。
创建一个Resolution.cs
脚本,用来做分辨率适配。
// Resolution.cs
using UnityEngine;
/// <summary>
/// 分辨率适配
/// </summary>
public class Resolution : MonoBehaviour
{
public float BASE_WIDTH = 720f;
public float BASE_HEIGHT = 1280f;
private Transform m_tranform;
private float baseRatio;
private float percentScale;
void Start()
{
m_tranform = transform;
SetScale();
}
void SetScale()
{
// 根据宽高比进行缩放
baseRatio = BASE_WIDTH / BASE_HEIGHT * Screen.height;
percentScale = Screen.width / baseRatio;
if (percentScale < 1)
m_tranform.localScale = new Vector3(m_tranform.localScale.x * percentScale, m_tranform.localScale.y * percentScale, 1);
}
}
将Resolution
脚本挂到Play
节点上。
再次运行,可以看到,在不同分辨率下都可以正常显示了。
六、添加背景图
我们加上游戏背景图,导入背景图素材。
显示到场景中。
运行效果如下:
下一篇讲水果的随机生成。
[点击进入下一篇]