从零开始制作基于Unity引擎的宝石消消乐(二)
完整项目我已经放到GitHub啦~
GitHub: https://github.com/lucaschen1993/Lukastar
前言
上一篇文章说到游戏的设计,现在就来讲一讲游戏内操作方法的实现。
实现方法
1. Jewel.cs
在Jewel.cs中,主要是通过实现UnityEventSystem中的三个接口:IPointerEnterHandler,IPointerExitHandler,IPointerClickHandler,在OnPointerEnter与OnPointerExit中,控制光标在Jewel的移进或者移出时,选择框Select的显示或者消失。
public void OnPointerEnter(PointerEventData eventData){if(!isSelected)transform.Find("Select").gameObject.SetActive(true);}public void OnPointerExit(PointerEventData eventData){if(!isSelected)transform.Find("Select").gameObject.SetActive(false);}
接着是OnPointerClick的作用就是控制Jewel的选中以及取消选中,在Jewel选中的时候判断JewelManager中的lastSelected是否为空,是则赋值给lastSelected。如果lastSelected不为空则赋值给currentSelected。
PS:这里的本意是通过JewelManager来保存两个Jewel对象,来实现两个Jewel的交换。
public void OnPointerClick(PointerEventData eventData){if(GameManager.Instance.canSelect){AudioManager.Instance.PlayAudio("Audio/sfx_click");//该宝石没有被选择,选中宝石if (!isSelected){isSelected = true;transform.Find("Select").gameObject.SetActive(true);if (!JewelsManager.Instance.lastSelected){JewelsManager.Instance.lastSelected = gameObject;}else if (!JewelsManager.Instance.currentSeleted){JewelsManager.Instance.currentSeleted = gameObject;//调用宝石交换函数JewelsManager.Instance.CallExchangeJewel();}}else if (isSelected){isSelected = false;transform.Find("Select").gameObject.SetActive(false);JewelsManager.Instance.ResetAllJewelSelected();}}}
最后是两个Jewel交换的时候的Move方法以及Move的协程MoveCoroutine,通过使用协程来控制,移动交换的时间间隔。控制具体操作是先找到该对象的子对象,再把该子对象赋值给目标对象,最后再调用DOTween插件的DOLocalMove方法把该子对象移动到目标对象的Vector3.zero位置。
public void Move(GameObject obj){if(moveCoroutine!=null){StopCoroutine(moveCoroutine);}moveCoroutine = MoveCoroutine(obj);StartCoroutine(moveCoroutine);}private IEnumerator MoveCoroutine(GameObject obj){GameObject childObj = gameObject.transform.Find("JewelPicture").gameObject;childObj.transform.SetParent(obj.transform);childObj.transform.DOLocalMove(Vector3.zero, GameManager.Instance.moveDownTime);yield return new WaitForSeconds(GameManager.Instance.moveDownTime);}
2. JewelManager.cs
JewelManager主要是用来管理Jewel的操作的,主要的操作方法有交换ExchangeJewel,判断俩Jewel是否相邻的IsConnected,恢复两个Jewel的原始位置ResetOriginJewel,以及重置所有Jewel的选择ResetAllJewelSelected。
先说ExchangeJewel,我把它设计成一个协程来控制Jewel移动时候的动画时间间隔,不然会出现闪现的效果。它通过CallExchangeJewel唤醒,在CallExchangeJewel的方法中,通过调用IsConnected判断JewelManager中的currentSelected以及lastSelected是否相邻来决定是否启用协程,若不相邻,则重置所有Jewel的选中。若两者相邻,则启用协程ExchangeJewel。
public void CallExchangeJewel(){bool isConnected = IsConnected(currentSeleted, lastSelected);//相邻才能交换if (isConnected){StartCoroutine(ExchangeJewel(currentSeleted, lastSelected));}else{ResetAllJewelSelected();}}IEnumerator ExchangeJewel(GameObject obj1, GameObject obj2){GameManager.Instance.canSelect = false;if (obj1 != obj2){GameObject tempObj = obj1;//DoTween制作宝石交换动画obj1.GetComponent<Jewel>().Move(obj2);obj2.GetComponent<Jewel>().Move(tempObj);}yield return new WaitForSeconds(0.4f);GameManager.Instance.canSelect = true;//非重置情况调用MatchRuleif(isReset==false){GameManager.Instance.MatchRule();}//如果是重置的情况,把重置状态设置为falseelse if(isReset == true){isReset = false;}}
最后强调一下里面的isReset就是判断是否调用过了ResetOriginJewel,因为调用了,ResetOriginJewel就证明了两者是不匹配的,所以不需要调用到GameManager中的MatchRule匹配方法了。
public void ResetOriginJewel(){isReset = true;AudioManager.Instance.PlayAudio("Audio/sfx_lock");//启用协程,让两个Jewel回到原来的位置StartCoroutine(ExchangeJewel(lastSelected, currentSeleted));ResetAllJewelSelected();GameManager.Instance.canSelect = true;}
接下来是ResetAllJewelSelected以及IsConnected的具体方法。ResetAllJewelSelected是用来重置所有选择的,IsConnected是判断两个对象是否相邻。
public void ResetAllJewelSelected(){lastSelected = currentSeleted = null;GameManager.Instance.SetAllJewelSelectedIsFalse();}public bool IsConnected(GameObject obj1,GameObject obj2){Vector3 obj1Position = GameManager.Instance.GetJewelPosition(obj1);Vector3 obj2Position = GameManager.Instance.GetJewelPosition(obj2);return ((obj1Position.x == obj2Position.x && Mathf.Abs(obj1Position.y - obj2Position.y) == 1) || (obj1Position.y == obj2Position.y && Mathf.Abs(obj1Position.x - obj2Position.x) == 1)) ? true : false;}
总结
以上就是游戏具体操作的实现方法,接下来将要讲游戏核心玩法的实现。
从零开始制作基于Unity引擎的宝石消消乐(二)相关推荐
- 从零开始制作基于Unity引擎的宝石消消乐(一)
完整项目我已经放到GitHub啦~ GitHub: https://github.com/lucaschen1993/Lukastar 市场上有些消消乐真好玩,比如hxxxxxpop,pxxxxsag ...
- 从零开始制作基于Unity引擎的宝石消消乐(三)
完整项目我已经放到GitHub啦~ GitHub: https://github.com/lucaschen1993/Lukastar 前言 前两篇把消消乐的设计以及基本操作的方法都讲了,这章开始讲消 ...
- 基于Unity引擎利用OpenCV和MediaPipe的面部表情和人体运动捕捉系统
基于Unity引擎利用OpenCV和MediaPipe的面部表情和人体运动捕捉系统 前言 项目概述 项目实现效果 2D面部表情实时捕捉 3D人体动作实时捕捉 补充 引用 前言 之前做的一个项目--使用 ...
- 基于Unity引擎的2D像素风Roguelike地下城游戏Demo
文章目录 前言 一.场景搭建 1.基础房间 2.随机房间的生成 3.门与墙的生成 4.小地图 5.摄像机在房间之间的转移 二.人物制作 1.基础设定 2.人物动画 3.基础移动 4.攻击动作 三.战斗 ...
- 基于Unity引擎的2D像素风Roguelike地下城游戏模块之————背包系统
文章目录 前言 一.基本界面与逻辑 二.数据管理 三.捡拾物品 四.拖拽功能 1.一些准备与修改 2.拖拽的实现(DragHandler接口) 3.背包界面的拖拽 4.数据的完善 五.一些优化 总结 ...
- 纪念碑谷复刻教程 - 基于Unity引擎
目录 前言 视觉错位效果 寻路系统 PathNode Agent PathManager ClickEffect 旋转机关 Rotator RotatorActivator 工程链接 前言 之前一直很 ...
- 基于Unity的弹幕游戏多人联机尝试
给一个已经定型的游戏添加哪怕是一个小特性,都是棘手的事情,很容易引入新的bug,或者破坏已有的功能.复杂的联网更是如此,它涉及到的改动几乎遍及系统的方方面面.玩家的一举一动都需要在其他人的屏幕上展现出 ...
- 原来这些热门游戏都基于Unity开发,为何Unity集训营越来越受欢迎?
5月,几乎是国内游戏圈最热闹的时刻之一.过去30天内,行业两大巨头--腾讯和网易先后在线上举行年度游戏发布会,带来了近百款游戏的最新消息,也引发了从业人员对Unity引擎的再次热议. 腾讯游戏,网易游 ...
- 奇虎360支持Unity引擎 将推3D页游无插件安装
导读:奇虎360与Unity引擎合作,欲在今年9月推出3D画面网页游戏.游戏将实现"即点即用"的无插件体验. 新浪游戏讯 5月30日消息,奇虎360今日召开媒体发布会,宣布与Uni ...
最新文章
- 仅需10分钟:开启你的机器学习之路
- C语言数组作为传入参数
- 博客之星活动,我在行动
- 用Silverlight做广告Banner
- swift:创建表格UITableView
- 前端学习(3302):createRef
- Android App 优化之 ANR 详解
- mysqldump使用详解
- mysql创建备份文件,MySQL定时备份操作
- JQuery window、document、 body
- 数据分析笔试题(网易,阿里,京东...)
- HackerRank 算法刷题笔记(一),基于Go语言
- CSS-div圆角被内部元素覆盖问题
- websockets 和 socketio 的比较
- “致广大而尽精微,极高明而道中庸。”
- 江苏省无锡市高二计算机小高考,江苏新高考高二还要考小高考吗?江苏新高考高中怎么分科?...
- 【力扣-动态规划入门】【第 4 天】45. 跳跃游戏 II
- Qt实现无边框可以拖拽拉伸
- R语言ggplot2可视化为轴标签添加下标实战:符号下标、百分比下标、带括号的下标
- GICv3软件overview手册之GICv4对虚拟LPI的直接注入(1)