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; } }