初始化Book文件
This commit is contained in:
parent
aa9550b86c
commit
216ec612ae
29
Books/0-介绍.md
Normal file
29
Books/0-介绍.md
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
# 介绍- Introduce
|
||||||
|
|
||||||
|
### TEngine
|
||||||
|
<a style="text-decoration:none">
|
||||||
|
<img src="https://img.shields.io/badge/Unity%20Ver-2021.3.20++-blue.svg?style=flat-square" alt="status" />
|
||||||
|
</a>
|
||||||
|
<a style="text-decoration:none">
|
||||||
|
<img src="https://img.shields.io/github/license/ALEXTANGXIAO/TEngine" alt="license" />
|
||||||
|
</a>
|
||||||
|
<a style="text-decoration:none">
|
||||||
|
<img src="https://img.shields.io/github/last-commit/ALEXTANGXIAO/TEngine" alt="last" />
|
||||||
|
</a>
|
||||||
|
<a style="text-decoration:none">
|
||||||
|
<img src="https://img.shields.io/github/issues/ALEXTANGXIAO/TEngine" alt="issue" />
|
||||||
|
</a>
|
||||||
|
<a style="text-decoration:none">
|
||||||
|
<img src="https://img.shields.io/github/languages/top/ALEXTANGXIAO/TEngine" alt="topLanguage" />
|
||||||
|
</a>
|
||||||
|
|
||||||
|
TEngine是一套用于Unity框架解决方案,用于帮助研发团队快速进行开发。
|
||||||
|
|
||||||
|
### 开箱即用
|
||||||
|
开箱即用、用法简洁,即用即上手.高可读性和详细的文档说明帮助你更快更好的进行游戏开发。您不需要关心框架的底层,分离独自实现您的GamePlay。
|
||||||
|
|
||||||
|
### 性能强大
|
||||||
|
TEngine 底层使用基于UniTask的异步以及事件分发,可插件定制化,把复杂游戏简单化切以高性能、低耦合度实现。
|
||||||
|
|
||||||
|
### 高内聚低耦合
|
||||||
|
内嵌了The Best 次时代热更新解决方案<a href="https://github.com/focus-creative-games/hybridclr"><strong>HybridCLR</strong></a>、百万DAU验证的资源解决方案<a href="https://github.com/tuyoogame/YooAsset"><strong>YooAsset</strong></a>、你的游戏最佳配置解决方案<a href="https://github.com/focus-creative-games/luban"><strong>Luban</strong></a>
|
63
Books/1-快速开始.md
Normal file
63
Books/1-快速开始.md
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
# 快速开始- Quickly Start
|
||||||
|
快速上手
|
||||||
|
本教程引导从空项目开始体验TEngine。出于简化起见,只演示目标平台为Windows的情况。
|
||||||
|
|
||||||
|
请在Standalone平台上正确跑通热更新流程后再自行尝试Android、iOS平台的热更新,它们的流程非常相似。
|
||||||
|
|
||||||
|
### 1.使用Unity2021.3.20f1c1打开项目工程。
|
||||||
|
|
||||||
|
### 2.默认选择顶部栏目EditorMode编辑器下的模拟模式并点击Launcher开始运行
|
||||||
|

|
||||||
|
|
||||||
|
### 3.Editor编辑器下运行成功!
|
||||||
|

|
||||||
|
|
||||||
|
### 4.打包运行
|
||||||
|
* 1.运行菜单 HybridCLR/Install... 安装HybridCLR,每次更新HybridCLR版本需要重新执行一次安装。
|
||||||
|
* 2.运行菜单 HybridCLR/Define Symbols/Enable HybridCLR 运行开启HybridCLR热更新。
|
||||||
|
* 3.运行菜单 HybridCLR/Generate/All 进行必要的生成操作。这一步不可遗漏!!!
|
||||||
|
* 4.运行菜单 HybridCLR/Build/BuildAssets And CopyTo AssemblyPath,生成热更新dll并copy到热更程序集中。
|
||||||
|
* 5.运行菜单 YooAsset/AssetBundle Builder 构建AB。
|
||||||
|
* 6.打开Build Settings对话框,点击Build And Run,打包并且运行热更新示例工程。
|
||||||
|
|
||||||
|
### 遇到问题请查看HybridlCLR的<a href="https://hybridclr.doc.code-philosophy.com/docs/help/commonerrors"><strong>常见错误(commonerrors)</strong></a>
|
||||||
|
|
||||||
|
### 系统需求
|
||||||
|
默认版本:Unity2021.3.20f1c1
|
||||||
|
|
||||||
|
支持版本: Unity2019.4 & Unity2020.3 & Unity2021.3 & Unity2022.3
|
||||||
|
|
||||||
|
支持平台: Windows、OSX、Android、iOS、WebGL
|
||||||
|
|
||||||
|
开发环境: .NET4.x
|
||||||
|
|
||||||
|
### 目录结构
|
||||||
|
```
|
||||||
|
Assets
|
||||||
|
├── AssetArt // 美术资源目录
|
||||||
|
│ └── Atlas // 自动生成图集目录
|
||||||
|
├── AssetRaw // 热更资源目录
|
||||||
|
│ ├── UIRaw // UI图片目录
|
||||||
|
│ │ ├── Atlas // 需要自动生成图集的UI素材目录
|
||||||
|
│ │ └── Raw // 不需要自动生成图集的UI素材目录
|
||||||
|
├── Editor // 编辑器脚本目录
|
||||||
|
├── HybridCLRData // hybridclr相关目录
|
||||||
|
├── Scenes // 主场景目录
|
||||||
|
├── GameScripts // 程序集目录
|
||||||
|
└── TEngine // 框架核心目录
|
||||||
|
├── AssetSetting // YooAsset资源设置
|
||||||
|
├── Editor // TEngine-Editor程序集
|
||||||
|
└── Runtime // TEngine-Runtime程序集
|
||||||
|
```
|
||||||
|
|
||||||
|
### 热更新程序集划分
|
||||||
|
```
|
||||||
|
Assets/GameScripts
|
||||||
|
├── Main // 主程序程序集(启动器与流程)
|
||||||
|
└── HotFix // 游戏热更程序集目录 [Folder]
|
||||||
|
├── GameBase // 游戏基础框架程序集 [Dll]
|
||||||
|
├── GameProto // 游戏配置协议程序集 [Dll]
|
||||||
|
└── GameLogic // 游戏业务逻辑程序集 [Dll]
|
||||||
|
├── GameApp.cs // 热更主入口
|
||||||
|
└── GameApp_RegisterSystem.cs // 热更主入口注册系统
|
||||||
|
```
|
82
Books/2-框架概览.md
Normal file
82
Books/2-框架概览.md
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
# TEngine
|
||||||
|
|
||||||
|
## TEngine-Runtime
|
||||||
|
### AOT内核基于Gameframework,优化、最简化以及商业化适配。
|
||||||
|

|
||||||
|
|
||||||
|
## AOT游戏框架模块基类。
|
||||||
|
#### 框架思路为面向接口编程,如Resource资源模块,开发白皮书为先定义IResourceManager的接口规范,然后编写ResourceManager继承框架具体实现(ModuleImp)以及实现接口。最后实现调用层Module,调用层可以拓展编辑器供开发者自定义模块参数。
|
||||||
|
``` csharp
|
||||||
|
/// <summary>
|
||||||
|
/// 游戏框架模块抽象类。ModuleImp为具体框架模块实现。
|
||||||
|
/// </summary>
|
||||||
|
internal abstract class ModuleImp
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 获取游戏框架模块优先级。
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>优先级较高的模块会优先轮询,并且关闭操作会后进行。</remarks>
|
||||||
|
internal virtual int Priority => 0;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 游戏框架模块轮询。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="elapseSeconds">逻辑流逝时间,以秒为单位。</param>
|
||||||
|
/// <param name="realElapseSeconds">真实流逝时间,以秒为单位。</param>
|
||||||
|
internal abstract void Update(float elapseSeconds, float realElapseSeconds);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 关闭并清理游戏框架模块。
|
||||||
|
/// </summary>
|
||||||
|
internal abstract void Shutdown();
|
||||||
|
}
|
||||||
|
|
||||||
|
//=====================================================================//
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 游戏框架模块抽象类。Module 为Mono调用层。
|
||||||
|
/// </summary>
|
||||||
|
public abstract class Module : MonoBehaviour
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 游戏框架模块初始化。
|
||||||
|
/// </summary>
|
||||||
|
protected virtual void Awake()
|
||||||
|
{
|
||||||
|
ModuleSystem.RegisterModule(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 热更域程序集设计与说明
|
||||||
|
```
|
||||||
|
Assets/GameScripts
|
||||||
|
├── Main // 主程序程序集(启动器与流程)
|
||||||
|
└── HotFix // 游戏热更程序集目录 [Folder]
|
||||||
|
├── GameBase // 游戏基础框架程序集 [Dll]
|
||||||
|
├── GameProto // 游戏配置协议程序集 [Dll]
|
||||||
|
└── GameLogic // 游戏业务逻辑程序集 [Dll]
|
||||||
|
├── GameApp.cs 热更主入口
|
||||||
|
└── GameApp_RegisterSystem.cs 热更主入口注册系统
|
||||||
|
```
|
||||||
|
游戏内主要玩法逻辑包括UI会在GameLogic中编写,GameBase则存放一些通用性的逻辑,GameProto存放与服务区交互的协议以及配置表逻辑。若有项目需求完全可以进行自定义增删HotFix程序集。
|
||||||
|
|
||||||
|
PS:注意增删程序集后需要同步到HybridClr的Setting面板以及TEngineSetting的面板。TEngineSettings面板有按钮可以从HybridClr中同步AOT与热更程序集。
|
||||||
|
|
||||||
|
## 常用模块接口
|
||||||
|
|
||||||
|
<strong>[3-1-资源模块](./3-1-资源模块.md)<strong>
|
||||||
|
|
||||||
|
<strong>[3-2-事件模块](./3-2-事件模块.md)<strong>
|
||||||
|
|
||||||
|
<strong>[3-3-内存池模块](./3-3-内存池模块.md)<strong>
|
||||||
|
|
||||||
|
<strong>[3-4-对象池模块](./3-4-对象池模块.md)<strong>
|
||||||
|
|
||||||
|
<strong>[3-5-UI模块](./3-5-UI模块.md)<strong>
|
||||||
|
|
||||||
|
<strong>[3-6-配置表模块](./3-6-配置表模块.md)<strong>
|
||||||
|
|
||||||
|
<strong>[3-7-流程模块](./3-7-流程模块.md)<strong>
|
||||||
|
|
||||||
|
<strong>[3-8-网络模块](./3-8-网络模块.md)<strong>
|
200
Books/3-1-资源模块.md
Normal file
200
Books/3-1-资源模块.md
Normal file
@ -0,0 +1,200 @@
|
|||||||
|
## 3-1.资源模块 - ResourceModule
|
||||||
|
|
||||||
|
#### 资源模块默认使用Addressable可寻址定位。(!注意需要打包的资源不可以重名)
|
||||||
|
|
||||||
|
资源模块运行模式有EditorSimulateMode、OfflinePlayMode以及HostPlayMode
|
||||||
|
编辑器模式下以顶部导航栏的选项卡为优先选项,打包后以Scene场景中ResourceModule脚本的Enum选项卡为优先选项(打包后不会走EditorSimulateMode)
|
||||||
|
|
||||||
|
Scene窗口Resource对象可以设置一些资源模块的常用设置,比如打包后的资源模式、资源校验等级以及自动卸载资源间隔等。
|
||||||
|

|
||||||
|
|
||||||
|
Menu窗口TEngineSetting可以设置一些资源模块的热更新设置,比如资源服务器地址以及在线参数等。备注在Luban目录下有一个基于Node的静态文件服务器,可以把在线参数以及AB放入用于做热更新测试。
|
||||||
|

|
||||||
|
|
||||||
|
## 重要拓展概念
|
||||||
|
* AssetReference (资源引用标识) 通用加载资源的时候绑定一个引用标识使你无需关心手动Dispose资源句柄。
|
||||||
|
|
||||||
|
* AssetGroup(资源组数据)进行资源分组绑定管理内存中的生命周期资源生命周期托管给资源组的根节点进行Dispose。
|
||||||
|
|
||||||
|
* LruCacheTable (Least Recently Used Cache缓存表)
|
||||||
|
|
||||||
|
* ArcCacheTable (Adaptive Replacement Cache缓存表)
|
||||||
|
|
||||||
|
## 加载资源示范
|
||||||
|
注意!资源模块默认使用Addressable可寻址定位。传入资源名字无需后缀即可!!
|
||||||
|
``` csharp
|
||||||
|
|
||||||
|
//同步加载。
|
||||||
|
GameModule.Resource.LoadAsset<SkillDisplayData>(location);
|
||||||
|
|
||||||
|
//异步加载。
|
||||||
|
GameModule.Resource.LoadAssetAsync<SkillDisplayData>(location, OnLoadSuccess);
|
||||||
|
private void OnLoadSuccess(AssetOperationHandle assetOperationHandle){}
|
||||||
|
|
||||||
|
//使用UniTask异步加载。
|
||||||
|
await GameModule.Resource.LoadAssetAsync<SkillDisplayData>(location,CancellationToken.None);
|
||||||
|
```
|
||||||
|
|
||||||
|
## 常用接口
|
||||||
|
remark:资源模块初始化的生命周期已经在流程模块实现了,具体有需求可以自定义开发。
|
||||||
|
``` csharp
|
||||||
|
/// <summary>
|
||||||
|
/// 获取当前资源包版本。
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>资源包版本。</returns>
|
||||||
|
public string GetPackageVersion();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 异步更新最新包的版本。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="appendTimeTicks">请求URL是否需要带时间戳。</param>
|
||||||
|
/// <param name="timeout">超时时间。</param>
|
||||||
|
/// <returns>请求远端包裹的最新版本操作句柄。</returns>
|
||||||
|
public UpdatePackageVersionOperation UpdatePackageVersionAsync(bool appendTimeTicks = false, int timeout = 60);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 向网络端请求并更新清单
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="packageVersion">更新的包裹版本</param>
|
||||||
|
/// <param name="autoSaveVersion">更新成功后自动保存版本号,作为下次初始化的版本。</param>
|
||||||
|
/// <param name="timeout">超时时间(默认值:60秒)</param>
|
||||||
|
public UpdatePackageManifestOperation UpdatePackageManifestAsync(string packageVersion, bool autoSaveVersion = true, int timeout = 60);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 创建资源下载器,用于下载当前资源版本所有的资源包文件。
|
||||||
|
/// </summary>
|
||||||
|
public ResourceDownloaderOperation CreateResourceDownloader();
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 清理包裹未使用的缓存文件。
|
||||||
|
/// </summary>
|
||||||
|
public ClearUnusedCacheFilesOperation ClearUnusedCacheFilesAsync();
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 清理沙盒路径。
|
||||||
|
/// </summary>
|
||||||
|
public void ClearSandbox();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 强制执行释放未被使用的资源。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="performGCCollect">是否使用垃圾回收。</param>
|
||||||
|
public void ForceUnloadUnusedAssets(bool performGCCollect);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 检查资源是否存在。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="assetName">要检查资源的名称。</param>
|
||||||
|
/// <returns>检查资源是否存在的结果。</returns>
|
||||||
|
public HasAssetResult HasAsset(string assetName);
|
||||||
|
|
||||||
|
/// 同步加载资源。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="assetName">要加载资源的名称。</param>
|
||||||
|
/// <typeparam name="T">要加载资源的类型。</typeparam>
|
||||||
|
/// <returns>资源实例。</returns>
|
||||||
|
T LoadAsset<T>(string assetName) where T : Object;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 同步加载资源。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="assetName">要加载资源的名称。</param>
|
||||||
|
/// <param name="parent">父节点位置。</param>
|
||||||
|
/// <typeparam name="T">要加载资源的类型。</typeparam>
|
||||||
|
/// <returns>资源实例。</returns>
|
||||||
|
T LoadAsset<T>(string assetName, Transform parent) where T :Object;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 同步加载资源。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="handle">资源操作句柄。</param>
|
||||||
|
/// <param name="assetName">要加载资源的名称。</param>
|
||||||
|
/// <typeparam name="T">要加载资源的类型。</typeparam>
|
||||||
|
/// <returns>资源实例。</returns>
|
||||||
|
T LoadAsset<T>(string assetName,out AssetOperationHandle handle) where T : Object;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 同步加载资源。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="assetName">要加载资源的名称。</param>
|
||||||
|
/// <param name="handle">资源操作句柄。</param>
|
||||||
|
/// <param name="parent">父节点位置。</param>
|
||||||
|
/// <typeparam name="T">要加载资源的类型。</typeparam>
|
||||||
|
/// <returns>资源实例。</returns>
|
||||||
|
T LoadAsset<T>(string assetName, Transform parent,out AssetOperationHandle handle) where T :Object;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 异步加载资源。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="assetName">要加载资源的名称。</param>
|
||||||
|
/// <param name="cancellationToken">取消操作Token。</param>
|
||||||
|
/// <typeparam name="T">要加载资源的类型。</typeparam>
|
||||||
|
/// <returns>异步资源实例。</returns>
|
||||||
|
UniTask<T> LoadAssetAsync<T>(string assetName,CancellationToken cancellationToken) where T : Object;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 异步加载游戏物体。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="assetName">要加载的游戏物体名称。</param>
|
||||||
|
/// <param name="cancellationToken">取消操作Token。</param>
|
||||||
|
/// <returns>异步游戏物体实例。</returns>
|
||||||
|
UniTask<UnityEngine.GameObject> LoadGameObjectAsync(string assetName,CancellationToken cancellationToken);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 同步加载资源并获取句柄。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="assetName">要加载资源的名称。</param>
|
||||||
|
/// <typeparam name="T">要加载资源的类型。</typeparam>
|
||||||
|
/// <returns>同步加载资源句柄。</returns>
|
||||||
|
AssetOperationHandle LoadAssetGetOperation<T>(string assetName) where T : Object;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 异步加载资源并获取句柄。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="assetName">要加载资源的名称。</param>
|
||||||
|
/// <typeparam name="T">要加载资源的类型。</typeparam>
|
||||||
|
/// <returns>异步加载资源句柄。</returns>
|
||||||
|
AssetOperationHandle LoadAssetAsyncHandle<T>(string assetName) where T : Object;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 同步加载子资源对象
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TObject">资源类型</typeparam>
|
||||||
|
/// <param name="location">资源的定位地址</param>
|
||||||
|
public SubAssetsOperationHandle LoadSubAssetsSync<TObject>(string location) where TObject : UnityEngine.Object;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 异步加载子资源对象
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TObject">资源类型</typeparam>
|
||||||
|
/// <param name="location">资源的定位地址</param>
|
||||||
|
public SubAssetsOperationHandle LoadSubAssetsAsync<TObject>(string location) where TObject : UnityEngine.Object;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 同步加载子资源对象
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="assetInfo">资源信息。</param>
|
||||||
|
public SubAssetsOperationHandle LoadSubAssetsSync(AssetInfo assetInfo);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 异步加载场景。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="location">场景的定位地址</param>
|
||||||
|
/// <param name="sceneMode">场景加载模式</param>
|
||||||
|
/// <param name="activateOnLoad">加载完毕时是否主动激活</param>
|
||||||
|
/// <param name="priority">优先级</param>
|
||||||
|
/// <returns>异步加载场景句柄。</returns>
|
||||||
|
SceneOperationHandle LoadSceneAsync(string location, LoadSceneMode sceneMode = LoadSceneMode.Single, bool activateOnLoad = true, int priority = 100);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 异步加载场景
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="assetInfo">场景的资源信息</param>
|
||||||
|
/// <param name="sceneMode">场景加载模式</param>
|
||||||
|
/// <param name="activateOnLoad">加载完毕时是否主动激活</param>
|
||||||
|
/// <param name="priority">优先级</param>
|
||||||
|
/// <returns>异步加载场景句柄。</returns>
|
||||||
|
SceneOperationHandle LoadSceneAsync(AssetInfo assetInfo, LoadSceneMode sceneMode = LoadSceneMode.Single, bool activateOnLoad = true, int priority = 100);
|
||||||
|
```
|
69
Books/3-2-事件模块.md
Normal file
69
Books/3-2-事件模块.md
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
# 3-2.事件模块 - GameEvent
|
||||||
|
高效且无GC的事件系统GameEvent,可以指定事件ID/事件String监听和分发事件。通过事件来驱动模块,如战斗的角色身上的事件流、UI和网络以及Model的数据流、开发中的绝大部分情况都可以通过事件来进行驱动。(配合UI模块或者拓展的战斗模块实现MVE[Model - View - Event]事件驱动架构)
|
||||||
|
|
||||||
|
事件模块支持string和int作为事件Id,但推荐是使用int因为可以避免事件字典的哈希碰撞。这里实现了StringId.StringToHash的方法来定义事件ID达到事件系统的最佳性能。
|
||||||
|
|
||||||
|
<strong>注:UI模块的事件和UI生命周期存在绑定,销毁UI时可以自动移除UI所监听的事件,开发过程中只需要关心添加事件,避免了关闭UI但没有移除事件监听的问题,角色模块也可以参考实现。(AddUIEvent)</strong>
|
||||||
|
``` csharp
|
||||||
|
public static readonly int Hellp = StringId.StringToHash("Hellp.Hellp");
|
||||||
|
|
||||||
|
class A
|
||||||
|
{
|
||||||
|
public A()
|
||||||
|
{
|
||||||
|
//添加事件监听string
|
||||||
|
GameEvent.AddEventListener("TEngine很好用",TodoSomeThings);
|
||||||
|
//添加事件监听int 事件ID
|
||||||
|
GameEvent.AddEventListener(Hellp,TodoSomeThings2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class B
|
||||||
|
{
|
||||||
|
private void SaySomeThings()
|
||||||
|
{
|
||||||
|
//发送事件流
|
||||||
|
GameEvent.Send("TEngine很好用");
|
||||||
|
GameEvent.Send(Hellp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
【举个例子:游戏中血量扣除的时候,服务器发来了一个减少Hp的消息包,
|
||||||
|
我们可以在收到这个消息包的时候发送一个事件流,在玩家头顶的HP进度
|
||||||
|
条组件/左上角Hp的UI血条组件添加一个监听事件,各个模块负责自己监听后的逻辑】
|
||||||
|
Server -> SendMessage(ReduceHP)
|
||||||
|
|
||||||
|
class ClientHandle
|
||||||
|
{
|
||||||
|
private void HandleMessage(MainPack mainpack)
|
||||||
|
{
|
||||||
|
...
|
||||||
|
HpPack hpPack = mainpack.hpPack;
|
||||||
|
int playerId = mainpack.playerId;
|
||||||
|
var player = PlayerMgr.Instance.GetPlayer(playerId);
|
||||||
|
if(player != null){
|
||||||
|
player.Event.Send("Hpchange",hpPack); //局部的事件管理器
|
||||||
|
GameEvent.Send("Hpchange",hpPack); //全局事件中心
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class PlayerHp
|
||||||
|
{
|
||||||
|
public ECSEventCmpt Event { get; set; }
|
||||||
|
PlayerHp(){
|
||||||
|
Event.AddEventListener<HpPack>(Hellp,HandleUpChange);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Window(UILayer.UI)]
|
||||||
|
class BattleMainUI: UIWindow
|
||||||
|
{
|
||||||
|
public override void RegisterEvent()
|
||||||
|
{
|
||||||
|
AddUIEvent<HpPack>(Hellp,HandleUpChange);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void HandleUpChange(HpPack pack){}
|
||||||
|
}
|
||||||
|
```
|
23
Books/3-3-内存池模块.md
Normal file
23
Books/3-3-内存池模块.md
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
# 3-3.内存池模块 - MemoryPool
|
||||||
|
内存池更为轻量化,相对于对象池更适合一些更抽象碎片化的内存对象。
|
||||||
|
|
||||||
|
Scene窗口MemoryPool对象可以设置内存池检查,防止回收问题与内存泄漏问题。
|
||||||
|

|
||||||
|
|
||||||
|
使用案例
|
||||||
|
``` csharp
|
||||||
|
/// <summary>
|
||||||
|
/// 资源组数据。
|
||||||
|
/// <remarks>DisposeGroup。</remarks>
|
||||||
|
/// </summary>
|
||||||
|
public class AssetGroup : IMemory
|
||||||
|
{
|
||||||
|
public void Clear(){}
|
||||||
|
}
|
||||||
|
|
||||||
|
//内存池中获取/生成内存对象。
|
||||||
|
AssetGroup assetGroup = MemoryPool.Acquire<AssetGroup>();
|
||||||
|
|
||||||
|
//释放内存对象还给内存池。
|
||||||
|
MemoryPool.Release(assetGroup);
|
||||||
|
```
|
64
Books/3-4-对象池模块.md
Normal file
64
Books/3-4-对象池模块.md
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
# 3-4.对象池模块 - ObjectModule
|
||||||
|
对象池较中量级,在客户端开发中是一个经常使用的技术,技术点我相信大家都懂,这里不过多讨论。
|
||||||
|
|
||||||
|
使用案例
|
||||||
|
``` csharp
|
||||||
|
/// <summary>
|
||||||
|
/// Actor对象。
|
||||||
|
/// </summary>
|
||||||
|
public class Actor : ObjectBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 释放对象。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="isShutdown">是否是关闭对象池时触发。</param>
|
||||||
|
protected override void Release(bool isShutdown){}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 创建Actor对象。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="actorName">对象名称。</param>
|
||||||
|
/// <param name="target">对象持有实例。</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static Actor Create(string name, object target)
|
||||||
|
{
|
||||||
|
var actor = MemoryPool.Acquire<Actor>();
|
||||||
|
actor.Initialize(name, target);
|
||||||
|
return actor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Actor对象池。
|
||||||
|
/// </summary>
|
||||||
|
private IObjectPool<Actor> _actorPool;
|
||||||
|
|
||||||
|
void Start()
|
||||||
|
{
|
||||||
|
//创建允许单次获取的对象池。
|
||||||
|
_actorPool = GameModule.ObjectPool.CreateSingleSpawnObjectPool<Actor>(Utility.Text.Format("Actor Instance Pool ({0})", name));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 创建Actor对象。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="actorName">对象名称。</param>
|
||||||
|
/// <param name="target">对象持有实例。</param>
|
||||||
|
/// <returns>Actor对象实例</returns>
|
||||||
|
public Actor CreateActor(string actorName, GameObject target)
|
||||||
|
{
|
||||||
|
Actor ret = null;
|
||||||
|
if (_actorPool.CanSpawn())
|
||||||
|
{
|
||||||
|
ret = _actorPool.Spawn();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ret = Actor.Create(actorName, target);
|
||||||
|
_actorPool.Register(ret,true);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
126
Books/3-5-UI模块.md
Normal file
126
Books/3-5-UI模块.md
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
# 3-5.UI模块 - UIModule
|
||||||
|
一个游戏70%都是UI,剩下30%才是GamePlay,所以有一套简洁强大的商业化UI模块以及UI开发工作流将是项目的一大利器,能够提高至少一倍的开发效率。(配合事件模块实现MVE[Model - View - Event]事件驱动架构)
|
||||||
|
|
||||||
|
UI脚本为纯C#实现,脱离Mono的生命周期,由UIModule的帧更新驱动并管理UI的生命周期。
|
||||||
|
|
||||||
|
IUIBehaviour为UI通用行为接口、UIBase为UI基类、UIWindow为UI窗口基类,UIWidget为UI组件基类。
|
||||||
|
|
||||||
|
## 前期配置:
|
||||||
|
注意!!!!m_item节点为特殊节点表示是UI下的UIWidget组件,不会继续往下遍历生成UI代码。若需要这个UIWidget组件m_item的代码则在m_item右键生成这个组件的UI脚本。
|
||||||
|
|
||||||
|
Scene窗口下右键ScriptGenerator菜单下About目录有默认UI命名前缀规范。
|
||||||
|

|
||||||
|
|
||||||
|
有自定义需求可以在TEngineSetting下进行自定义。
|
||||||
|

|
||||||
|
### 开发工作流:
|
||||||
|
1.遵守前期默认配置或者自定义配置进行UI编排
|
||||||
|

|
||||||
|
|
||||||
|
2.在UI的根节点右键ScriptGenerator生成UI代码到剪贴板上!!!(注-使用-UniTask的生成代码可以做异步事件流驱动的UI。)
|
||||||
|

|
||||||
|
|
||||||
|
3.自行创建UI脚本到需要的目录下并复制UI脚本。
|
||||||
|
|
||||||
|
## 举例示范
|
||||||
|
``` csharp
|
||||||
|
// 同步打开面板
|
||||||
|
GameModule.UI.ShowUI<GameMainUI>([nullable]userData);
|
||||||
|
|
||||||
|
// 异步打开面板
|
||||||
|
GameModule.UI.ShowUIAsync<GameMainUI>([nullable]userData);
|
||||||
|
|
||||||
|
namespace GameLogic
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// BattleMainUI面板
|
||||||
|
/// <remarks>UIWindow需要以下特性,UILayer可以自行定义,fullScreen表示为全屏面板会停止和隐藏这个面板堆栈后面的面板。</remarks>
|
||||||
|
/// </summary>
|
||||||
|
[Window(UILayer.Bottom,fullScreen:true)]
|
||||||
|
class BattleMainUI : UIWindow
|
||||||
|
{
|
||||||
|
private TouchMove m_touchView;
|
||||||
|
|
||||||
|
#region 脚本工具生成的代码
|
||||||
|
private RectTransform m_rectContainer;
|
||||||
|
private GameObject m_itemTouch;
|
||||||
|
private Button m_btnLeaveBattle;
|
||||||
|
private GameObject m_goTopInfo;
|
||||||
|
private Button m_btnPause;
|
||||||
|
public override void ScriptGenerator()
|
||||||
|
{
|
||||||
|
m_rectContainer = FindChildComponent<RectTransform>("m_rectContainer");
|
||||||
|
m_itemTouch = FindChild("m_rectContainer/m_itemTouch").gameObject;
|
||||||
|
m_btnLeaveBattle = FindChildComponent<Button>("m_btnLeaveBattle");
|
||||||
|
m_goTopInfo = FindChild("m_goTopInfo").gameObject;
|
||||||
|
m_btnPause = FindChildComponent<Button>("m_goTopInfo/m_btnPause");
|
||||||
|
m_btnLeaveBattle.onClick.AddListener(OnClickLeaveBattleBtn);
|
||||||
|
m_btnPause.onClick.AddListener(OnClickPauseBtn);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region 事件
|
||||||
|
|
||||||
|
private void OnClickPauseBtn()
|
||||||
|
{
|
||||||
|
BattleSys.Instance.Pause = !BattleSys.Instance.Pause;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnClickLeaveBattleBtn()
|
||||||
|
{
|
||||||
|
BattleSys.Instance.StopBattle(isBattleEnd:false,isWin:false);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
//注册事件举例
|
||||||
|
public override void RegisterEvent()
|
||||||
|
{
|
||||||
|
//通过AddUIEvent这样注册事件会把事件的生命周期绑定给面板,面板销毁的时候自动移除监听。
|
||||||
|
AddUIEvent(ActorLogicEventDefined.OnMainPlayerBagDataChange, RefreshUI);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void BindMemberProperty()
|
||||||
|
{
|
||||||
|
//特殊的m_item节点的域不属于父级UIWindows,所以如注意所说需要同样创建这个UIWidget的脚本并生成代码过去。 可以如下创建或者走type、path创建。
|
||||||
|
m_touchView = CreateWidget<TouchMove>(m_itemTouch);
|
||||||
|
}
|
||||||
|
|
||||||
|
......
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace GameLogic
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 移动操作UIWidget。
|
||||||
|
/// </summary>
|
||||||
|
class TouchMove : UIWidget, IUICtrlMove
|
||||||
|
{
|
||||||
|
public override void BindMemberProperty()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//注意Update只有在重写了此方法才会驱动这个Widget或者面板的Update。
|
||||||
|
public override void OnUpdate()
|
||||||
|
{
|
||||||
|
TProfiler.BeginSample("CheckMoveTouchFinger");
|
||||||
|
CheckMoveTouchFinger();
|
||||||
|
TProfiler.EndSample();
|
||||||
|
|
||||||
|
TProfiler.BeginSample("UpdateTouchMovePos");
|
||||||
|
UpdateTouchMovePos();
|
||||||
|
TProfiler.EndSample();
|
||||||
|
|
||||||
|
TProfiler.BeginSample("UpdateKeyMove");
|
||||||
|
UpdateKeyMove();
|
||||||
|
TProfiler.EndSample();
|
||||||
|
}
|
||||||
|
......
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## UI进阶
|
||||||
|
UI面板需要标记UIWindowAttribute,以标识层级(可以自行定义)和是否全屏。全屏面板则会把下层面板的Visible设置为false。
|
||||||
|

|
||||||
|
|
63
Books/3-6-配置表模块.md
Normal file
63
Books/3-6-配置表模块.md
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
# 3-6.配置表模块 - ConfigSystem
|
||||||
|
接入最佳游戏配置解决方案 - <a href="https://github.com/focus-creative-games/luban"><strong>Luban</strong></a>
|
||||||
|
|
||||||
|
<a href="https://luban.doc.code-philosophy.com/#/manual/traits"><strong>Luban文档 </strong></a>
|
||||||
|
|
||||||
|
### 在TEngine中Luban配置表目录位于以下目录
|
||||||
|

|
||||||
|
|
||||||
|
### 安装luban配置表
|
||||||
|
1.在TEngine根目录同级克隆下最新的luban-next仓库。
|
||||||
|

|
||||||
|
2.Tools目录执行build-luban完成
|
||||||
|

|
||||||
|
|
||||||
|
3.转表则去luban配置目录执行对应bat
|
||||||
|
|
||||||
|
TEngine内置默认使用懒加载配置,也支持基于UniTask的异步加载,同步加载,包括服务器的Task异步加载,使用对应转表的bat即可。
|
||||||
|
|
||||||
|
### 介绍
|
||||||
|
luban是你的最佳游戏配置解决方案。
|
||||||
|
|
||||||
|
luban高效地处理游戏开发中常见的excel、json、xml之类的数据,检查数据错误,生成c#等各种语言的代码,导出成bytes或json等多种格式。
|
||||||
|
|
||||||
|
luban统一了游戏配置开发工作流,极大提升了策划和程序的工作效率。
|
||||||
|
|
||||||
|
核心特性
|
||||||
|
强大的数据解析和转换能力 {excel(csv,xls,xlsx)、json、bson、xml、yaml、lua、unity ScriptableObject} => {binary、json、bson、xml、lua、yaml、erlang、 custom format}
|
||||||
|
增强的excel格式,可以简洁地配置出像简单列表、子结构、结构列表,以及任意复杂的深层次的嵌套结构。
|
||||||
|
完备的类型系统,支持OOP类型继承,搭配excel、json、lua、xml等格式数据灵活优雅表达行为树、技能、剧情、副本之类复杂GamePlay数据
|
||||||
|
支持生成c#、java、go、c++、lua、python、javascript、typescript、erlang、rust、gdscript 代码
|
||||||
|
支持生成 protobuf(schema + binary + json)、flatbuffers(schema + json)、msgpack(binary)
|
||||||
|
强大的数据校验能力。ref引用检查、path资源路径、range范围检查等等
|
||||||
|
完善的本地化支持。静态文本值本地化、动态文本值本地化、时间本地化、main-patch多地区版本
|
||||||
|
强大灵活的自定义能力,支持自定义代码模板和数据模板
|
||||||
|
通用型生成和缓存工具。也可以用于生成协议、数据库之类的代码,甚至可以用作对象缓存服务。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
使用案例
|
||||||
|
``` csharp
|
||||||
|
/// <summary>
|
||||||
|
/// 道具配置表管理器。
|
||||||
|
/// </summary>
|
||||||
|
public class ItemConfigMgr: Singleton<ItemConfigMgr>
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 道具Table。
|
||||||
|
/// </summary>
|
||||||
|
private TbItem TbItem => ConfigLoader.Instance.Tables.TbItem;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取道具配置表。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="itemId">道具Id。</param>
|
||||||
|
/// <returns>道具配置表。</returns>
|
||||||
|
public ItemConfig GetItemConfig(int itemId)
|
||||||
|
{
|
||||||
|
TbItem.DataMap.TryGetValue(itemId, out var config);
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
27
Books/3-7-流程模块.md
Normal file
27
Books/3-7-流程模块.md
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
# 7.流程模块 - ProcedureModule
|
||||||
|
|
||||||
|
### ProcedureLaunch - 流程启动
|
||||||
|
|
||||||
|
### ProcedureSplash - 流程闪屏
|
||||||
|
|
||||||
|
### ProcedureInitPackage - 流程初始化Package
|
||||||
|
|
||||||
|
### ProcedurePreload - 流程预加载
|
||||||
|
|
||||||
|
### ProcedureInitResources - 流程初始化Resources
|
||||||
|
|
||||||
|
### ProcedureUpdateVersion - 流程更新版本Version
|
||||||
|
|
||||||
|
### ProcedureUpdateManifest - 流程更新Mainfest清单
|
||||||
|
|
||||||
|
### ProcedureCreateDownloader - 流程创建下载器
|
||||||
|
|
||||||
|
### ProcedureDownloadFile - 流程下载文件
|
||||||
|
|
||||||
|
### ProcedureDownloadOver - 流程下载文件结束
|
||||||
|
|
||||||
|
### ProcedureClearCache - 流程清理缓存
|
||||||
|
|
||||||
|
### ProcedureLoadAssembly - 流程加载进入热更新程序集
|
||||||
|
|
||||||
|
### ProcedureStartGame - 流程开始游戏
|
2
Books/3-8-网络模块.md
Normal file
2
Books/3-8-网络模块.md
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
# 8.网络模块 - Network
|
||||||
|
待补充
|
26
Books/99-各平台运行RunAble.md
Normal file
26
Books/99-各平台运行RunAble.md
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
# TEngine各平台下运行
|
||||||
|
|
||||||
|
### 日志记录编辑器下运行
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
### Win64位包运行
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
### 安卓真机运行
|
||||||
|

|
||||||
|
|
||||||
|
### IOS真机运行
|
||||||
|

|
||||||
|
|
||||||
|
### WebGL真机运行
|
||||||
|

|
||||||
|
|
||||||
|
### 索尼 PS5 真机运行
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|

|
Loading…
x
Reference in New Issue
Block a user