# 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使用笔记【补充修正欢迎】   ![](https://di.gameres.com/attachment/forum/201809/26/132433jp3w4487ml448wwx.jpg)   #### **对应关系** 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 ```