本篇简介

  • 本篇介绍了如何将上一篇的设计模式思想运用到实际的开发过程中。

脚本文件

  • (1)IGameManager:这个接口存在声明了一个属性(一个拥有getter函数的变量,属性的类型是ManagerStatus,一个枚举)和一个方法,它们都要被任何实现这个接口的类实现。定义了status属性,可以从任何地方获取状态(getter方法是公有方法),但是只能在脚本中设置状态(setter方法是私有方法).(ps:一个接口本身不会做任何事情,它存在的意义仅仅是将代码结构约束到其他类身上)
  • (2)ManagerStatus:这是一个几乎没有代码的文件,列出了管理器所有可能的状态(限定了status属性只能是里面列出的状态之一)。
  • (3)PlayerManager与InventoryManager:前者为人物管理器,后者为库存管理器。它们都继承自类MonoBehaviour且实现了IGameManager定义的结构。
  • (4)Managers:管理器的管理器。

状态转化

  • 在所有的管理器中,初始化(InventoryManager没有做任何事情,而PlayerManager设置了一些值)一旦完成,status将被设置为Started。
  • 但是数据模块的初始化中可能有一些长线任务(例如加载所保存的数据),在初始化时,Startup()将运行这些任务,设置管理器的状态为Initializing(初始化中)。当完成后,再将status转化为Started。

IGameManger的脚本代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine; public interface IGameManager
{
ManagerStatus status { get; } //这是一个我们需要定义的枚举 void Startup(); //这个方法的目的是处理管理器的初始化 }

ManagerStatus的脚本代码

public enum ManagerStatus
{
Shutdown, //关机
Initializing, //正在初始化
Started //开始启动
}

PlayerManager的脚本代码

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 = 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 //这个属性可以从任何地方获取,但只能在这个脚本中设置
{
get;
private set;
} public void Startup()
{
Debug.Log("InventoryManager starting ...");//任何长任务在这里启动
status = ManagerStatus.Started; //如果是长任务,状态改变为"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 //其他代码用来访问管理器的静态属性
{
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");
} }

参考资料

Unity3D游戏开发——编程实现游戏管理器的更多相关文章

  1. 【读书笔记《Android游戏编程之从零开始》】19.游戏开发基础(游戏音乐与音效)

    在一款游戏中,除了华丽的界面 UI 直接吸引玩家外,另外重要的就是游戏的背景音乐与音效:合适的背景音乐以及精彩的音效搭配会令整个游戏上升一个档次. 在 Android 中.常用于播放游戏背景音乐的类是 ...

  2. Unity 4.2.0 官方最新破解版(Unity3D 最新破解版,3D游戏开发工具和游戏引擎套件)

    Unity是一款跨平台的游戏开发工具,从一开始就被设计成易于使用的产品.作为一个完全集成的专业级应用,Unity还包含了价值数百万美元的功能强大的游戏引擎.Unity作为一个游戏开发工具,它的设计主旨 ...

  3. 【笔记】《DirectX 9.0 3D游戏开发编程基础》:Direct3D初始化

    Direct3D初始化大概分为4个步骤: 1.获取接口IDirect3D9的指针.(Direct3DCreate9函数调用). 该接口用户获取系统中物理硬件设备的信息并创建接口IDirect3DDev ...

  4. H2Engine游戏服务器设计之属性管理器

    游戏服务器设计之属性管理器 游戏中角色拥有的属性值很多,运营多年的游戏,往往会有很多个成长线,每个属性都有可能被N个成长线模块增减数值.举例当角色戴上武器时候hp+100点,卸下武器时HP-100点, ...

  5. Unity 2D游戏开发教程之游戏精灵的开火状态

    Unity 2D游戏开发教程之游戏精灵的开火状态 精灵的开火状态 “开火”就是发射子弹的意思,在战争类型的电影或者电视剧中,主角们就爱这么说!本节打算为精灵添加发射子弹的能力.因为本游戏在后面会引入敌 ...

  6. Unity 2D游戏开发教程之游戏中精灵的跳跃状态

    Unity 2D游戏开发教程之游戏中精灵的跳跃状态 精灵的跳跃状态 为了让游戏中的精灵有更大的活动范围,上一节为游戏场景添加了多个地面,于是精灵可以从高的地面移动到低的地面处,如图2-14所示.但是却 ...

  7. [Unity3D]Unity3D游戏开发Lua随着游戏的债券(在)

    ---------------------------------------------------------------------------------------------------- ...

  8. 【读书笔记《Android游戏编程之从零开始》】20.游戏开发基础(游戏数据存储)

    对于数据的存储,Android 提供了4种保存方式. (1)SharedPreference 此方法适用于简单数据的保持,文如其名,属于配置性质的保存,不适合比较大的情况,默认存放在手机内存里 (2) ...

  9. 8、Cocos2dx 3.0三,找一个小游戏开发3.0存储器管理的版本号

    重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27693365 复杂的内存管理 移动设备上的硬件资源十 ...

随机推荐

  1. 微信公众号开发被动回复用户消息,回复内容Content使用了"\n"换行符还是没有换行

    使用语言和框架:本人后端开发使用的Python的DRF(Django REST framework)框架 需求:在微信公众号开发时,需要实现自动回复,即被关注回复.收到消息回复.关键词回复 发现问题: ...

  2. python抠图与pip install PIL报错

    窗口命令pip install PIL(python3.6+selenium——2.53.1+pycharm) from PIL import Image from selenium import w ...

  3. 大数据入门第十一天——hive详解(三)hive函数

    一.hive函数 1.内置运算符与内置函数 函数分类: 查看函数信息: DESC FUNCTION concat; 常用的分析函数之rank() row_number(),参考:https://www ...

  4. 20145234黄斐《Java程序设计》实验五—网络安全与编程

    1: 两人一组结对编程: 0. 参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA 1. 结对实现中缀表达式转后缀表达式的功能 MyBC.jav ...

  5. git push 每次都要输入用户名密码

    添加远程库的时候使用了https的方式..所以每次都要用https的方式push到远程库,速度还慢.. 查看使用的传输协议: git remote -v 重新设置成ssh的方式: git remote ...

  6. 洛谷 P1939 【模板】矩阵加速(数列)

    题目描述 a[1]=a[2]=a[3]=1 a[x]=a[x-3]+a[x-1] (x>3) 求a数列的第n项对1000000007(10^9+7)取余的值. 输入输出格式 输入格式: 第一行一 ...

  7. javaweb 报表生成(pdf excel)所需要用到的技术和思路

    pdf: “ 目前开源.成熟.稳定的第三方包只有iText.而用iText生成PDF有三种方式: 调用iText API,用代码“写”出PDF,依赖包:com.itextpdf:itextpdf:5. ...

  8. [Luogu4182][USACO18JAN]Lifeguards P[单调队列]

    题意 给定 \(n\) 个区间,必须去掉其中的 \(K\) 个,询问能够保留的区间并的最大值. \(n \leq 10^5\ ,K \leq 100\) . 分析 定义状态 \(f_{i,j}\) 表 ...

  9. JS ,substr、 substring、charAt方法的区别

    JS 截取字符串substr 和 substring方法的区别,需要的朋友可以参考下,根据需要自行选择. substr 方法 返回一个从指定位置开始的指定长度的子字符串. stringvar.subs ...

  10. linux 利用cat写入一段文件

    linux 利用cat写入一段文件 cat >> /etc/rc.local <<EOFsysctl -w net.ipv4.icmp_echo_ignore_all=1sys ...