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游戏,明天见啦!


<<:  IT 铁人赛 k8s 入门30天 -- day24 k8s Expose Pod Information to Containers by Environment Variables

>>:  [Day 25] Facial Alignment

【DAY 26】软件拖垮效率?你有想过你需要打开多少应用程序才能完成工作吗?

哈罗大家好~~ 昨天的 Microsoft 365介绍方案告一段落,不知道大家对於Microsoft...

[Day27] 第二十七课 Azure巢状虚拟化-2 [进阶]

昨天提到,当Azure Hyper-V需要被其它Azure VM内网存取的时候, 该如何调整呢?内网...

卡夫卡的藏书阁【Book10】- Kafka Connect 1

“Books are a narcotic.” ― Franz Kafka 突然想起了恐龙书 Ka...

Day 17【ethers.js】ETHER. ETHER EVERYWHERE.

【前言】 这两天来记录 ethers.js 我觉得蛮重要的一些学习笔记,今天主要聚焦在一些常见名词...

Day 25: 人工智慧在音乐领域的应用 (AI作曲 - 长短期记忆网路 LSTM )

昨天我们聊到了RNN与马可夫模型在作曲上因为缺乏长期记忆的关系,导致在创作音乐上无法有效的理解曲式与...