­

Unity 消消乐开发思路

以简单的方式讲述游戏开发思路,暂时没有实践,如有错误,欢迎各位大佬指错

关卡数据保存方式

数据保存我选用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交互有一定的了解

Tags: