iT邦幫忙

2021 iThome 鐵人賽

DAY 24
0
Mobile Development

從無到有! Unity AR手遊開發日誌-以山海異聞錄為例系列 第 24

Day 24 | 使用ManoMotion製作打地鼠遊戲Part2 - 遊戲管理

在上一篇文章中完成手部偵測及地鼠設定,今天我們要來加上遊戲管理。

目錄
地鼠時間控制
分數機制
遊戲管理

地鼠時間控制

我們需要地鼠經過一段時間後消失,因此新增兩個變數來記錄地鼠顯示的時間及目前時間。
在遊戲一開始進行時間初始化,並在地鼠出現時開始倒數。

 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,並調整好外觀設定

在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中新增所需地鼠數量。

在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遊戲,明天見啦!


上一篇
Day 23 | 使用ManoMotion製作打地鼠遊戲Part1 - 手部偵測及地鼠設定
下一篇
Day 25 | 使用ManoMotion製作Flappy Bird遊戲 Part1 - 障礙物山的移動與產生
系列文
從無到有! Unity AR手遊開發日誌-以山海異聞錄為例30

尚未有邦友留言

立即登入留言