Unity3D游戏开发——编程实现游戏管理器
本篇簡介
本篇介紹了如何將上一篇的設(shè)計模式思想運(yùn)用到實(shí)際的開發(fā)過程中。
腳本文件
(1)IGameManager:這個接口存在聲明了一個屬性(一個擁有g(shù)etter函數(shù)的變量,屬性的類型是ManagerStatus,一個枚舉)和一個方法,它們都要被任何實(shí)現(xiàn)這個接口的類實(shí)現(xiàn)。定義了status屬性,可以從任何地方獲取狀態(tài)(getter方法是公有方法),但是只能在腳本中設(shè)置狀態(tài)(setter方法是私有方法).(ps:一個接口本身不會做任何事情,它存在的意義僅僅是將代碼結(jié)構(gòu)約束到其他類身上)
(2)ManagerStatus:這是一個幾乎沒有代碼的文件,列出了管理器所有可能的狀態(tài)(限定了status屬性只能是里面列出的狀態(tài)之一)。
(3)PlayerManager與InventoryManager:前者為人物管理器,后者為庫存管理器。它們都繼承自類MonoBehaviour且實(shí)現(xiàn)了IGameManager定義的結(jié)構(gòu)。
(4)Managers:管理器的管理器。
狀態(tài)轉(zhuǎn)化
在所有的管理器中,初始化(InventoryManager沒有做任何事情,而PlayerManager設(shè)置了一些值)一旦完成,status將被設(shè)置為Started。
但是數(shù)據(jù)模塊的初始化中可能有一些長線任務(wù)(例如加載所保存的數(shù)據(jù)),在初始化時,Startup()將運(yùn)行這些任務(wù),設(shè)置管理器的狀態(tài)為Initializing(初始化中)。當(dāng)完成后,再將status轉(zhuǎn)化為Started。
IGameManger的腳本代碼
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public interface IGameManager
{
ManagerStatus status { get; } //這是一個我們需要定義的枚舉
void Startup(); //這個方法的目的是處理管理器的初始化
}
ManagerStatus的腳本代碼
public enum ManagerStatus
{
Shutdown, //關(guān)機(jī)
Initializing, //正在初始化
Started //開始啟動
}
PlayerManager的腳本代碼
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
///<summary>
///人物管理腳本
///</summary>
public class PlayerManager : MonoBehaviour, IGameManager //繼承一個類并實(shí)現(xiàn)一個接口
{
public ManagerStatus status
{
get;
private set; //status只讀,不能在外部設(shè)置,內(nèi)部可讀寫
}
public int health //人物健康值
{
get;
private set;
}
public int maxHealth //人物最高健康值
{
get;
private set;
}
public void Startup()
{
Debug.Log("PlayerManager starting ...");
health = 50; //初始化值
maxHealth = 100;
status = ManagerStatus.Started;
}
public void ChangeHealth(int value)
{
health += value;
if (health > maxHealth)
{
health = maxHealth;
}
else if (health < 0) //健康值最小為0
{
health = 0;
}
Debug.Log("Health:" + health + "/" + maxHealth);
}
}
InventoryManager的腳本代碼
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
///<summary>
///庫存管理腳本
///</summary>
public class InventoryManager : MonoBehaviour, IGameManager
{
public ManagerStatus status //這個屬性可以從任何地方獲取,但只能在這個腳本中設(shè)置
{
get;
private set;
}
public void Startup()
{
Debug.Log("InventoryManager starting ...");//任何長任務(wù)在這里啟動
status = ManagerStatus.Started; //如果是長任務(wù),狀態(tài)改變?yōu)?Initializing"
}
}
Managers的腳本代碼
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
///<summary>
///管理器的管理器
///</summary>
[RequireComponent(typeof(PlayerManager))] //自動添加管理器,確保存在不同的管理器
[RequireComponent(typeof(InventoryManager))]
public class Managers : MonoBehaviour
{
public static PlayerManager Player //其他代碼用來訪問管理器的靜態(tài)屬性
{
get;
private set;
}
public static InventoryManager Inventory
{
get;
private set;
}
private List<IGameManager> _startSequence; //啟動時要遍歷的管理器列表
void Awake() //列出了啟動序列,然后啟動協(xié)同程序來運(yùn)行所有的管理器
{
Player = GetComponent<PlayerManager>();
Inventory = GetComponent<InventoryManager>();
_startSequence = new List<IGameManager>(); //創(chuàng)建了List對象,用List.Add的方法來添加管理器。列表對象與數(shù)組相似,以一種具體的類型聲明,把一系列元素依次存入,但可在創(chuàng)建后改變大小。
_startSequence.Add(Player);
_startSequence.Add(Inventory);
StartCoroutine(StartupManagers()); //異步啟動序列
}
private IEnumerator StartupManagers()
{
foreach (IGameManager manager in _startSequence)
{
manager.Startup();
}
yield return null;
int numModules = _startSequence.Count;
int numReady = 0;
while (numReady < numModules) //循環(huán)至所有管理器都啟動為止
{
int lastReady = numReady;
numReady = 0;
foreach (IGameManager manager in _startSequence)
{
if (manager.status == ManagerStatus.Started)
{
numReady++;
}
}
if (numReady > lastReady)
Debug.Log("progress:" + numReady + "/" + numModules);
yield return null;
}
Debug.Log("All managers started up");
}
}
參考資料
協(xié)程(協(xié)同程序)的概括(StartCoroutine 和yield return和StopCoroutine )
IEnumerator和IEnumerable詳解
《Unity 5實(shí)戰(zhàn)——使用C#和Unity開發(fā)多平臺游戲》,作者Joseph Hocking ,譯者蔡俊鴻。
總結(jié)
以上是生活随笔為你收集整理的Unity3D游戏开发——编程实现游戏管理器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 广发信用卡财智金多久能到账?取决于两个因
- 下一篇: weblogic 11g 配置oracl