2048制作过程

主要内容:

1、2048制作流程图

2、2048具体制作脑图

3、代码部分


演示:


正文:

1、2048制作流程图如下:

 

2、2048制作脑图如下:

3、代码如下:

 Const

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

//定义相关的常量
public class Const
{
    public const string GameModel = "game_Model";   //游戏模式 4*4  5*5  6*6
    public const string Sound = "Sound";            //音效 
    public const string Music = "Music";            //音乐

    public const string BestScore = "BestScore";    //最高分
}

 

MoveType

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

public enum MoveType
{
   RIGHT,
   LEFT,
   UP,
   DOWN
}

 

NumberStatus

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

public enum NumberStatus
{
    Normal,     //正常状态
    NotMerge,   //不能合并
}

 

StepModel

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

public class StepModel
{

    public int score;        //分数
    public int bestScore;    //最高分

    public int[][] numbers;   //二维数组保存对应的数字

    //更新数据
    public void UpdateData( int score, int bestScore, MyGrid[][] grids )
    {
        this.score = score;
        this.bestScore = bestScore;

        if (numbers == null)
        {
            numbers = new int[grids.Length][];
        }

        for (int i = 0; i < grids.Length; i++)
        {
            for (int j = 0; j < grids[i].Length; j++)
            {
                if (numbers[i] == null)
                {
                    numbers[i] = new int[grids[i].Length];
                }
                numbers[i][j] = grids[i][j].IsHaveNumber() ? grids[i][j].GetNumber().GetNumber():0;
            }
        }
    }
}

 

MyGrid

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

public class MyGrid : MonoBehaviour
{

    public Number number;    //当前格子的数字

    //判断是否有数字
    public bool IsHaveNumber()
    {
        return number != null;
    }

    //获取格子的数字
    public Number GetNumber()
    {
        return number;
    }
    
    //设置数字
    public void SetNumber(Number number)
    {
        this.number = number;
    }

}

 

Number

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

public class Number : MonoBehaviour
{
    Image bg;
    Text number_text;
    MyGrid inGrid;    //这个数字所在的格子

    public NumberStatus status { get; set; }
    
    private float spawnScaleTime = 1;
    private bool isPlayingSpawnAnim = false;

    private float mergeSceleTime = 1;
    private float mergeSceleTimeBack = 1;
    private bool isPlayingMergeAnim = false;

    private float movePosTime = 1;
    private bool isMoving = false;
    private bool isDestroyOnMoveEnd = false; 
    private Vector3 startMove, endMovePos;

    public Color[] bg_colors;
    public List<int> number_index;

    AudioClip mergeClip;

    private void Awake() 
    {
        bg = GetComponent<Image>();
        number_text = transform.Find("Text").GetComponent<Text>();
    }

    private void Start()
    {
        mergeClip = Resources.Load<AudioClip>("AudioOfMerge");

    }

    private void Update()
    {
        //创建动画——时变大动画
        if (isPlayingSpawnAnim)
        {
            if (spawnScaleTime <= 1)
            {
                spawnScaleTime += Time.deltaTime * 4;
                transform.localScale = Vector3.Lerp(Vector3.one * 0.3f, Vector3.one, spawnScaleTime);
            }
        }
        else
        {
            isPlayingSpawnAnim = false;
        }

        //合并动画
        if (isPlayingMergeAnim)
        {
            //销毁时先变大在缩小——变大过程
            if (mergeSceleTime <= 1 && mergeSceleTimeBack == 0)
            {
                mergeSceleTime += Time.deltaTime * 4;
                transform.localScale = Vector3.Lerp(Vector3.one, Vector3.one * 1.2f, mergeSceleTime);
            }
            //销毁时先变大在缩小——缩小过程
            if (mergeSceleTime >= 1 && mergeSceleTimeBack <= 1)
            {
                mergeSceleTimeBack += Time.deltaTime * 4;
                transform.localScale = Vector3.Lerp(Vector3.one * 1.2f, Vector3.one, mergeSceleTime);
            }
            if (mergeSceleTime >= 1 && mergeSceleTimeBack >=1 )
            {
                isPlayingMergeAnim = false;
            }
        }

        //移动动画
        if ( isMoving )
        {
            movePosTime += Time.deltaTime * 4;
            transform.localPosition = Vector3.Lerp(startMove, Vector3.zero, movePosTime);
            if (movePosTime >= 1)
            {
                isMoving = false;
                if (isDestroyOnMoveEnd)
                {
                    GameObject.Destroy(gameObject);
                }
            }
        }

    } 



    //初始化
    public void Init( MyGrid myGrid )
    {
        myGrid.SetNumber(this);
        // 设置所在的格子
        this.SetGrid(myGrid);
        //初始化数字
        this.SetNumber(2);
        status = NumberStatus.Normal;

        PlaySpawnAnim();  //播放动画
    }


    //设置格子
    public void SetGrid(MyGrid myGrid)
    {
        this.inGrid = myGrid;
    }

    //获取格子
    public MyGrid GetGrid()
    {
        return this.inGrid;
    }

    //设置数字
    public void SetNumber(int number)
    {
        this.number_text.text = number.ToString();
        
        this.bg.color = this.bg_colors[number_index.IndexOf(number)];
    }

    //获取数字
    public int GetNumber()
    {
        return int.Parse(number_text.text);
    }

    //把数字移动到某一个格子的下面
    public void MoveToGrid( MyGrid myGrid)
    {
        transform.SetParent(myGrid.transform);     //设置父物体
        //transform.localPosition = Vector3.zero;    //局部坐标设置为0,0
        startMove = transform.localPosition;
        //endMovePos = myGrid.transform.position;

        movePosTime = 0; 
        isMoving = true;

        this.GetGrid().SetNumber(null);

        //设置格子
        myGrid.SetNumber(this);
        this.SetGrid(myGrid);
    }

    //合并数字
    public void Merge()
    {
        GamePanel gamePanel = GameObject.Find("Canvas/GamePanel").GetComponent<GamePanel>();
        gamePanel.AddScore(this.GetNumber());

        int number = this.GetNumber() * 2;
        this.SetNumber(number);
        if (number == 2048)
        {
            //游戏胜利
            gamePanel.GameWin();
        }

        status = NumberStatus.NotMerge;
        //播放合并动画
        PlayMergeAnim();

        //播放音效
        AudioManager._instance.PlaySound(mergeClip);

    }

    //判断能不能合并
    public bool IsMerge( Number number)
    {
        if (this.GetNumber() == number.GetNumber() && number.status == NumberStatus.Normal)
        {
            return true;
        }
        return false;
    }

    //播放创建动画
    public void PlaySpawnAnim()
    {
        spawnScaleTime = 0;
        isPlayingSpawnAnim = true;
    }

    //播放合并的动画
    public void PlayMergeAnim()
    {
        mergeSceleTime = 0;
        mergeSceleTimeBack = 0;
        isPlayingMergeAnim = true;
    }

    //移动后进行销毁
    public void DestroyOnEnd( MyGrid myGrid)
    {
        transform.SetParent(myGrid.transform);
        startMove = transform.localPosition;
        movePosTime = 0;
        isMoving = true;
        isDestroyOnMoveEnd = true;
    }
}

 

GamePanel

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;


public class GamePanel : MonoBehaviour
{

    #region UI控件 
    Text text_Score;      //分数
    Text text_BestScore;  //最高分
    Button btn_LastStep;  //上一步
    Button btn_Restart;   //重新开始
    Button btn_ExitStep;  //下一步

    WinPanel winPanel; //赢的界面
    LosePanel losePanel; //输的界面
    #endregion

    #region 属性 变量
    Transform gridParents;       //格子父物体
    Dictionary<int, int> grid_config = new Dictionary<int, int>() { { 4, 100 }, { 5, 80 }, { 6, 65 } };

    private int row;       //
    private int column;    //
    public MyGrid[][] grids = null;  //所有的格子
    public List<MyGrid> canCreateNumberGrid = new List<MyGrid>();  // 可以创建数字的格子

    GameObject gridPrefab;
    GameObject numberPrefab;

    private Vector3 pointerDownPos, pointerUpPos;

    private bool isNeedCreateNumber = false;

    public int currentScore;
    public StepModel lastStepModel;

    AudioClip bgClip;

    #endregion

    #region 游戏周期


    private void Awake()
    {
        bgClip = Resources.Load<AudioClip>("Water");
        text_Score = transform.Find("Score/Text (1)").GetComponent<Text>();
        text_BestScore = transform.Find("BestScore/Text (1)").GetComponent<Text>();
        btn_LastStep =transform.Find("Btn_Last").GetComponent<Button>();
        btn_LastStep.onClick.AddListener(OnLastClick);
        btn_Restart = transform.Find("Btn_Restart").GetComponent<Button>();
        btn_Restart.onClick.AddListener(RestartGame);
        btn_ExitStep = transform.Find("Btn_Exit").GetComponent<Button>();
        btn_ExitStep.onClick.AddListener(ExitGame);
        winPanel = GameObject.Find("WinPanel").GetComponent<WinPanel>();
        losePanel = GameObject.Find("LosePanel").GetComponent<LosePanel>();
        gridParents = transform.Find("Grid");
        gridPrefab = Resources.Load<GameObject>("Prefabs/Item");
        numberPrefab = Resources.Load<GameObject>("Prefabs/Number");

        //初始化界面信息
        InitPanelMessage();

        //初始化格子
        InitGrid();
        //创建第一个数字
        CreateNumber();
    }

    #endregion


    #region 游戏逻辑

    //初始化格子
    public void InitGrid()
    {


        //获取格子数量
        int gridNum = PlayerPrefs.GetInt(Const.GameModel, 4);
        GridLayoutGroup gridLayoutGroup = transform.Find("Grid").GetComponent<GridLayoutGroup>();
        gridLayoutGroup.constraintCount = gridNum;
        gridLayoutGroup.cellSize = new Vector2(grid_config[gridNum], grid_config[gridNum]);

        //初始化格子的数量
        grids = new MyGrid[gridNum][];

        //创建格子
        row = gridNum;
        column = gridNum;

        for (int i = 0; i < row; i++)
        {
            for (int j = 0; j < column; j++)
            {
                //创建 i j 格子
                if (grids[i] == null)
                {
                    grids[i] = new MyGrid[gridNum];
                }
                grids[i][j] = CreateGrid();
            }
        }
    }

    //创建格子
    public MyGrid CreateGrid()
    {
        //实例化格子预制体
        GameObject gameObject = GameObject.Instantiate(gridPrefab, gridParents);

        return gameObject.GetComponent<MyGrid>();
    }

    //创建数字
    public void CreateNumber()
    {
        //找到这个数字所在的格子
        canCreateNumberGrid.Clear();
        for (int i = 0; i < row; i++)
        {
            for (int j = 0; j < column; j++)
            {
                //判断格子里是否有数字,如果没有数字,就将其加入到没有数字的集合中去
                if (!grids[i][j].IsHaveNumber())
                {
                    //判断这个格子里有没有数字
                    //如果没有数字
                    canCreateNumberGrid.Add(grids[i][j]);
                }
            }
        }

        //如果可创建数字的格子为0,就不创建数字了
        if (canCreateNumberGrid.Count == 0)
        {
            return;
        }

        //随机一个格子
        int index = Random.Range(0, canCreateNumberGrid.Count);

        //在随机的格子里创建数字
        GameObject gameObj = GameObject.Instantiate(numberPrefab, canCreateNumberGrid[index].transform);
        gameObj.GetComponent<Number>().Init(canCreateNumberGrid[index]);

        //创建数字 将数字放入

    }

    public void CreateNumber( MyGrid myGrid , int number )
    {
        GameObject gameObj = GameObject.Instantiate(numberPrefab, myGrid.transform);
        gameObj.GetComponent<Number>().Init(myGrid);
        gameObj.GetComponent<Number>().SetNumber(number);
    }

    //计算移动的类型
    public MoveType CaculateMoveType()
    {
        if (Mathf.Abs(pointerUpPos.x - pointerDownPos.x) > Mathf.Abs(pointerDownPos.y - pointerUpPos.y))
        {
            //左右移动
            if (pointerUpPos.x - pointerDownPos.x > 0)
            {
                //向右移动
                //Debug.Log("向右移动");
                return MoveType.RIGHT;
            }
            else
            {
                //向左移动
                //Debug.Log("向左移动");
                return MoveType.LEFT;
            }
        }
        else
        {
            //上下移动
            if (pointerUpPos.y - pointerDownPos.y > 0)
            {
                //向上移动
                //Debug.Log("向上移动");
                return MoveType.UP;
            }
            else
            {
                //向下移动
                //Debug.Log("向下移动");
                return MoveType.DOWN;
            }
        }
    }

    //移动数字
    public void MoveNumber(MoveType moveType)  //参数知晓移动类型
    {
        switch (moveType)
        {
            case MoveType.RIGHT:

                for (int i = 0; i < row; i++)
                {
                    for (int j = column - 2; j >= 0; j--)
                    {
                        //判断格子是否有数字  有数字就进行 接下来循环(格子里是否有数字/有数字是否要合并格子并销毁数字)
                        if (grids[i][j].IsHaveNumber())
                        {

                            Number number = grids[i][j].GetNumber();

                            //Debug.Log("坐标:" + i + "," + j);
                            for (int m = j + 1; m < column; m++)
                            {
                                Number targetNumber = null;
                                if (grids[i][m].IsHaveNumber())
                                {
                                    targetNumber = grids[i][m].GetNumber();
                                }

                                HandelNumber(number, targetNumber, grids[i][m]);

                                if (targetNumber != null)   //如果没有数字跳出循环
                                {
                                    break;
                                }
                            }
                        }
                    }
                }
                break;
            case MoveType.LEFT:

                for (int i = 0; i < row; i++)
                {
                    for (int j = 1; j < column; j++)
                    {
                        //判断格子是否有数字  有数字就进行 接下来循环(格子里是否有数字/有数字是否要合并格子并销毁数字)
                        if (grids[i][j].IsHaveNumber())
                        {

                            Number number = grids[i][j].GetNumber();

                            //Debug.Log("坐标:" + i + "," + j);
                            for (int m = j - 1; m >= 0; m--)
                            {
                                Number targetNumber = null;
                                if (grids[i][m].IsHaveNumber())
                                {
                                    targetNumber = grids[i][m].GetNumber();
                                }

                                HandelNumber(number, targetNumber, grids[i][m]);

                                if (targetNumber != null)   //如果没有数字跳出循环
                                {
                                    break;
                                }
                            }
                        }
                    }
                }
                break;
            case MoveType.UP:

                for (int j = 0; j < column; j++)
                {
                    for (int i = 0; i < row; i++)
                    {
                        //判断格子是否有数字  有数字就进行循环
                        if (grids[i][j].IsHaveNumber())
                        {

                            Number number = grids[i][j].GetNumber();

                            //Debug.Log("坐标:" + i + "," + j);

                            for (int m = i - 1; m >= 0; m--)
                            {

                                Number targetNumber = null;
                                if (grids[m][j].IsHaveNumber())
                                {
                                    targetNumber = grids[m][j].GetNumber();
                                }

                                HandelNumber(number, targetNumber, grids[m][j]);

                                if (targetNumber != null)   //如果没有数字跳出循环
                                {
                                    break;
                                }
                            }
                        }
                    }
                }

                break;
            case MoveType.DOWN:

                for (int j = 0; j < column; j++)
                {
                    for (int i = row - 2; i >= 0; i--)
                    {
                        //判断格子是否有数字  有数字就进行 接下来循环(格子里是否有数字/有数字是否要合并格子并销毁数字)
                        if (grids[i][j].IsHaveNumber())
                        {

                            Number number = grids[i][j].GetNumber();

                            //Debug.Log("坐标:" + i + "," + j);
                            for (int m = i + 1; m < row; m++)
                            {
                                Number targetNumber = null;
                                if (grids[m][j].IsHaveNumber())
                                {
                                    targetNumber = grids[m][j].GetNumber();
                                }
                                HandelNumber(number, targetNumber, grids[m][j]);

                                if (targetNumber != null)   //如果没有数字跳出循环
                                {
                                    break;
                                }
                            }
                        }
                    }
                }
                break;
        }
    }

    //处理数字
    public void HandelNumber(Number current, Number target, MyGrid targetGrid)
    {
        if (target != null)
        {
            //判断 是否可以合并
            if (current.IsMerge(target))
            {
                target.Merge();

                //销毁当前数字
                current.GetGrid().SetNumber(null);
                //GameObject.Destroy(current.gameObject);
                current.DestroyOnEnd(target.GetGrid());
                isNeedCreateNumber = true;
            }
        }
        else
        {
            //没有数字
            current.MoveToGrid(targetGrid);
            isNeedCreateNumber = true;
        }
    }

    //重置数字的状态
    public void ResetNumberStatus()
    {
        //遍历所有数字
        for (int i = 0; i < row; i++)
        {
            for (int j = 0; j < column; j++)
            {
                if (grids[i][j].IsHaveNumber())
                {
                    grids[i][j].GetNumber().status = NumberStatus.Normal;
                }
            }
        }
    }

    //判断游戏是否失败
    public bool IsGameLose()
    {
        //判断格子是否满了
        for (int i = 0; i < row; i++)
        {
            for (int j = 0; j < column; j++)
            {
                if (!grids[i][j].IsHaveNumber())
                {
                    return false;
                }
            }
        }
        //判断有没有数字能够合并
        for (int i = 0; i < row; i += 2)
        {
            for (int j = 0; j < column; j ++)
            {
                MyGrid up = IsHaveGrid(i - 1, j) ? grids[i - 1][j] : null;
                MyGrid down = IsHaveGrid(i + 1, j) ? grids[i + 1][j] : null;
                MyGrid left = IsHaveGrid(i, j - 1) ? grids[i][j - 1] : null;
                MyGrid right = IsHaveGrid(i, j + 1) ? grids[i][j + 1] : null;

                if (up != null)
                {
                    if (grids[i][j].GetNumber().IsMerge(up.GetNumber()))
                    {
                        return false;
                    }
                }

                if (down != null)
                {
                    if (grids[i][j].GetNumber().IsMerge(down.GetNumber()))
                    {
                        return false;
                    }
                }

                if (left != null)
                {
                    if (grids[i][j].GetNumber().IsMerge(left.GetNumber()))
                    {
                        return false;
                    }
                }

                if (right != null)
                {
                    if (grids[i][j].GetNumber().IsMerge(right.GetNumber()))
                    {
                        return false;
                    }
                }
            }
        }
        return true; //游戏失败
    }
    
    //判断是否有空格子
    public bool IsHaveGrid(int i, int j)
    {
        if (i >= 0 && i<row && j>= 0 && j<column)
        {
            return true;
        }
        return false;
    }

    #endregion 

    #region 事件监听

    //鼠标点击
    public void OnPointerDown()
    {
        pointerDownPos = Input.mousePosition;
    }

    //鼠标抬起
    public void OnPointerUp()
    {
        pointerUpPos = Input.mousePosition;

        //判断 移动距离小时是无效操作
        if (Vector3.Distance(pointerDownPos, pointerUpPos) < 100)
        {
            Debug.Log("无效操作");
            return;
        }

        //保存数据
        lastStepModel.UpdateData(this.currentScore, PlayerPrefs.GetInt(Const.BestScore, 0), grids);
        btn_LastStep.interactable = true;

        //计算移动类型
        MoveType moveType = CaculateMoveType();
        Debug.Log("移动类型:" + moveType);
        MoveNumber(moveType);

        //产生数字
        if (isNeedCreateNumber)
        {
            CreateNumber();
        }

        //把所有数字的状态恢复成正常状态
        ResetNumberStatus();
        isNeedCreateNumber = false;

        //判断游戏是否结束
        if (IsGameLose())
        {
            GameLose();
        }


    }

    //上一步
    public void OnLastClick()
    {
        BackToLastStep();
        btn_LastStep.interactable = false;
    }
    #endregion

    #region 界面更新

    //初始化界面信息
    public void InitPanelMessage()
    {
        this.text_BestScore.text = PlayerPrefs.GetInt(Const.BestScore, 0).ToString();
        lastStepModel = new StepModel();
        btn_LastStep.interactable = false;

        //播放音乐
        AudioManager._instance.PlayMusic(bgClip);
    }

    //分数增加
    public void AddScore( int score )
    {
        currentScore += score ;
        UpdateScore(currentScore);

        //判断当前分数是否是最高分
        if (currentScore > PlayerPrefs.GetInt(Const.BestScore,0))
        {
            PlayerPrefs.SetInt(Const.BestScore, currentScore);
            UpdateBestScore(currentScore);
        }
    }

    //更新分数
    public void UpdateScore( int score )
    {
        this.text_Score.text = score.ToString();
    }

    //重置分数
    public void ResetScore()
    {
        currentScore = 0;
        UpdateScore(currentScore);
    }

    //最高分
    public void UpdateBestScore( int bestScore )
    {
        this.text_BestScore.text = bestScore.ToString();
    }

    #endregion

    #region 游戏流程

    //返回到上一步
    public void BackToLastStep()
    {
        //分数
        currentScore = lastStepModel.score;
        UpdateScore(lastStepModel.score);

        PlayerPrefs.SetInt(Const.BestScore, lastStepModel.bestScore);
        UpdateBestScore(lastStepModel.bestScore);

        //数字
        for (int i = 0; i < row; i++)
        {
            for (int j = 0; j < column; j++)
            {
                if (lastStepModel.numbers[i][j] == 0 && grids[i][j].IsHaveNumber())
                {
                    if (grids[i][j].IsHaveNumber())
                    {
                        GameObject.Destroy(grids[i][j].GetNumber().gameObject);
                        grids[i][j].SetNumber(null);
                    }
                }
                else if (lastStepModel.numbers[i][j] != 0 )
                { 
                    if (grids[i][j].IsHaveNumber())
                    {
                        //修改数字
                        grids[i][j].GetNumber().SetNumber(lastStepModel.numbers[i][j]);
                    }
                    else
                    {
                        //创建数字
                        CreateNumber(grids[i][j],lastStepModel.numbers[i][j]);
                    }
                }
                
            }
        }
    }

    //重新开始
    public void RestartGame()
    {
        //数据清空
        btn_LastStep.interactable = false;
        //清空分数
        ResetScore();
        //清空数字
        for (int i = 0; i < row; i++)
        {
            for (int j = 0; j < column; j++)
            {
                if (grids[i][j].GetNumber() != null)
                {
                    GameObject.Destroy(grids[i][j].GetNumber().gameObject);
                }
                grids[i][j].SetNumber(null);
            }   
        }

        // 创建一个数字
        CreateNumber();
    }

    //退出游戏
    public void ExitGame()
    {
        SceneManager.LoadSceneAsync(0);
    }
    
    //游戏胜利
    public void GameWin()
    {
        Debug.Log("游戏胜利!");
        winPanel.Show();
    }

    //游戏失败
    public void GameLose()
    {
        Debug.Log("游戏失败!");
        losePanel.Show();
    }
    #endregion


}

 

LosePanel

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class LosePanel : View
{
    Button btn_GameAgain;
    Button btn_BackToHome;

    private void Start()
    {
        Hide();
        btn_BackToHome = transform.Find("Btn_BackToHome").GetComponent<Button>();
        btn_BackToHome.onClick.AddListener(OnExitClick);
        btn_GameAgain = transform.Find("Btn_GameAgain").GetComponent<Button>();
        btn_GameAgain.onClick.AddListener(OnRestartClick);
    }

    //重新开始的按钮点击事件
    public void OnRestartClick()
    {
        GameObject.Find("Canvas/GamePanel").GetComponent<GamePanel>().RestartGame();
        Hide();
    }

    //退出按钮的点击事件
    public void OnExitClick()
    {
        SceneManager.LoadSceneAsync(0);
    }
}

 

MenuPanel

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

public class MenuPanel : MonoBehaviour
{

    SelectModePanel selectModePanel;
    SetPanel setPanel;
    Button btn_StartGame;
    Button btn_Set;
    Button btn_ExitGame;

    AudioClip bgClip;

    
    private void Awake()
    {
        bgClip = Resources.Load<AudioClip>("Water");
    }

    private void Start()
    {

        AudioManager._instance.PlayMusic(bgClip);
        selectModePanel = GameObject.Find("Canvas/SelectModePanel").GetComponent<SelectModePanel>();
        selectModePanel.transform.gameObject.SetActive(false);
        setPanel = GameObject.Find("Canvas/SetPanel").GetComponent<SetPanel>();
        setPanel.transform.gameObject.SetActive(false);
        btn_StartGame = transform.Find("Btn_Grid/Btn_StartGame").GetComponent<Button>();
        btn_Set = transform.Find("Btn_Grid/Btn_Set").GetComponent<Button>();
        btn_ExitGame = transform.Find("Btn_Grid/Btn_ExitGame").GetComponent<Button>();
        btn_StartGame.onClick.AddListener(OnStartGameClick);
        btn_Set.onClick.AddListener(OnSetClick);
        btn_ExitGame.onClick.AddListener(OnExitGameClick);

    }

    //点击开始游戏
    public void OnStartGameClick()
    {
        //显示选择界面
        selectModePanel.Show();
    }

    //点击设置
    public void OnSetClick()
    {
        //显示设置界面
        setPanel.Show();
    }

    //点击退出游戏
    public void OnExitGameClick()
    {
        //退出游戏
        Application.Quit();
    }
}

 

SelectModePanel

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.SceneManagement;

public class SelectModePanel : View,IPointerClickHandler
{

    GameObject backGround;

    private void Start()
    {
        backGround = transform.Find("BackGround").gameObject;
    }

    //点击选择模式
    public void OnSelectModeClick( int count )
    {
        //选择模式 保存到硬盘
        PlayerPrefs.SetInt(Const.GameModel, count);

        //跳转场景 到 游戏场景
        SceneManager.LoadSceneAsync(1);
    }

    public void OnPointerClick(PointerEventData eventData)
    {
        if (eventData.pointerEnter == backGround)
        {
            Hide();
        }
    }
}

 

SetPanel

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;

public class SetPanel :View
{

    Button btn_close;
    Slider slider_Sound;
    Slider slider_Music;
    

    private void Start()
    {
        btn_close = transform.Find("bg/Button").GetComponent<Button>();
        btn_close.onClick.AddListener(OnBtnDownClick);
        slider_Sound = transform.Find("Sound/Slider").GetComponent<Slider>();
        slider_Music = transform.Find("Music/Slider").GetComponent<Slider>();
        slider_Sound.onValueChanged.AddListener(OnSoundValueChanged);
        slider_Music.onValueChanged.AddListener(OnMusicValueChanged);
    }

    //关闭按钮
    public void OnBtnDownClick()
    {
        //当点界面隐藏
        Hide();
    }

    //改变音效大小
    public void OnSoundValueChanged(float f)
    {
        //修改音效大小
        AudioManager._instance.OnSoundVolumeChanged(f);
        //保存当前修改
        PlayerPrefs.SetFloat(Const.Sound,f);
    }

    //改变音乐大小
    public void OnMusicValueChanged(float f)
    {
        //修改音乐大小
        AudioManager._instance.OnMusicVolumeChanged(f);
        //保存当前修改
        PlayerPrefs.SetFloat(Const.Music, f);
        PlayerPrefs.SetFloat(Const.Music, f);
    }

    //对音乐、音效两个控件进行初始化
    public override void Show()
    {
        base.Show();
        //对界面进行初始化
        slider_Sound.value = PlayerPrefs.GetFloat(Const.Sound,0);
        slider_Music.value = PlayerPrefs.GetFloat(Const.Music,0);
    }
}

 

View

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

public class View : MonoBehaviour
{

    //显示
    public virtual void Show()
    {
        gameObject.SetActive(true);
    }

    //隐藏
    public virtual void Hide()
    {
        gameObject.SetActive(false);
    }
}

 

WinPanel

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class WinPanel : View
{
    Button btn_GameAgain;
    Button btn_BackToHome;

    private void Start()
    {
        Hide();
        btn_BackToHome = transform.Find("Btn_BackToHome").GetComponent<Button>();
        btn_BackToHome.onClick.AddListener(OnExitClick);
        btn_GameAgain = transform.Find("Btn_GameAgain").GetComponent<Button>();
        btn_GameAgain.onClick.AddListener(OnRestartClick);
    }

    //重新开始的按钮点击事件
    public void OnRestartClick()
    {
        //调用 GamePanel 里面的重新开始
        //Debug.Log("重新开始");

        GameObject.Find("Canvas/GamePanel").GetComponent<GamePanel>().RestartGame();
        Hide();
    }

    //退出按钮的点击事件
    public void OnExitClick()
    {
        //退出到菜单场景
        //Debug.Log("退出");
        SceneManager.LoadSceneAsync(0);
    }
}

 

AudioManager

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

public class AudioManager : MonoBehaviour
{

    public static AudioManager _instance;
    private AudioSource bg, sound;

    private void Awake()
    {
        _instance = this;
        bg = transform.Find("bg").GetComponent<AudioSource>();
        sound = transform.Find("sound").GetComponent<AudioSource>();

        // 获取到保存声音大小
        bg.volume = PlayerPrefs.GetFloat(Const.Music, 0.5f);
        sound.volume = PlayerPrefs.GetFloat(Const.Sound, 0.5f);
    }
    
    public void PlayMusic(AudioClip audioClip)
    {
        bg.clip = audioClip;
        bg.loop = true;
        bg.Play();
    }

    public void PlaySound( AudioClip audioClip)
    {
        sound.clip = audioClip;
        sound.loop = false;
        sound.Play();
    }

    public void OnMusicVolumeChanged( float value )
    {
        bg.volume = value;
    }

    public void OnSoundVolumeChanged( float value )
    {
        sound.volume = value;
    }
}

 

posted @ 2021-08-12 19:21  郭天真  阅读(767)  评论(0)    收藏  举报