Unity 消消樂開發思路

執著GodShadow發表於2021-07-05

以簡單的方式講述遊戲開發思路,暫時沒有實踐,如有錯誤,歡迎各位大佬指錯

關卡資料儲存方式

資料儲存我選用json,可讀性強,解析快

消消樂物體處理方式

消消樂物體我將以預製體的方式使用(把物品拖到Asset資料夾即為預製體)

遊戲每一關初始化

初始化要做的事情:

  1. 把關卡或計時等資訊與UI物件相關聯

  2. 通過Json資料以及Asset存的預製體例項化初始消消樂地圖

玩家遊戲中點選螢幕響應

  1. 判斷點選是否為一個可被消除物品
    method: 可通過Physics2D.OverlapPointAll判斷點選是否包含碰撞體陣列,因為返回的是碰撞體陣列,所以物品身上必須加上一個碰撞體(額,為此如果數量多了可能影響遊戲效能)如果還不明白的話可以看我的這篇文章2d點選獲取物體

  2. 如果點選物品可被消除,則遞迴檢查該物品周圍是否有相同物品,

  3. 如果有相同的物品即可消除,否則返回null

點選螢幕後

  1. 如果有物體被刪除則利用遞迴判斷哪裡下面的物體被刪除,

  2. 然後根據情況往下移動格子,注意每次移動都要遞迴來判斷,哪裡可以繼續移動格子

  3. 移動完成後返回一個bool值true,接著繼續在消消樂地圖上方生成物體,然後移動到指定空格子中,這裡要用遍歷,對地圖內所有物體進行檢查,空的就是要生成並移動到的位置

在這裡給大家推薦一個外掛,叫DOTween,他可以對物體進行移動,旋轉,縮放,漸變等,非常方便,在使用的時候只需要引入DG.Tweening名稱空間即可使用
另外還有一個DOTween Pro我就不給大家介紹了,它就是在DOTween 的基礎上增加了在編輯器中編輯動畫元件,而不是在程式碼中修改,這也是為了技美著想吧!

當然如果你不想看DOTween文件,想快速瞭解,也可以看我的這篇文章關於DOTween的使用

遊戲一些細節效果

  1. 當物體可以被摧毀那麼把可摧毀物體聚集到螢幕中間旋轉,隨之往四面八方移動漸隱

  2. 玩家每次點選螢幕不管點到哪裡都會在點選位置生成粒子特效

  3. 每次點選都會播放音效
    example:

這是一個用於播放音效的單例

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

#region 佛祖保佑
/*
                   _ooOoo_
                  o8888888o
                  88" . "88
                  (| -_- |)
                  O\  =  /O
               ____/`---'\____
             .'  \\|     |//  `.
            /  \\|||  :  |||//  \
           /  _||||| -:- |||||-  \
           |   | \\\  -  /// |   |
           | \_|  ''\---/''  |   |
           \  .-\__  `-`  ___/-. /
         ___`. .'  /--.--\  `. . __
      ."" '<  `.___\_<|>_/___.'  >'"".
     | | :  `- \`.;`\ _ /`;.`/ - ` : | |
     \  \ `-.   \_ __\ /__ _/   .-` /  /
======`-.____`-.___\_____/___.-`____.-'======
                   `=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            佛祖保佑       永無BUG
*/
#endregion

public class SoundManager : MonoBehaviour
{
    public static SoundManager Instance;
    public string[] String_soundsField;
    public AudioClip[] AudioClip_soundsField;
    private AudioSource audioSource;
    private Dictionary<string, AudioClip> Dictionary_sounds = new Dictionary<string, AudioClip>();
    // Start is called before the first frame update
    void Start()
    {
        if (!Instance) Instance = this;
        DontDestroyOnLoad(transform);

        audioSource = transform.GetChild(0).GetComponent<AudioSource>();

        SoundsSetUp();
    }

    private void SoundsSetUp()
    {
        Dictionary_sounds.Clear();
        for (int i = 0; i < String_soundsField.Length; i++)
        {
            Dictionary_sounds.Add(String_soundsField[i], AudioClip_soundsField[i]);
        }
    }

    public void PLaySound(string soundField)
    {
        if (Dictionary_sounds.ContainsKey(soundField))
            audioSource.PlayOneShot(Dictionary_sounds[soundField]);
    }
}

使用時只需在外部呼叫

SoundManager.Instance.PlaySound("AudioClipName");
  1. 在一個遊戲管理類中設定一個整數Score,以及每一關Score線,當超過分數線比如及格,優秀,滿分,就會播放不同的音效,或接著生成煙花粒子,並且同時在螢幕中心生成一個五角星,然後快速移動到螢幕上方設定的每一關星星數量那裡,如果按及格優秀,滿分來分 分數線那麼星星滿星為三顆

  2. 因為遊戲內基本都是用的熱更新,不過我今天再介紹一個遊戲內部更新的方式,需要你對Android互動有一定的瞭解

相關文章