---
# System prepended metadata

title: Day 24 | 使用ManoMotion製作打地鼠遊戲Part2 - 遊戲管理
tags: [Unity, AR手遊, ManoMotion]

---

# 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遊戲，明天見啦!

