Unity遊戲積分/計分系統製作方法

Windbell_233發表於2020-12-23

Unity遊戲積分/計分製作方法

前言:
本篇部落格是我學習unity基礎的最後一篇學習筆記,如果以後有實用的開發方法還是會分享出來。之後我準備製作一個具有完整客戶端和服務端的遊戲專案,並寫一個客戶端和服務端入門學習的部落格系列。有想過整理一些基礎開發的常見問題和常用知識分享出來,不過論壇裡已經有不少這種總結帖了,前人栽樹後人乘涼嘛(白嫖是真的舒服) 。

言歸正傳,本篇部落格將講解遊戲開發中常見的積分/計分系統的製作,看過論壇有很多這種帖子,但基本都是從一個大型系統裡進行講解,今天我把這個方法獨立挖出來做個小案例,來分析這個系統的實現原理,為遊戲開發提供更多開發思路。
如果有朋友還想學習如何在【遊戲進行時】,【遊戲結束時】等不同遊戲狀態來顯示不同的積分/計分UI效果可以參考我之前寫的UI控制方法,在不同的遊戲狀態下呼叫切換UI的方法就能實現:

Unity控制多組UI的顯示與隱藏

(一)先搭建一個UI用來顯示積分,這裡以0為初值,顯示得分數字的Text命名為ScoreTable。可以換一下字型來加強顯示效果,預設字型太醜了
在這裡插入圖片描述

(二)搭建一個簡單的場景,設定得分邏輯:藍色方塊為玩家Player,紅色方塊為得分物體ScoreObj,把ScoreObj拉大一點,使Player穿過ScoreObj一次,遊戲分數就+1,沒錯,要用到觸發器Trigger的碰撞檢測。
在這裡插入圖片描述

(三)給Player新增碰撞體和Rigidbody,給ScoreObj新增碰撞體,有些版本的unity會自動新增碰撞體,碰撞體大小可以適當修改(記得在ScoreObj碰撞體元件處勾選Is Trigger)。
在這裡插入圖片描述
在這裡插入圖片描述

(四)建立指令碼PlayerControl,開始編寫玩家程式碼,我們可以直接套用傳統的WASD移動程式碼來控制Player,注意,這裡會定義一個Player得分的事件,並將這個事件傳送給控制UI的指令碼的接收器,這就是積分/計分系統的實現核心(接收器和處理器的定義詳細見下一步的UI指令碼),如果你不理解C#的事件是什麼,可以論壇搜尋或去我的部落格主頁查詢。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerControl : MonoBehaviour
{
    public delegate void PlayerScore(int temp);//定義委託
    public event PlayerScore GetScore;//定義得分事件,用於發出得分的訊息
    void Start()
    {
        
    }
    void Update()//在Update()中新增Player的移動控制
    {
        if (Input.GetKey(KeyCode.W))
        {
            this.transform.Translate(Vector3.forward * Time.deltaTime * 2f);//物件可以朝著世界座標向前移動
        }
        if (Input.GetKey(KeyCode.A))
        {
            this.transform.Translate(Vector3.left * Time.deltaTime * 2f);//物件可以朝著世界座標向前移動
        }
        if (Input.GetKey(KeyCode.S))
        {
            this.transform.Translate(Vector3.back* Time.deltaTime * 2f);//物件可以朝著世界座標向前移動
        }
        if (Input.GetKey(KeyCode.D))
        {
            this.transform.Translate(Vector3.right * Time.deltaTime * 2f);//物件可以朝著世界座標向前移動
        }
    }
    public void OnTriggerExit(Collider other)//設定觸發器碰撞事件,一旦Player穿過了ScoreObj,就傳送得分事件
    {
        if (other.gameObject.name.Equals("ScoreObj"))//檢查Player碰撞的物體是不是ScoreObj
        {
            if (GetScore != null)//檢查事件是否為空,即有沒有接收器訂閱它
            {
                GetScore(1);//傳送得分事件訊息,為接收器提供引數1,實現+1分的效果
            }
        }
    }
}

(五)現在建立新的指令碼UIScore並開始編寫,該指令碼將用於接受Player得分的事件並進行相應處理(改變UI的積分值)。其實大部分時候這個指令碼都命名為GameManager,用於管理遊戲全域性邏輯,這裡只演示計分效果,我們可以簡化一下命名。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;//引入unity的UI編輯庫

public class UIScore : MonoBehaviour
{
    public PlayerControl player;//定義PlayerControl類
    public int score;//定義積分變數
    public Text ScoreUI;//定義要修改的Text
    void Start()
    {
        player.GetScore += Player_GetScore;//呼叫PlayerControl類,訂閱Player的得分事件,start函式已經作為了我們的訊息接收器
    }

    private void Player_GetScore(int score)//定義訊息處理器來處理訊息,給屬性賦值,改變積分值
    {
        Score += score;
    }
    void Update()
    {
        
    }
    public int Score//定義積分屬性,使用屬性來進行控制,使每次積分被改變時就呼叫一次文字顯示的修改
    {
        get
        {
            return score;
        }
        set
        {
            score = value;
            ScoreUI.text = score.ToString();//讓UI顯示的分數等於score的值,這裡有String型別的轉換
        }
    }

}

(六)現在邏輯和程式碼都設定完畢了,將指令碼PlayerControl拖拽給Player,再建立一個空物體並命名ScoreManager,將指令碼UIScore拖拽給ScoreManager,將ScoreTable拖進UIScore指令碼為其定義的元件位置,將Player拖進UIScore指令碼為其定義的類位置,具體如下圖。
在這裡插入圖片描述
(七)執行!檢視得分效果!
在這裡插入圖片描述

(八)總結:積分/計分系統的實現就是依靠接收player得分的事件通知,然後做出相應的處理,這個事件何時傳送以及它的傳送者則由遊戲邏輯決定。積分/計分系統可以更加複雜也可以使用其他方法,本篇部落格為該系統提供一種方便封裝管理的製作思路。

相關文章