完整项目我已经放到GitHub啦~
GitHub: https://github.com/lucaschen1993/Lukastar

前言

上一篇文章说到游戏的设计,现在就来讲一讲游戏内操作方法的实现。

实现方法

1. Jewel.cs

Jewel.cs中,主要是通过实现UnityEventSystem中的三个接口:IPointerEnterHandler,IPointerExitHandler,IPointerClickHandler,在OnPointerEnterOnPointerExit中,控制光标在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引擎的宝石消消乐(二)相关推荐

  1. 从零开始制作基于Unity引擎的宝石消消乐(一)

    完整项目我已经放到GitHub啦~ GitHub: https://github.com/lucaschen1993/Lukastar 市场上有些消消乐真好玩,比如hxxxxxpop,pxxxxsag ...

  2. 从零开始制作基于Unity引擎的宝石消消乐(三)

    完整项目我已经放到GitHub啦~ GitHub: https://github.com/lucaschen1993/Lukastar 前言 前两篇把消消乐的设计以及基本操作的方法都讲了,这章开始讲消 ...

  3. 基于Unity引擎利用OpenCV和MediaPipe的面部表情和人体运动捕捉系统

    基于Unity引擎利用OpenCV和MediaPipe的面部表情和人体运动捕捉系统 前言 项目概述 项目实现效果 2D面部表情实时捕捉 3D人体动作实时捕捉 补充 引用 前言 之前做的一个项目--使用 ...

  4. 基于Unity引擎的2D像素风Roguelike地下城游戏Demo

    文章目录 前言 一.场景搭建 1.基础房间 2.随机房间的生成 3.门与墙的生成 4.小地图 5.摄像机在房间之间的转移 二.人物制作 1.基础设定 2.人物动画 3.基础移动 4.攻击动作 三.战斗 ...

  5. 基于Unity引擎的2D像素风Roguelike地下城游戏模块之————背包系统

    文章目录 前言 一.基本界面与逻辑 二.数据管理 三.捡拾物品 四.拖拽功能 1.一些准备与修改 2.拖拽的实现(DragHandler接口) 3.背包界面的拖拽 4.数据的完善 五.一些优化 总结 ...

  6. 纪念碑谷复刻教程 - 基于Unity引擎

    目录 前言 视觉错位效果 寻路系统 PathNode Agent PathManager ClickEffect 旋转机关 Rotator RotatorActivator 工程链接 前言 之前一直很 ...

  7. 基于Unity的弹幕游戏多人联机尝试

    给一个已经定型的游戏添加哪怕是一个小特性,都是棘手的事情,很容易引入新的bug,或者破坏已有的功能.复杂的联网更是如此,它涉及到的改动几乎遍及系统的方方面面.玩家的一举一动都需要在其他人的屏幕上展现出 ...

  8. 原来这些热门游戏都基于Unity开发,为何Unity集训营越来越受欢迎?

    5月,几乎是国内游戏圈最热闹的时刻之一.过去30天内,行业两大巨头--腾讯和网易先后在线上举行年度游戏发布会,带来了近百款游戏的最新消息,也引发了从业人员对Unity引擎的再次热议. 腾讯游戏,网易游 ...

  9. 奇虎360支持Unity引擎 将推3D页游无插件安装

    导读:奇虎360与Unity引擎合作,欲在今年9月推出3D画面网页游戏.游戏将实现"即点即用"的无插件体验. 新浪游戏讯 5月30日消息,奇虎360今日召开媒体发布会,宣布与Uni ...

最新文章

  1. 仅需10分钟:开启你的机器学习之路
  2. C语言数组作为传入参数
  3. 博客之星活动,我在行动
  4. 用Silverlight做广告Banner
  5. swift:创建表格UITableView
  6. 前端学习(3302):createRef
  7. Android App 优化之 ANR 详解
  8. mysqldump使用详解
  9. mysql创建备份文件,MySQL定时备份操作
  10. JQuery window、document、 body
  11. 数据分析笔试题(网易,阿里,京东...)
  12. HackerRank 算法刷题笔记(一),基于Go语言
  13. CSS-div圆角被内部元素覆盖问题
  14. websockets 和 socketio 的比较
  15. “致广大而尽精微,极高明而道中庸。”
  16. 江苏省无锡市高二计算机小高考,江苏新高考高二还要考小高考吗?江苏新高考高中怎么分科?...
  17. 【力扣-动态规划入门】【第 4 天】45. 跳跃游戏 II
  18. Qt实现无边框可以拖拽拉伸
  19. R语言ggplot2可视化为轴标签添加下标实战:符号下标、百分比下标、带括号的下标
  20. GICv3软件overview手册之GICv4对虚拟LPI的直接注入(1)

热门文章

  1. 百威携手挪威设计师推出七夕限定款亲吻瓶
  2. Mindjet MindManager for Mac 12.1.191中文版 — 思维导图工具
  3. 如何在轻量云上创建协同办公云文档
  4. Hypermedia模型是什么
  5. Window 10优化:加快PC速度的13种方法
  6. 一个老工程师的心理话(转)
  7. dm3730 android,DM3730/AM3715处理器开发板
  8. 评论:暗黑破坏神3新拍卖行手续费结构
  9. 2023年西安电子科技大学微电子学院集成电路工程专业考研经验分享
  10. 用python写的修改内存值的一代代码(举例植物大战僵尸中文版)