Match 3 小项目学习

using UnityEngine;
using System.Collections;
using Holoville.HOTween;
/// <summary>
/// 游戏逻辑
/// </summary>
public class Main:MonoBehaviour {
/// <summary>
/// 点击框预设
/// </summary>
public GameObject _indicator;
/// <summary>
/// 二维方块数组
/// </summary>
public GameObject[,] _arrayOfShapes;
/// <summary>
/// 当前点击框
/// </summary>
private GameObject _currentIndicator;
/// <summary>
/// 第一个选择的物体
/// </summary>
private GameObject _FirstObject;
/// 第二个选择的物体
/// </summary>
private GameObject _SecondObject;
/// <summary>
/// 方块预设列表
/// </summary>
public GameObject[] _listOfGems;
/// <summary>
/// 空物体
/// </summary>
public GameObject _emptyGameobject;
/// <summary>
/// 星星特效
/// </summary>
public GameObject _particleEffect;
/// <summary>
/// 匹配时的特效
/// </summary>
public GameObject _particleEffectWhenMatch;
/// <summary>
/// 能否在对角线上转换
/// </summary>
public bool _canTransitDiagonally = false;
/// <summary>
/// 每次匹配时的增长分数
/// </summary>
public int _scoreIncrement;
/// <summary>
/// 总分
/// </summary>
;
/// <summary>
/// 当前特效
/// </summary>
private ArrayList _currentParticleEffets = new ArrayList();
/// <summary>
/// 匹配时的声音
/// </summary>
public AudioClip MatchSound;
/// <summary>
/// 网格x轴上的格子数量
/// </summary>
public int _gridWidth;
/// <summary>
/// 网格y轴上的格子数量
/// </summary>
public int _gridHeight;
void Start() {
//为2维方块数组分配内存
_arrayOfShapes = new GameObject[_gridWidth,_gridHeight];
//从左到右,从下到上创建格子
;i <= _gridWidth - ;i++) {
;j <= _gridHeight - ;j++) {
//var gameObject = GameObject.Instantiate(_listOfGems[Random.Range(0,_listOfGems.Length)] as GameObject,new Vector3(i,j,0),transform.rotation) as GameObject;
GameObject gameObject = null;
) {
gameObject = GameObject.Instantiate(_listOfGems[] ),transform.rotation) as GameObject;
} ) {
gameObject = GameObject.Instantiate(_listOfGems[] ),transform.rotation) as GameObject;
} else {
gameObject = GameObject.Instantiate(_listOfGems[] ),transform.rotation) as GameObject;
}
_arrayOfShapes[i,j] = gameObject;
}
}
//Adding the star effect to the gems and call the DoShapeEffect continuously
//InvokeRepeating("DoShapeEffect",1f,0.21F);
}
void Update() {
//是否转换
bool shouldTransit = false;
//当用户点击按钮且没有动画
if(Input.GetButtonDown("Fire1") && HOTween.GetTweenInfos() == null) {
//销毁当前选择框
Destroy(_currentIndicator);
//生成从屏幕中心点到鼠标点击位置的射线
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
//发射射线
RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition),Vector2.zero);
//如果射线碰到物体
if(hit.transform != null) {
//第一个选择的物体为空
if(_FirstObject == null) {
//将点击的物体设置为第一个选择物体
_FirstObject = hit.transform.gameObject;
//如果第一个选择的物体不为空
} else {
//将点击的物体设置为第二个选择物体
_SecondObject = hit.transform.gameObject;
//可以转换
shouldTransit = true;
}
//根据点击位置创建选择框
_currentIndicator = GameObject.Instantiate(_indicator,),transform.rotation) as GameObject;
//如果可以转换
if(shouldTransit) {
//获取两个物体之间的距离
var distance = _FirstObject.transform.position - _SecondObject.transform.position;
//如果x,y的距离 都小于等于1
&& Mathf.Abs(distance.y) <= ) {
//如果不能在斜线上交换
if(!_canTransitDiagonally) {
//
&& distance.y != ) {
//销毁选择框
Destroy(_currentIndicator);
_FirstObject = null;
_SecondObject = null;
return;
}
}
//播放交换动画
DoSwapMotion(_FirstObject.transform,_SecondObject.transform);
//交换在数组中的位置
DoSwapTile(_FirstObject,_SecondObject,ref _arrayOfShapes);
//如果不能转换
} else {
_FirstObject = null;
_SecondObject = null;
}
//销毁选择框
Destroy(_currentIndicator);
}
}
}
//如果没有播放动画
if(HOTween.GetTweenInfos() == null) {
//查找匹配的格子
var Matches = FindMatch(_arrayOfShapes);
//如果找到匹配的格子
) {
//更新分数
_scoreTotal += Matches.Count * _scoreIncrement;
//遍历匹配物体
foreach(GameObject go in Matches) {
//播放匹配声音
GetComponent<AudioSource>().PlayOneShot(MatchSound);
//创建匹配特效
),transform.rotation) as GameObject;
//1秒后销毁特效
Destroy(destroyingParticle,1f);
//用空物体替换匹配物体
_arrayOfShapes[(),transform.rotation) as GameObject;
//0.1秒后删除匹配物体
Destroy(go,0.1f);
}
_FirstObject = null;
_SecondObject = null;
DoEmptyDown(ref _arrayOfShapes);
}
//如果没有找到格子,将格子的位置复位
else if(_FirstObject != null && _SecondObject != null) {
//播放交换动画
DoSwapMotion(_FirstObject.transform,_SecondObject.transform);
//交换格子位置
DoSwapTile(_FirstObject,_SecondObject,ref _arrayOfShapes);
_FirstObject = null;
_SecondObject = null;
}
}
//更新分数
(GetComponent(typeof(TextMesh)) as TextMesh).text = _scoreTotal.ToString();
}
/// <summary>
/// 查找匹配
/// </summary>
/// <param name="cells"></param>
/// <returns></returns>
private ArrayList FindMatch(GameObject[,] cells) {
//存储匹配的方块数组
ArrayList stack = new ArrayList();
//将列上至少3个颜色相同的方块放进数组中
//从左到右
;x <= cells.GetUpperBound();x++) {
//从下到上
;y <= cells.GetUpperBound();y++) {
//当前网格
var thiscell = cells[x,y];
//如果是空物体,忽略
if(thiscell.name == "Empty(Clone)") {
continue;
}
//匹配数量
;
//y2 网格列上的最大索引
);
//y1 网格列内y格子上方的格子索引
int y1;
//遍历列中其余的格子
;y1 <= y2;y1++) {
//如果是空物体或者名字不匹配,跳出循环
if(cells[x,y1].name == "Empty(Clone)" || thiscell.name != cells[x,y1].name) {
break;
}
//匹配数量加一
matchCount++;
}
//如果匹配数量大于等于2
) {
//限制y1的最小值
y1 = Mathf.Min(cells.GetUpperBound(),y1 - );
//从 y遍历到 y1,
for(var y3 = y;y3 <= y1;y3++) {
//将不重复的格子添加到数组中
if(!stack.Contains(cells[x,y3])) {
stack.Add(cells[x,y3]);
}
}
}
}
}
//将行上至少3个颜色相同的方块放进数组中
//从下到上
;y < cells.GetUpperBound() + ;y++) {
//从左到右
;x < cells.GetUpperBound() + ;x++) {
//当前网格
var thiscell = cells[x,y];
//如果是空物体,忽略
if(thiscell.name == "Empty(Clone)") {
continue;
}
//匹配数量
;
//x2 网格行上的最大索引
);
//x1 网格行内x格子右方的格子索引
int x1;
//遍历行中其余的格子
;x1 <= x2;x1++) {
//如果是空物体或者名字不匹配,跳出循环
if(cells[x1,y].name == "Empty(Clone)" || thiscell.name != cells[x1,y].name) {
break;
}
//匹配数量加一
matchCount++;
}
//如果匹配数量大于等于2
) {
//限制x1的最小值
x1 = Mathf.Min(cells.GetUpperBound(),x1 - );
//从x遍历到 x1,
for(var x3 = x;x3 <= x1;x3++) {
//将不重复的格子添加到数组中
if(!stack.Contains(cells[x3,y])) {
stack.Add(cells[x3,y]);
}
}
}
}
}
return stack;
}
/// <summary>
/// 交换动画
/// </summary>
void DoSwapMotion(Transform a,Transform b) {
Vector3 posA = a.localPosition;
Vector3 posB = b.localPosition;
TweenParms parms = new TweenParms().Prop("localPosition",posB).Ease(EaseType.EaseOutQuart);
HOTween.To(a,0.25f,parms).WaitForCompletion();
parms = new TweenParms().Prop("localPosition",posA).Ease(EaseType.EaseOutQuart);
HOTween.To(b,0.25f,parms).WaitForCompletion();
}
/// <summary>
/// 交换网格在数组中的位置
/// </summary>
void DoSwapTile(GameObject a,GameObject b,ref GameObject[,] cells) {
GameObject cell = cells[(int)a.transform.position.x,(int)a.transform.position.y];
cells[(int)a.transform.position.x,(int)a.transform.position.y] = cells[(int)b.transform.position.x,(int)b.transform.position.y];
cells[(int)b.transform.position.x,(int)b.transform.position.y] = cell;
}
/// <summary>
/// 移动网格
/// </summary>
private void DoEmptyDown(ref GameObject[,] cells) {
//从左到右
;x <= cells.GetUpperBound();x++) {
//从下到上
;y <= cells.GetUpperBound();y++) {
//当前网格
var thisCell = cells[x,y];
//如果是空网格
if(thisCell.name == "Empty(Clone)") {
//从下往上遍历y轴网格
);y2++) {
//如果不是空网格,交换
if(cells[x,y2].name != "Empty(Clone)") {
cells[x,y] = cells[x,y2];
cells[x,y2] = thisCell;
break;
}
}
}
}
}
//从左到右
;x <= cells.GetUpperBound();x++) {
//从下到上
;y <= cells.GetUpperBound();y++) {
//如果是空网格
if(cells[x,y].name == "Empty(Clone)") {
//删除空格子
Destroy(cells[x,y]);
//随机创建新格子
cells[x,y] = GameObject.Instantiate(_listOfGems[Random.Range(,_listOfGems.Length)] ) + ,),transform.rotation) as GameObject;
}
}
}
//从左到右
;x <= cells.GetUpperBound();x++) {
//从下到上
;y <= cells.GetUpperBound();y++) {
//将格子移动到指定位置
TweenParms parms = )).Ease(EaseType.EaseOutQuart);
HOTween.To(cells[x,y].transform,.4f,parms);
}
}
}
/// <summary>
/// 创建闪烁特效
/// </summary>
void DoShapeEffect() {
foreach(GameObject row in _currentParticleEffets) {
Destroy(row);
}
;i <= ;i++)
_currentParticleEffets.Add(GameObject.Instantiate(_particleEffect,,_arrayOfShapes.GetUpperBound() + ),Random.Range(,_arrayOfShapes.GetUpperBound() + ),-),,,Random.Range(,1000f),)) as GameObject);
}
}
Main
视频:https://pan.baidu.com/s/1qXYv2Mw
项目:https://pan.baidu.com/s/1i55JGVj
Match 3 小项目学习的更多相关文章
- MOGRE学习笔记(3)--MOGRE小项目练习
学习OGRE有一段时间了,领导为了检测学习效果,根据已有C++项目,弄一个类似的用c#语言编写的小项目. 配置:win7,DirectX2009,vs2010. 项目要求: 1.有Ogre窗口(尺寸1 ...
- 10分钟掌握Python-机器学习小项目
学习机器学习相关技术的最好方式就是先自己设计和完成一些小项目. Python 是一种非常流行和强大的解释性编程语言.不像 R 语言,Python 是个很完整的语言和平台,你既可以用来做研发,也可以用来 ...
- 学习笔记之Python人机交互小项目一:名字管理系统
2020是一个不平凡的一年,但即使挫折不断,我们每学期的课程实训也没有受到影响,仍旧如期实施.与往年不同的是,今年的实训老师是学校邀请的公司在职人员来给我们实训.今年实训的内容是Python语言,下面 ...
- 学习笔记之Python人机交互小项目二:名片管理系统
继上次利用列表相关知识做了简单的人机交互的小项目名字管理系统后,当学习到字典时,老师又让我们结合列表和字典的知识,结合一起做一个名片管理系统,这里分享给在学习Python的伙伴! 1.不使用函数 1 ...
- Java学习笔记三十:Java小项目之租车系统
Java小项目之租车系统 一:项目背景介绍: 根据所学知识,编写一个控制台版的“呱呱租车系统” 功能: 1.展示所有可租车辆: 2.选择车型.租车量: 3.展示租车清单,包含:总金额.总载货量以及其车 ...
- python3开发进阶-Django框架学习前的小项目(一个简单的学员管理系统)
''' 自己独立写一个学员管理系统 表结构: 班级表: -id -grade_name 学生表: -id -student_name -grade 关联外键班级表 老师表: -id -teacher_ ...
- Flask框架的学习与实战(二):实战小项目
昨天写了一篇flask开发环境搭建,今天继续,进行一个实战小项目-blog系统. blog系统很简单,只有一个页面,然而麻雀虽小五脏俱全.这里目的不是为了做项目而做项目,这篇文章本意是通过这次练习传达 ...
- 【Arduino学习笔记05】Arduino数字输入、输出和脉冲宽带调制 -- 小项目:彩色小台灯
基本功能: 长按控制按钮开机,长按控制按钮关机(>3s) 通过三个调节按钮调节灯的颜色,每一个按钮分别对应R,G,B值 模式切换:短按控制按钮切换模式(长亮模式/闪烁模式) 元器件清单: Ard ...
- 基于vue 、vue-router 、firebase的todolist小项目
第一次写博客,都不知道改怎么写的好. 本着一颗学习的心,也希望一段时间后再回来在看看自己写的代码,会不会让自己有种不忍直视的念头 *-* 还是先上图吧~ 这是首页,主要是展示所有的列表页面,可以通过输 ...
随机推荐
- 4.5 C++重载、覆盖和遮蔽
参考:http://www.weixueyuan.net/view/6375.html 总结: 函数签名包括函数名和函数参数的个数.顺序以及参数数据类型. 需要注意的是函数签名并不包含函数返回值部分, ...
- minifilter
暑假刚开始的时候,参照<寒江独钓>这本书,用VS2015写过的一个minifilter的框架,今天在博客上分享出来. VS2015已经有了minifilter的框架模板,直接生成了mini ...
- box-shadow 边框阴影
box-shadow: 0 0 20px #000 inset;
- 1005 继续(3n+1)猜想
卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数.例如对 n=3 进行验证的时 ...
- Android开发 ---Fragment片段布局
前言 Fragment想必大家不陌生吧,在日常开发中,对于Fragment的使用也很频繁,现在主流的APP中,基本的架构也都是一个主页,然后每个Tab项用Fragment做布局,不同选项做切换,使用起 ...
- Java语法基础DayFive
一.继承 1.格式:class 子类 extends 父类 2.好处:提高代码的复用性:让类与类之间产生了关系,是多态的前提. 3.弊端: (1)类的耦合性增强了,而开发的原则是高内聚,低耦合.内聚是 ...
- 5.Python爬虫入门五之URLError异常处理
大家好,本节在这里主要说的是URLError还有HTTPError,以及对它们的一些处理. 1.URLError 首先解释下URLError可能产生的原因: 网络无连接,即本机无法上网 连接不到特定的 ...
- C# 连接EXCEL 和 ACCESS
97-2003版本 EXCEL Provider=Microsoft.Jet.OLEDB.4.0;Data Source=文件位置;Extended Properties=Excel 8.0;HDR= ...
- c#dataGridView 知识
一.单元格内容的操作 // 取得当前单元格内容 Console.WriteLine(DataGridView1.CurrentCell.Value); // 取得当前单元格的列 Index Conso ...
- django面试五
http和https的区别https协议需要到ca申请证书,一般免费证书很少,需要交费. 注:CA - certificate authority,身份认证,权威机构认证,CA认证: http是超文本 ...