# DragonNestGhoulMode
**Repository Path**: Kalulas/DragonNestGhoulMode
## Basic Information
- **Project Name**: DragonNestGhoulMode
- **Description**: An online ghoul-mode game made with Unity3D Engine.
- **Primary Language**: C#
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 5
- **Created**: 2020-04-20
- **Last Updated**: 2024-05-29
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Project Hand Plus
A online co-op game made with Unity Engine.
### 小组成员
陈柏铭 / 廖青山 / 孙宋源 / 王梓涵 / 应尚威 / 章朝哲
客户端开发:陈柏铭 / 王梓涵 / 应尚威 / 章朝哲
服务端开发:廖青山 / 孙宋源
### 客户端文件组织
**实现的功能在此处进行说明**
**[ Models / ]** 分类存放模型、贴图、fbx动画素材(虽然叫Models)
**[ Models / Creatures ]** 存放可操作角色素材
**[ Models / Items ]** 存放道具素材
!!!只有代码加载的内容放在 [ Resources / ] 目录下!!!
**[ Resources / ]**
**[ Resources / Configs ]** 存放依赖ScriptableObject创建的配置文件
| 子文件夹 | 配置文件名 | 配置描述 |
| --------------- | ----------------------- | ------------------------------------------------------------ |
| Map0 | PlayerSpawnPointsConfig | 角色生成点配置,输入浮点数可自动转为定点数,可实例化Prefab到场景中预览,预览后删除对象 |
| | ItemSpawnPointsConfig | 道具生成点配置 |
| | SceneCollidersConfig | 场景碰撞盒配置,可将场景中的Colldier组件转化为定点数碰撞盒数据结构 |
| Excel | stateExcelConfig | 状态机配置文件 |
| PureMVCTemplate | | 用于创建PureMVC脚本模板的配置文件 |
**[ Resources / Prefabs ]** 代码加载的Prefab,文件夹分类存放,UI相关请放在同一个文件夹下
**[ Resources / Sprites ]** 代码加载的sprites文件
**[ Scripts / ]** 存放脚本
**[ Scripts / Editors / ]** 目前存放了实现ScriptableObeject类OnSceneGUI方法的脚本
**[ Scripts / Protoc / ]** 存放通信用Protoc文件
**[ Scripts / Managers / ]** 存放单例Manager,在PureMVC框架下应该不多
| Manager编号 | Manager名称 | 功能描述 |
| ----------- | --------------- | ------------------------------------------------------------ |
| 0 | MessageCenter | 可对网络事件进行监听的事件系统,由于客户端本地事件由Facade内部通知系统实现 |
| 1 | NetManager | 连接服务器,发送消息,接收来自服务器消息 |
| 2 | LockStepManager | 处理帧同步的逻辑刷新(根据游戏帧频率)和视图刷新(根据帧率) |
| | ResourceTool | 更方便地加载资源 |
**[ Scripts / PureMVC / ]** 存放PureMVC框架实现的各个模块
| 模块编号 | 模块路径 | 功能描述 |
| -------- | ---------------------------- | ------------------------------------------------------------ |
| 0 | Scripts / PureMVC / StartUp/ | 该模块下的Launcher.cs脚本初始化客户端必要的单例,与服务端建立连接 |
| | | |
| | | |
**[ Scripts / PureMVCFramework / ]** PureMVC框架核心代码
**[ Scripts / ScriptableObjects/ ]** 配置用ScriptableObjects存放目录
**[ Scripts / TrueSync/ ]** 定点数数学库实现
**[ Sprites / ]** 游戏中非代码直接加载的图片素材,代码通过ScriptableObject加载图标
| 子文件夹 | 描述 |
| ---------------------- | -------------------------- |
| Backgrounds | 界面背景 |
| Interactables | 可交互组件 |
| Numbers | 浮动数字 |
| Panels | 面板框,包含背景和部分图标 |
| Icons | 食尸鬼技能、人类道具图标 |
| MapPreviews(未创建) | 地图预览 |
| RolePreviews(未创建) | 可选角色预览 |
**[ XScene / ]** 战斗主场景存放所在
主场景文件位置:Assets/Scenes/yingxiongxiagu.unity
#### 假人功能使用说明
```c#
// SceneInfosConfig.Dummy
[Serializable]
public class Dummy {
[LabelText("是否模拟移动")]
public bool move;
[LabelText("是否转化食尸鬼")]
public bool turnGhoul;
[LabelText("模拟UserID")]
public int fakeUID;
[LabelText("假人角色ID")]
public int dummyCharacterID;
}
```
1. 在场景配置里面勾选“是否使用假人”就会在场景里面根据假人配置加载出来,可以编辑配置能不能移动,会不会变成食尸鬼,使用的userID,以及加载的模型ID;
2. fakeUID不要和用户ID冲突
3. 假人生成点个数要和假人数一致
4. 假人移动目前设计为普通的前后走
5. 加载假人对象在GameRoundInitCommand.InitDummy(),假人转变为食尸鬼在InitMonsterCommand.TurnDummyMonster(),模拟假人输入在GameFrameUpdateCommand.DummyFakeUpdate(),在GameSecondUpdateCommand中切换方向
### PureMVC使用笔记【补充修正欢迎】

#### **对应关系**
Model(存储数据) <------ Proxy(提供编辑数据的方法,处理仅于所属数据有关的域逻辑)
View(存储UI组件的引用) <------ Mediator(监听指定通知,对UI组件进行编辑)
Command:特定通知到来时处理对应的业务逻辑
Facade(发音注意 /fə'sɑ:d/):
初始化Model / View / Controller,初始注册Proxy / Mediator / Command
*业务逻辑:不完全被归为纯数据、纯UI的逻辑,或是两边都不沾边的逻辑
#### 对应访问对象
**Facade:** 外部脚本可以通过Facade类的单例对象发送通知
YourFacade.GetInstance().SendNotification()
存在Facade对象的脚本可以:
1. 发送事件 Facade.SendNotification()
2. 注册组件 Facade.RegisterProxy() / Facade.RegisterMediator() / Facade.RegisterCommand()
3. 注销组件 Facade.RemoveProxy() / Facade.RemoveMediator() / Facade.RemoveCommand()
4. 获取组件 Facade.RetrieveProxy() / Facade.RetrieveMediator()
**Model、View、Controller:**
Model、View为用户自己定义的数据结构,一般不需要定义方法,所以也不存在访问问题,Controller在目前看到的项目里就只是Command的概念集合,不存在脚本(不确定)
**Proxy:**
**存在Facade引用对象**
类内Data对象可以存放对应Model的引用,在构造函数中赋值
当存在多个Model(如多个玩家的数据)可以自己定义Model引用的数组,Proxy和Model的多对一关系是因为对同样的数据结构所采取的处理方式是相同的
**注意事项:** 尽量不获取Mediator。Model层不关心View层的表现,不应该在这里获取并使用Mediator,而是利用发送通知的方法进行View层更新
**Mediator:**
**存在Facade引用对象**
类内ViewComponent对象可以存放对应View的引用,在构造函数中赋值
当存在多个View可以自己定义View引用的数组,跟上面一样的意思
**注意事项:** 可以读取Proxy,但不建议通过Proxy编辑Model层。此场景大多数情况下属于事务逻辑,建议发送通知后交给指定的Command来处理。
**Command:**
**存在Facade引用对象**
Command的生命周期相对较短,在通知到来时创建,所以Facade也没有对应的Retrieve方法
#### 收发通知
可以发送通知的:Proxy / Mediator / Command / Facade
可以监听(处理)通知的:Mediator(在ListNotificationInterests方法中指定),Command(通过Facade对象指定)
示例:
```c#
// LoginPanelMediator.cs 指定
public override IList ListNotificationInterests() {
return new List() { MyFacade.LoginSucceed, MyFacade.LoginFailed};
}
// LoginPanelMediator.cs 处理通知
public override void HandleNotification(INotification notification) {
switch (notification.Name) {
case MyFacade.LoginSucceed:
((LoginPanelView)ViewComponent).messageText.text = "succeed";
break;
case MyFacade.LoginFailed:
((LoginPanelView)ViewComponent).messageText.text = "failed";
break;
default:
break;
}
}
// MyFacade.cs
protected override void InitializeController() {
base.InitializeController();
RegisterCommand(StartUp, typeof(StartUpCommand));
RegisterCommand(Login, typeof(LoginCommand));
}
// 其他组件也可通过Facade.RegisterCommand
```