using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class IGameManager
{
ManagerStatus status { get; } //这是一个我们需要定义的枚举
void Startup(); //这个方法的目的是处理管理器的初始化
}
public enum ManagerStatus
{
Shutdown, //关机
Initializing, //正在初始化
Started //开始启动
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
///<summary>
///人物管理脚本
///</summary>
public class PlayerManager : MonoBehaviour, IGameManager //继承一个类并实现一个接口
{
public ManagerStatus status
{
get;
private set; //status只读,不能在外部设置,内部可读写
}
public int health //人物健康值
{
get;
private set;
}
public int maxHealth //人物最高健康值
{
get;
private set;
}
public void Startup()
{
Debug.Log("PlayerManager starting ...");
health = 50; //初始化值
maxHealth = 100;
status = ManageStatus.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);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
///<summary>
///库存管理脚本
///</summary>
public class InventoryManager : MonoBehaviour, IGameManager
{
public ManagerStatus status //这个属性可以从任何地方获取,但只能在这个脚本中设置
{
get;
private set;
}
public void Startup()
{
Debug.Log("InventoryManager starting ...");//任何长任务在这里启动
status = ManagerStatus.started; //如果是长任务,状态改变为"Initializing"
}
}
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 //其他代码用来访问管理器的静态属性
{
get;
private set;
}
public static InventoryManager Inventory
{
get;
private set;
}
private List<IGameManager> _startSequence; //启动时要遍历的管理器列表
void Awake() //列出了启动序列,然后启动协同程序来运行所有的管理器
{
Player = GetComponent<PlayerManager>();
Inventory = GetComponent<InventoryManager>();
_startSequence = new List<IGameManager>(); //创建了List对象,用List.Add的方法来添加管理器。列表对象与数组相似,以一种具体的类型声明,把一系列元素依次存入,但可在创建后改变大小。
_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) //循环至所有管理器都启动为止
{
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");
}
}
原文:https://www.cnblogs.com/Akyy/p/10652565.html