日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/1/1 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从零开始制作基于Unity引擎的宝石消消乐(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
完整項目我已經放到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引擎的宝石消消乐(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。