# Day 24 | 使用ManoMotion製作打地鼠遊戲Part2 - 遊戲管理 ###### tags: `Unity` `AR手遊` `ManoMotion` 在上一篇文章中完成手部偵測及地鼠設定,今天我們要來加上遊戲管理。 > **目錄** > 地鼠時間控制 > 分數機制 > 遊戲管理 ## 地鼠時間控制 我們需要地鼠經過一段時間後消失,因此新增兩個變數來記錄地鼠顯示的時間及目前時間。 在遊戲一開始進行時間初始化,並在地鼠出現時開始倒數。 ``` float maxSecondsOnScreen = 2.5f; //地鼠顯示時間 float currentSecondsOnScreen = 0; //目前時間 private void Init() { gameManager = FindObjectOfType<GameManager>().GetComponent<GameManager>(); ResetCurrentSecondOnScreen(); } private void ResetCurrentSecondOnScreen() { currentSecondsOnScreen = maxSecondsOnScreen; //時間初始化 } private void CountDownCurrentSecondOnScreen() { currentSecondsOnScreen -= Time.fixedDeltaTime; //倒數 } ``` 使用TryCounDownToHide()來判斷地鼠目前狀態: * 判斷地鼠目前是否顯示在遊戲畫面上 * 顯示則開始倒數計時 * 判斷時間是否小於0 * 將時間初始化 * 並且將地鼠隱藏 ``` private void TryCountDownToHide() { if (gameObject.activeInHierarchy) { CountDownCurrentSecondOnScreen(); } if (currentSecondsOnScreen < 0;) { ResetCurrentSecondOnScreen(); Hide(); } } ``` 將TryCountDownToHide()放入FixedUpdate()中 ``` void FixedUpdate() { TryCountDownToHide(); } ``` 也要記得在OnCollisionEnter2D()中加入 ``` ResetCurrentSecondOnScreen(); ``` ## 分數機制 在Scene中新增一個Text,將tag設定成Score,並調整好外觀設定 ![](https://i.imgur.com/TaSyLxF.png) 在gameManager()中新增InitScore() ``` Text score; private void InitScore() { score = GameObject.FindGameObjectWithTag("Score").GetComponent<Text>(); score.text = ""; } ``` 新增AddScore() ``` int scoreNumber = 0; //紀錄目前分數 public void AddScore() { scoreNumber += 10; score.text = "Score:"+ scoreNumber.ToString(); } ``` 最後要在Monster()中的碰撞函式中新增AddScore() ``` gameManager.AddScore(); ``` ## 遊戲管理 ### 地鼠隨機生成 將地鼠製成Prefab,並在Scene中新增所需地鼠數量。 ![](https://i.imgur.com/z28dHhi.png) 在gameManager()中新增一個List用來儲存所有地鼠 ``` public List<Monster> monsters; ``` 並在Start()中新增 ``` monsters = GameObject.FindObjectsOfType<targetBehavior>().ToList(); ``` 在HideAllMonsters()將所有地鼠隱藏起來,並加入Start()中 ``` void HideAllMonsters() { foreach ( var m in monsters) { HideMonster(m.gameObject); } } ``` 新增一個List來儲存目前隱藏的地鼠 ``` List<Monster> HiddenMonsters { get { var result = new List<Monster>(); foreach (var m in monsters) { if (!m.IsActive) { result.Add(m); } } return result; } } ``` 在ShowRandomMonster()中隨機挑選一隻地鼠,並將它顯示在畫面上 ``` void ShowRandomMonster() { int r = Random.Range(0,HiddenMonsters.Count); targetBehavior m = HiddenMonsters[r]; ShowMonster(m.gameObject); } ``` ### 地鼠生成時間 新增變數來管理地鼠生成時間,並將ResetShowMonsterSeconds()加入Start()中 ``` public float showMonsterIntervalSeconds; public float countDownShowMonsterSeconds; int MAX_MONSTERS_ON_SCREEN=3; private void ResetShowMonsterSeconds() { countDownShowMonsterSeconds = showMonsterIntervalSeconds; } ``` 取得目前畫面上地鼠的數量 ``` int MonsterCountOnScreen{ get { int result = 0; foreach (var m in monsters) { if (m.IsActive) { result += 1; } } return result; } } ``` 在TryCountDownToShowMonster()中: * 時間倒數 * 如果地鼠顯示時間到 * 將地鼠顯示時間出示畫 * 判斷目前畫面上的地鼠數量 ``` private void TryCountDownToShowMonster() { countDownShowMonsterSeconds -= Time.fixedDeltaTime; if (countDownShowMonsterSeconds <= 0) { ResetShowMonsterSeconds(); if (MonsterCountOnScreen < MAX_MONSTERS_ON_SCREEN;) { ShowRandomMonster(); } } } ``` --- 今天我們製作了遊戲管理,地鼠遊戲就先告一段落啦! 下一篇文章,將會介紹使用ManoMotion製作flappy bird遊戲,明天見啦!