Compare commits

..

61 Commits

Author SHA1 Message Date
Alex-Rachel
5887133894 更新Procedure流程
更新Procedure流程
2025-02-20 01:39:52 +08:00
Alex-Rachel
6166fd24c6 yoo2.2,9
yoo2.2,9
2025-01-25 13:46:17 +08:00
Alex-Rachel
634a392a1f Update HybridCLR -> 7.3.0
Update HybridCLR -> 7.3.0
2025-01-15 23:54:31 +08:00
Alex-Rachel
b869a05220 #104 目前调用 HideUI 会将 UIWindow 的 Visible 设置为 false,但是如果又调用 CloseUI 方法,会将刚才 Visible 设置为 false 的窗口重新设置为 true。 2024-12-22 13:13:59 +08:00
ALEX
37d88c2d94 Merge pull request #103 from 6ag/main
更新文档
2024-12-17 10:07:14 +08:00
feng
f3aa8824d8 更新文档 2024-12-17 10:03:53 +08:00
ALEX
99c5afcbc5 Merge pull request #102 from 6ag/main
UIWindow新增Hide方法,将UIWindow中的UserData和UserDatas属性移动到UIBase
2024-12-16 23:46:33 +08:00
feng
4075588c34 UIWindow新增Hide方法,将UIWindow中的UserData和UserDatas属性移动到UIBase 2024-12-16 22:36:26 +08:00
Alex-Rachel
fdd9f34132 Merge branch 'main' of https://github.com/ALEXTANGXIAO/TEngine 2024-12-09 11:34:17 +08:00
Alex-Rachel
a2ab6efc71 #101 2024-12-09 11:34:05 +08:00
ALEX
67025c806e Update README.md 2024-12-09 11:12:02 +08:00
ALEXTANGXIAO
38afa45f9c #100 2024-12-04 10:45:19 +08:00
ALEXTANGXIAO
0dc572f43e #97 2024-12-02 23:51:53 +08:00
ALEXTANGXIAO
0679d924c1 Merge branch 'main' of https://github.com/ALEXTANGXIAO/TEngine 2024-12-02 23:48:12 +08:00
ALEXTANGXIAO
3de8cad99a #99 2024-12-02 23:46:08 +08:00
ALEX
065d5a7303 Merge pull request #98 from 6ag/main
适配 luban-next 最新版本的配表结构,新增 Mac 设备相关的 shell 脚本支持
2024-11-30 23:29:45 +08:00
feng
c089eb32ba 适配 luban-next 最新版本的配表结构,新增 Mac 设备相关的 shell 脚本支持 2024-11-30 23:09:45 +08:00
ALEXTANGXIAO
d571a937f8 UIWindow同一帧关闭导致GameObject无法销毁的极小概率bug修复 2024-11-22 23:09:44 +08:00
ALEXTANGXIAO
89210483a9 ScriptGenerator控制台日志 2024-10-16 22:56:39 +08:00
ALEXTANGXIAO
058ac2c9a5 RemoveAllListenerByOwner 倒序移除 2024-10-11 21:47:21 +08:00
ALEXTANGXIAO
990222c7c6 资源释放时序优化 2024-10-05 15:18:51 +08:00
ALEXTANGXIAO
d3914a96bb Merge branch 'main' of https://github.com/ALEXTANGXIAO/TEngine 2024-09-20 22:43:29 +08:00
ALEXTANGXIAO
4b178a9fa9 #80 2024-09-20 22:43:08 +08:00
ALEXTANG
79929c4ac3 Merge pull request #95 from landoU/main
修正:异步获取窗口方法GetUIAsync获取不到已加载的窗口
2024-09-20 22:29:28 +08:00
liufeiwei
38fa4d5cbc 修正:异步获取窗口方法GetUIAsync获取不到已显示的窗口 2024-09-18 09:42:12 +08:00
ALEXTANG
3ac6977f93 Rmv 2024-09-02 16:40:19 +08:00
ALEXTANGXIAO
3facec8f93 Update ProcedureInitPackage.cs 2024-08-25 19:09:07 +08:00
ALEXTANGXIAO
0570982b97 * support package mode tengine setting
* support package mode tengine setting
2024-08-25 19:07:11 +08:00
ALEXTANG
f785264873 #94 资源加载assetLoadingList处理
#94 资源加载assetLoadingList处理
2024-08-24 21:02:12 +08:00
ALEXTANGXIAO
4911ec074c 新增GetUIAsync,ShowUIAsyncAwait
新增GetUIAsync,ShowUIAsyncAwait
2024-08-11 10:24:27 +08:00
ALEXTANGXIAO
6ff9546152 Update RedNoteMgr.cs 2024-08-10 22:21:17 +08:00
ALEXTANG
5a8dc04b9c Merge pull request #92 from Kojima648/main
[opt] TEngine 设置界面逻辑优化
2024-08-10 17:24:37 +08:00
chengshengfei
d4482cf1c4 [opt]
中文:优化设置界面的tab切换,页面数据保存逻辑
English: Optimize tab switching and page data saving logic in the settings interface
2024-08-10 16:47:30 +08:00
ALEXTANG
c7fad139ba Merge pull request #91 from mi1890/main
* [fix] installed  as a  package ,class not found issue
2024-08-09 00:43:18 +08:00
mr.zz
650469a7db * support package mode tengine setting 2024-08-09 00:25:48 +08:00
mr.zz
c7c00eac9f * [fix] installed as a package ,class not found issue 2024-08-07 23:58:47 +08:00
ALEXTANG
5a883bc8ec Merge pull request #88 from kenkinky/main
[fixed]选中ResourceModule时进入Play模式抛出异常
2024-08-03 18:55:40 +08:00
BCC
79c1026c7c [fixed]选中ResourceModule时进入Play模式抛出异常 2024-08-02 12:54:25 +08:00
ALEXTANGXIAO
f2c69d58b2 DefaultLogger支持Unity6 2024-07-14 14:51:44 +08:00
ALEXTANGXIAO
c38d3b7cfa 支持Unity6 2024-07-14 14:37:43 +08:00
ALEXTANGXIAO
98cb74537a update hybridclr_version & UnityPackage Version 2024-07-14 14:32:00 +08:00
ALEXTANGXIAO
ed19a75be9 Update GameApp_RegisterSystem.cs 2024-07-14 14:30:43 +08:00
ALEXTANG
fd82ddf427 Merge pull request #85 from Vorik-S/main
加载热更新程序集的崩溃bug修正
2024-07-11 12:23:12 +08:00
沈挺
e53ceb0095 单例对象销毁时的检查,修正由此错误的销毁单例对象的bug 2024-07-09 18:49:55 +08:00
沈挺
9afda78735 修正GameApp_RegisterSystem文件漏写基类导致真机上无法正确执行GameApp.Instance.Active方法的bug 2024-07-09 17:23:24 +08:00
沈挺
5734d4f995 加载热更新程序集的崩溃bug修正 2024-07-09 16:11:41 +08:00
ALEXTANG
dc7ab7fd64 Merge branch 'main' of https://github.com/ALEXTANGXIAO/TEngine 2024-06-27 21:02:55 +08:00
ALEXTANG
fcb3416acd Update ResourceManager.cs 2024-06-27 21:02:47 +08:00
ALEXTANG
3df18c006d Merge pull request #82 from SaberArtoriaFan/Dev2
扩展绑定TE UI框架的便捷工具
2024-06-21 14:19:12 +08:00
EdwardLee
6cfae215dc 11 2024-06-21 00:59:26 +08:00
ALEXTANG
1aaa46c82c 资源模块增加设置:是否使用系统释放无用资源策略。
资源模块增加设置:是否使用系统释放无用资源策略。
2024-06-20 09:42:49 +08:00
ALEXTANG
ca79adce7c Merge pull request #79 from Severn17/main
新增WebGL一键打包功能 及 全平台运行增加WebGL示例图片
2024-06-17 15:22:15 +08:00
yangshiqi
b520eba187 新增WebGL一键打包功能 及 全平台运行增加WebGL示例图片 2024-06-14 15:09:01 +08:00
ALEXTANG
b5afaca217 Merge pull request #78 from Senfee-Cheng/main
[fix] 在注册事件之前调用初始化
2024-06-13 17:32:39 +08:00
chengshengfei
ea2efbf588 [fix] 在注册事件之前调用初始化 2024-06-13 16:21:40 +08:00
ALEXTANG
a4b1befc5a Merge pull request #77 from Senfee-Cheng/main
[opt] (编辑器下)如果有多个资源的Package,组件提供一个下拉,使用Yoo收集器的列表
2024-05-28 19:22:53 +08:00
ALEXTANG
8dcddfa328 Update EventInterfaceGenerate.cs 2024-05-28 19:19:01 +08:00
chengshengfei
dd37d130da [opt] (编辑器下)如果有多个资源的Package,组件提供一个下拉,使用Yoo收集器的列表 2024-05-28 19:16:45 +08:00
ALEXTANG
24d7dbc677 EventInterfaceGenerate支持List与Dictionary(但不推荐用)
EventInterfaceGenerate支持List与Dictionary(但不推荐用)
2024-05-28 18:09:13 +08:00
ALEXTANG
491100b932 Merge pull request #76 from Senfee-Cheng/main
[opt] 优化下载更新界面的显示
2024-05-28 16:55:42 +08:00
chengshengfei
c84c21574d [opt] 优化下载更新界面的显示 2024-05-28 15:56:05 +08:00
698 changed files with 16625 additions and 22031 deletions

View File

@@ -13,11 +13,12 @@
![image](src/1-2.png)
### 4.打包运行
* 1.运行菜单 HybridCLR/Define Symbols/Enable HybridCLR 运行开启HybridCLR热更新
* 2.运行菜单 HybridCLR/Generate/All 进行必要的生成操作。这一步不可遗漏!!!
* 3.运行菜单 HybridCLR/Build/BuildAssets And CopyTo AssemblyPath生成热更新dll并copy到热更程序集中。
* 4.运行菜单 YooAsset/AssetBundle Builder 构建AB
* 5.打开Build Settings对话框点击Build And Run打包并且运行热更新示例工程
* 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>
@@ -33,26 +34,30 @@
### 目录结构
```
Assets
├── AssetRaw 资源目录
── Atlas 图集目录
├── GameScripts 热更程序集目录
├── Scenes 主场景目录
└── TEngine
── AssetSetting YooAsset资源设置
├── Editor TEngine-Editor程序集
└── Runtime TEngine-Runtime程序集
├── 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
├── Editor 编辑器程序集
── HotFix 游戏热更程序集目录 [Folder]
| ├── GameBase 游戏基础框架程序集 [Dll]
| ├── GameProto 游戏配置协议程序集 [Dll]
| ── BattleCore 游戏核心战斗程序集 [Dll]
| └── GameLogic 游戏业务逻辑程序集 [Dll]
| ── GameApp.cs 热更主入口
| └── GameApp_RegisterSystem.cs 热更主入口注册系统
└── Runtime Runtime程序集
├── Main // 主程序程序集(启动器与流程)
── HotFix // 游戏热更程序集目录 [Folder]
├── GameBase // 游戏基础框架程序集 [Dll]
├── GameProto // 游戏配置协议程序集 [Dll]
── GameLogic // 游戏业务逻辑程序集 [Dll]
├── GameApp.cs // 热更主入口
── GameApp_RegisterSystem.cs // 热更主入口注册系统
```

View File

@@ -51,17 +51,15 @@ public abstract class Module : MonoBehaviour
## 热更域程序集设计与说明
```
Assets/GameScripts
├── Editor 编辑器程序集
── HotFix 游戏热更程序集目录 [Folder]
| ├── GameBase 游戏基础框架程序集 [Dll]
| ├── GameProto 游戏配置协议程序集 [Dll]
| ── BattleCore 游戏核心战斗程序集 [Dll]
| ── GameLogic 游戏业务逻辑程序集 [Dll]
| ── GameApp.cs 热更主入口
| └── GameApp_RegisterSystem.cs 热更主入口注册系统
└── Runtime Runtime程序集
├── Main // 主程序程序集(启动器与流程)
── HotFix // 游戏热更程序集目录 [Folder]
├── GameBase // 游戏基础框架程序集 [Dll]
├── GameProto // 游戏配置协议程序集 [Dll]
── GameLogic // 游戏业务逻辑程序集 [Dll]
── GameApp.cs 热更主入口
── GameApp_RegisterSystem.cs 热更主入口注册系统
```
游戏内主要玩法逻辑包括UI会在GameLogic中编写GameBase则存放一些通用性的逻辑GameProto存放与服务区交互的协议以及配置表逻辑BattleCore为帧同步分离的逻辑层做预留。若有项目需求完全可以进行自定义增删HotFix程序集。
游戏内主要玩法逻辑包括UI会在GameLogic中编写GameBase则存放一些通用性的逻辑GameProto存放与服务区交互的协议以及配置表逻辑。若有项目需求完全可以进行自定义增删HotFix程序集。
PS注意增删程序集后需要同步到HybridClr的Setting面板以及TEngineSetting的面板。TEngineSettings面板有按钮可以从HybridClr中同步AOT与热更程序集。

View File

@@ -6,6 +6,8 @@
### ProcedureInitPackage - 流程初始化Package
### ProcedurePreload - 流程预加载
### ProcedureInitResources - 流程初始化Resources
### ProcedureUpdateVersion - 流程更新版本Version
@@ -20,5 +22,6 @@
### ProcedureClearCache - 流程清理缓存
### ProcedureLoadAssembly - 流程加载进入热更新程序集
### ProcedureLoadAssembly - 流程加载进入热更新程序集
### ProcedureStartGame - 流程开始游戏

View File

@@ -15,6 +15,9 @@
### IOS真机运行
![image](src/Iphone-RunSuccessed.png)
### WebGL真机运行
![image](src/WebGL-RunSuccessed.png)
### 索尼 PS5 真机运行
![image](src/Console%20Viewer.png)

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

18
BuildCLI/build_android.sh Normal file
View File

@@ -0,0 +1,18 @@
#!/bin/bash
cd "$(dirname "$0")"
source ./path_define.sh
"${UNITYEDITOR_PATH}/Unity" "${WORKSPACE}" \
-logFile "${BUILD_LOGFILE}" \
-executeMethod TEngine.ReleaseTools.AutomationBuildAndroid \
-quit -batchmode \
-CustomArgs:Language=en_US "${WORKSPACE}"
while IFS= read -r line; do
echo "$line"
done < "${BUILD_LOGFILE}"
echo "按任意键继续..."
read -k1

14
BuildCLI/path_define.sh Normal file
View File

@@ -0,0 +1,14 @@
#!/bin/bash
cd "$(dirname "$0")"
export WORKSPACE="/Users/your_user/github/TEngine/UnityProject" # 请替换为 macOS 上的实际路径
export UNITYEDITOR_PATH="/Applications/Unity/Hub/Editor/2021.3.20f1c1/Unity.app/Contents/MacOS" # 请替换为 macOS 上的 Unity 路径
export BUILD_DLL_LOGFILE="./build_dll.log"
export BUILD_LOGFILE="./build.log"
echo "环境变量已设置:"
echo "WORKSPACE=${WORKSPACE}"
echo "UNITYEDITOR_PATH=${UNITYEDITOR_PATH}"
echo "BUILD_DLL_LOGFILE=${BUILD_DLL_LOGFILE}"
echo "BUILD_LOGFILE=${BUILD_LOGFILE}"

View File

@@ -0,0 +1,24 @@
#!/bin/bash
cd "$(dirname "$0")"
echo "当前目录: $(pwd)"
export WORKSPACE="$(realpath ../../)"
export LUBAN_DLL="${WORKSPACE}/Tools/Luban/Luban.dll"
export CONF_ROOT="$(pwd)"
export DATA_OUTPATH="${WORKSPACE}/UnityProject/Assets/AssetRaw/Configs/bytes/"
export CODE_OUTPATH="${WORKSPACE}/UnityProject/Assets/GameScripts/HotFix/GameProto/GameConfig/"
cp -R "${CONF_ROOT}/CustomTemplate/ConfigSystem.cs" \
"${WORKSPACE}/UnityProject/Assets/GameScripts/HotFix/GameProto/ConfigSystem.cs"
dotnet "${LUBAN_DLL}" \
-t client \
-c cs-bin \
-d bin \
--conf "${CONF_ROOT}/luban.conf" \
-x outputCodeDir="${CODE_OUTPATH}" \
-x outputDataDir="${DATA_OUTPATH}"
echo "操作完成,按任意键退出..."
read -k1

View File

@@ -0,0 +1,25 @@
#!/bin/bash
cd "$(dirname "$0")"
echo "当前目录: $(pwd)"
export WORKSPACE="$(realpath ../../)"
export LUBAN_DLL="${WORKSPACE}/Tools/Luban/Luban.dll"
export CONF_ROOT="$(pwd)"
export DATA_OUTPATH="${WORKSPACE}/UnityProject/Assets/AssetRaw/Configs/bytes/"
export CODE_OUTPATH="${WORKSPACE}/UnityProject/Assets/GameScripts/HotFix/GameProto/GameConfig/"
cp -R "${CONF_ROOT}/CustomTemplate/ConfigSystem.cs" \
"${WORKSPACE}/UnityProject/Assets/GameScripts/HotFix/GameProto/ConfigSystem.cs"
dotnet "${LUBAN_DLL}" \
-t client \
-c cs-bin \
-d bin \
--conf "${CONF_ROOT}/luban.conf" \
--customTemplateDir "${CONF_ROOT}/CustomTemplate/CustomTemplate_Client_LazyLoad" \
-x outputCodeDir="${CODE_OUTPATH}" \
-x outputDataDir="${DATA_OUTPATH}"
echo "操作完成,按任意键退出..."
read -k1

View File

@@ -0,0 +1,21 @@
#!/bin/bash
cd "$(dirname "$0")"
echo "当前目录: $(pwd)"
export WORKSPACE="$(realpath ../../)"
export LUBAN_DLL="${WORKSPACE}/Tools/Luban/Luban.dll"
export CONF_ROOT="$(pwd)"
export DATA_OUTPATH="${WORKSPACE}/Server/GameConfig"
export CODE_OUTPATH="${WORKSPACE}/Server/Hotfix/Config/GameConfig"
dotnet "${LUBAN_DLL}" \
-t server \
-c cs-bin \
-d bin \
--conf "${CONF_ROOT}/luban.conf" \
-x outputCodeDir="${CODE_OUTPATH}" \
-x outputDataDir="${DATA_OUTPATH}"
echo "操作完成,按任意键退出..."
read -k1

View File

@@ -64,20 +64,24 @@ Net Core现在已经更新到了8.0的版本,在性能和设计上其实是远
## <strong>项目结构概览
```
Assets
├── AssetArt // 美术资源目录
│ └── Atlas // 自动生成图集目录
├── AssetRaw // 热更资源目录
├── Atlas // 自动生成图集目录
│ ├── UIRaw // UI图片目录
│ │ ├── Atlas // 需要自动生成图集的UI素材目录
│ │ └── Raw // 不需要自动生成图集的UI素材目录
├── Editor // 编辑器脚本目录
├── HybridCLRData // hybridclr相关目录
├── Scenes // 主场景目录
├── TEngine // 框架核心目录
└── GameScripts // 程序集目录
├── Editor // 编辑器程序集
├── Main // 主程序程序集(启动器与流程)
└── HotFix // 游戏热更程序集目录 [Folder]
├── GameBase // 游戏基础框架程序集 [Dll]
├── GameProto // 游戏配置协议程序集 [Dll]
├── BattleCore // 游戏核心战斗程序集 [Dll]
├── GameProto // 游戏配置协议程序集 [Dll]
└── GameLogic // 游戏业务逻辑程序集 [Dll]
├── GameApp.cs // 热更主入口
└── GameApp_RegisterSystem.cs // 热更主入口注册系统
└── GameApp_RegisterSystem.cs // 热更主入口注册系统
TEngine
@@ -86,7 +90,7 @@ TEngine
```
- 必要:项目使用了以下第三方插件,请自行购买导入:
- /Unity/Assets/Plugins/Sirenix
- /UnityProject/Assets/Plugins/Sirenix
---
## <strong>优质开源项目推荐
@@ -101,9 +105,6 @@ TEngine
#### <a href="https://github.com/ALEXTANGXIAO/GameNetty"><strong>GameNetty</strong></a> - GameNetty是一套源于ETServer首次拆分最新的ET8.1的前后端解决方案客户端最精简大约750k完美做成包的形式几乎零成本 无侵入的嵌入进你的框架。
## <strong>交流群
### <a href="http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=MzOcQIzGVLQ5AC5LHaqqA3h_F6lZ_DX4&authKey=LctqAWGHkJ7voQvuj1oaSe5tsGrc1XmQG3U4QniieGUlxY3lC7FtDIpEvPOX0vT8&noverify=0&group_code=862987645">群 号862987645 </strong></a>
## <strong>Buy me a 奶茶.

3
Tools/FileServer/instal.sh Executable file
View File

@@ -0,0 +1,3 @@
#!/bin/bash
npm install yumu-static-server -g

3
Tools/FileServer/start.sh Executable file
View File

@@ -0,0 +1,3 @@
#!/bin/bash
server -p 8081 -cors

View File

@@ -1,40 +0,0 @@
using TEngine;
namespace GameBase
{
/// <summary>
/// 用于检测耗时。
/// </summary>
public class GameTickWatcher
{
private long _startTick;
public GameTickWatcher()
{
Refresh();
}
public void Refresh()
{
_startTick = System.DateTime.Now.Ticks;
}
/// <summary>
/// 获取用时。
/// </summary>
/// <returns></returns>
public float ElapseTime()
{
long endTick = System.DateTime.Now.Ticks;
return (float)((endTick - _startTick) / 10000) / 1000.0f;
}
/// <summary>
/// 输出用时。
/// </summary>
public void LogUsedTime()
{
Log.Info($"Used Time: {this.ElapseTime()}");
}
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 7320165f7aa147a998a30fe2f7a5a5c2
timeCreated: 1681989139

View File

@@ -36,7 +36,10 @@ namespace GameBase
protected virtual void OnDestroy()
{
Release();
if (this == _instance)
{
Release();
}
}
/// <summary>
@@ -60,7 +63,7 @@ namespace GameBase
if (_instance != null)
{
SingletonSystem.Release(_instance.gameObject);
_instance = null;
_instance = null;
}
}
@@ -96,7 +99,7 @@ namespace GameBase
}
}
if(_instance == null)
if (_instance == null)
{
Log.Error($"Can't create SingletonBehaviour<{typeof(T)}>");
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 6dd993a020654e8bbcc4e70ea0029447
timeCreated: 1695289810

View File

@@ -1,189 +0,0 @@
using System;
using System.Collections.Generic;
using TEngine;
using UnityEngine;
using UnityEngine.UI;
namespace GameLogic
{
/// <summary>
/// 红点个体行为。
/// </summary>
public class RedNoteBehaviour : UIWidget
{
public Action<bool> HaveRedNoteAction;
//当前红点类型
public RedNoteNotify RedNoteNotifyType { get; private set; }
//启用时当作标记解决带有ID创建多个类似条目的情况
public readonly List<ulong> IdParamList = new List<ulong>();
private readonly List<ulong> _tmpIdParam = new List<ulong>();
private Image _image;
private Image Image
{
get
{
if (_image == null && gameObject != null)
{
_image = gameObject.GetComponent<Image>();
}
return _image;
}
}
private Text _text;
private Text Text
{
get
{
if (_text == null && gameObject != null)
{
_text = FindChildComponent<Text>(rectTransform, "Text");
}
return _text;
}
}
private bool _state = false;
/// <summary>
/// 当前红点状态。
/// </summary>
public bool CurState
{
private set
{
_state = value;
if (Image == null)
{
gameObject.SetActive(_state);
return;
}
Color c = Image.color;
c.a = _state ? 1f : 0.01f;
Image.color = c;
if (HaveRedNoteAction != null)
{
HaveRedNoteAction(_state);
}
}
get => _state;
}
//设置显示状态
public void SetRedNoteState(bool state)
{
CurState = state;
}
// 设置红点类型
public void SetNotifyType(RedNoteNotify notifyType)
{
_tmpIdParam.Clear();
SetNotifyType(notifyType, _tmpIdParam);
}
#region
public void SetNotifyType(RedNoteNotify notifyType, ulong param1)
{
_tmpIdParam.Clear();
_tmpIdParam.Add(param1);
SetNotifyType(notifyType, _tmpIdParam);
}
public void SetNotifyType(RedNoteNotify notifyType, ulong param1, ulong param2)
{
_tmpIdParam.Clear();
_tmpIdParam.Add(param1);
_tmpIdParam.Add(param2);
SetNotifyType(notifyType, _tmpIdParam);
}
public void SetNotifyType(RedNoteNotify notifyType, ulong param1, ulong param2, ulong param3)
{
_tmpIdParam.Clear();
_tmpIdParam.Add(param1);
_tmpIdParam.Add(param2);
_tmpIdParam.Add(param3);
SetNotifyType(notifyType, _tmpIdParam);
}
public void SetNotifyType(RedNoteNotify notifyType, params ulong[] param)
{
_tmpIdParam.Clear();
for (int i = 0; i < param.Length; i++)
{
_tmpIdParam.Add(param[i]);
}
SetNotifyType(notifyType, _tmpIdParam);
}
#endregion
public void SetNotifyType(RedNoteNotify notifyType, List<ulong> paramList)
{
RemoveNotifyBind();
if (notifyType == RedNoteNotify.None) return;
IdParamList.Clear();
IdParamList.AddRange(paramList);
SetRedNoteNotifyProcess(notifyType);
}
private void SetRedNoteNotifyProcess(RedNoteNotify notifyType)
{
// 移除红点通知的绑定
if (Image != null)
{
Image.rectTransform.SetAsLastSibling();
}
RedNoteNotifyType = notifyType;
RedNoteMgr.Instance.RegisterNotify(RedNoteNotifyType, this);
if (!RedNoteMgr.Instance.IsNumType(notifyType, IdParamList))
{
CurState = RedNoteMgr.Instance.GetNotifyValue(RedNoteNotifyType, IdParamList);
}
else
{
SetRedNotePointNum(RedNoteMgr.Instance.GetNotifyPointNum(RedNoteNotifyType, IdParamList));
}
}
/// <summary>
/// 移除红点通知的绑定。
/// </summary>
public void RemoveNotifyBind()
{
if (RedNoteNotifyType != RedNoteNotify.None)
{
RedNoteMgr.Instance.UnRegisterNotify(RedNoteNotifyType, this);
}
CurState = false;
}
protected override void OnDestroy()
{
RemoveNotifyBind();
}
public void SetRedNotePointNum(int pointNum)
{
if (Text != null)
{
Text.text = pointNum > 0 ? pointNum.ToString() : string.Empty;
CurState = pointNum > 0;
}
}
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: dba30ea267ff4b988310dec14c0df1c3
timeCreated: 1687263893

View File

@@ -1,85 +0,0 @@
using System.Collections.Generic;
namespace GameLogic
{
/// <summary> 红点关联 </summary>
public class RedNoteCheckMgr
{
public string m_ownerStr;
public List<string> m_childList { get; private set; }
public RedNoteCheckMgr(RedNoteNotify ower, List<RedNoteNotify> childList)
{
m_ownerStr = ower.ToString();
m_childList = new List<string>();
for (int i = 0; i < childList.Count; i++)
{
var value = childList[i];
m_childList.Add(value.ToString());
}
}
public RedNoteCheckMgr(string paramKey)
{
m_ownerStr = paramKey;
}
public bool AddChild(string childKey)
{
if (m_childList == null)
{
m_childList = new List<string>();
}
if (!m_childList.Contains(childKey))
{
m_childList.Add(childKey);
return true;
}
return false;
}
public void CheckChildRedNote()
{
var valueItem = RedNoteMgr.Instance.GetNotifyValueItem(m_ownerStr);
bool childHaveRed = false;
int childNotePointNum = 0;
int count = m_childList.Count;
for (var index = 0; index < count; index++)
{
var child = m_childList[index];
var childItem = RedNoteMgr.Instance.GetNotifyValueItem(child);
if (childItem.GetRedNoteType() == RedNoteType.Simple)
{
if (RedNoteMgr.Instance.GetNotifyValue(child))
{
childHaveRed = true;
childNotePointNum++;
}
}
else
{
childNotePointNum += childItem.GetRedNotePointNum();
}
}
if (valueItem.GetRedNoteType() == RedNoteType.Simple)
{
RedNoteMgr.Instance.SetNotifyKeyValue(m_ownerStr, childHaveRed);
}
else
{
RedNoteMgr.Instance.SetNotifyKeyPointNum(m_ownerStr, childNotePointNum);
}
}
public bool CheckChild(string childKey)
{
bool red = RedNoteMgr.Instance.GetNotifyValue(childKey);
return red;
}
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 3dd181174bbf408e9932a6f9484e41a5
timeCreated: 1687263893

View File

@@ -1,669 +0,0 @@
using System;
using System.Collections.Generic;
using System.Text;
using GameBase;
using GameLogic;
using TEngine;
using UnityEngine;
namespace GameLogic
{
#region
/// 1增加RedNoteNotify定义加入新的红点枚举。
/// 2添加红点关联关联定义在InitRelation查看当前有的关联关系确定是增加还是重新创建
/// 3把RedNoteBehaviour挂在红点图片上红点图片一般放置在需要显示红点的按钮/页签上,设置脚本上的枚举类型
/// 4如果是带参数的红点类型在红点所在的UI声明红点对象对参数进行设置参数统一为uint一般用一个可以唯一区分的ID。
/// 有多个参数时,每后一个参数节点都是前一个参数的子节点。 无参数为该层级的根节点。
/// 5红点激活/隐藏
/// 在对应模块数据管理类中检测达到红点激活条件或红点消失条件调用SetNotifyValue激活/隐藏红点
#endregion
public enum RedNoteNotify
{
None = 0,
CharacterMain,
ShopMain,
BagMain,
BagUseType,
ExploreMain,
HomeUI,
}
/// <summary>
/// 红点指引
/// </summary>
public class RedNoteMgr : Singleton<RedNoteMgr>
{
//红点状态记录
private Dictionary<string, RedNoteValueItem> _notifyMap;
//红点关联
private readonly Dictionary<string, RedNoteCheckMgr> _checkDic = new Dictionary<string, RedNoteCheckMgr>();
/// <summary>
/// child to parent list
/// </summary>
private readonly Dictionary<string, List<string>> _checkOwnDic = new Dictionary<string, List<string>>();
private readonly Dictionary<string, RedNoteKeyStruct> _keyConvertDic = new Dictionary<string, RedNoteKeyStruct>();
private readonly Dictionary<string, RedNoteStructDic> _keyDic = new Dictionary<string, RedNoteStructDic>();
/// <summary>
/// 红点映射
/// key => 红点名称
/// val => 对应的红点类型
/// </summary>
private Dictionary<string, RedNoteNotify> _dicRedNoteMap;
private Dictionary<int, string> _notifyStringMap;
public void Init()
{
InitState();
InitRedNoteConfig();
InitRelation();
InitRedNoteTween();
}
/// <summary>
/// 全局缓动缩放
/// </summary>
public Vector3 GlobalTwScale { get; protected set; }
/// <summary>
/// 初始化红点缓动
/// </summary>
private void InitRedNoteTween()
{
// LeanTween.value(LeanTween.tweenEmpty, OnRedNoteTween, 1f, 0.75f, 0.5f).setLoopPingPong();
}
/// <summary>
/// 缓动
/// </summary>
/// <param name="value"></param>
private void OnRedNoteTween(float value)
{
GlobalTwScale = value * Vector3.one;
}
//注册红点通知
public void RegisterNotify(RedNoteNotify notify, RedNoteBehaviour redNote)
{
RedNoteValueItem redNoteValueItem = GetOrNewNotifyValueItem(notify, redNote.IdParamList);
redNoteValueItem.AddRedNote(redNote);
}
//销毁红点通知
public void UnRegisterNotify(RedNoteNotify notify, RedNoteBehaviour redNote)
{
RedNoteValueItem redNoteValueItem = GetOrNewNotifyValueItem(notify, redNote.IdParamList);
if (redNoteValueItem == null)
{
return;
}
redNoteValueItem.RemoveRedNote(redNote);
}
private readonly List<ulong> _tmpRedNoteParams = new List<ulong>();
/// <summary>
/// 设置红点状态。
/// </summary>
/// <param name="notify"></param>
/// <param name="value"></param>
public void SetNotifyValue(RedNoteNotify notify, bool value)
{
_tmpRedNoteParams.Clear();
SetNotifyValue(notify, value, _tmpRedNoteParams);
}
#region bool
public void SetNotifyValue(RedNoteNotify notify, bool value, ulong param1)
{
_tmpRedNoteParams.Clear();
_tmpRedNoteParams.Add(param1);
SetNotifyValue(notify, value, _tmpRedNoteParams);
}
public void SetNotifyValue(RedNoteNotify notify, bool value, ulong param1, ulong param2)
{
_tmpRedNoteParams.Clear();
_tmpRedNoteParams.Add(param1);
_tmpRedNoteParams.Add(param2);
SetNotifyValue(notify, value, _tmpRedNoteParams);
}
public void SetNotifyValue(RedNoteNotify notify, bool value, params ulong[] param)
{
_tmpRedNoteParams.Clear();
for (var i = 0; i < param.Length; i++)
{
_tmpRedNoteParams.Add(param[i]);
}
SetNotifyValue(notify, value, _tmpRedNoteParams);
}
#endregion
public void SetNotifyValue(RedNoteNotify notify, bool value, List<ulong> redNoteParamList)
{
var key = BuildKey(notify, redNoteParamList);
if (!value && !_notifyMap.TryGetValue(key, out var redNoteValueItem))
{
return;
}
GetOrNewNotifyValueItem(notify, redNoteParamList);
MarkNotifyKeyValueDirty(key, value);
}
public void MarkNotifyKeyValueDirty(string key, bool value)
{
if (!_notifyMap.TryGetValue(key, out var redNoteValueItem))
{
return;
}
redNoteValueItem.SetStateDirty(value);
}
/// <summary>
/// 设置红点状态。
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
public void SetNotifyKeyValue(string key, bool value)
{
if (!_notifyMap.TryGetValue(key, out var redNoteValueItem))
{
return;
}
//设置红点状态
if (redNoteValueItem.SetRedNoteState(value))
{
//设置红点关联状态
CalcRedNoteRelation(key);
}
}
//设置红点状态数量
public void SetNotifyKeyPointNum(string key, int pointNum)
{
if (!_notifyMap.TryGetValue(key, out var redNoteValueItem))
{
return;
}
if (redNoteValueItem.SetRedNotePoint(pointNum))
{
//设置红点关联状态
CalcRedNoteRelation(key);
}
}
public bool GetNotifyValue(RedNoteNotify notify, ulong param1)
{
_tmpRedNoteParams.Clear();
_tmpRedNoteParams.Add(param1);
return GetNotifyValue(notify, _tmpRedNoteParams);
}
public bool GetNotifyValue(RedNoteNotify notify, ulong param1, ulong param2)
{
_tmpRedNoteParams.Clear();
_tmpRedNoteParams.Add(param1);
_tmpRedNoteParams.Add(param2);
return GetNotifyValue(notify, _tmpRedNoteParams);
}
/// <summary>
/// 获取红点状态。
/// </summary>
/// <param name="notify"></param>
/// <param name="param"></param>
/// <returns></returns>
public bool GetNotifyValue(RedNoteNotify notify, List<ulong> param = null)
{
if (notify == (uint)RedNoteNotify.None)
return false;
RedNoteValueItem item = GetOrNewNotifyValueItem(notify, param);
return item.GetRedNoteState();
}
/// <summary>
/// 获取红点数量。
/// </summary>
/// <param name="notify"></param>
/// <param name="param"></param>
/// <returns></returns>
public int GetNotifyPointNum(RedNoteNotify notify, List<ulong> param)
{
if (notify == (uint)RedNoteNotify.None)
return 0;
RedNoteValueItem item = GetOrNewNotifyValueItem(notify, param);
return item.GetRedNotePointNum();
}
public bool GetNotifyValue(string paramKey)
{
if (_notifyMap.TryGetValue(paramKey, out var redNoteValueItem))
{
return redNoteValueItem.GetRedNoteState();
}
return false;
}
/// <summary>
/// 清理红点状态.
/// </summary>
/// <param name="notify"></param>
public void ClearNotifyValue(RedNoteNotify notify)
{
var notifyStr = NotifyTypeToString(notify);
RecursiveClearNotifyKeyValue(notifyStr);
RedNoteValueItem redNoteValueItem = GetNotifyValueItem(notifyStr);
redNoteValueItem.ClearRedNoteState(false);
CalcRedNoteRelation(notifyStr);
}
public void RecursiveClearNotifyKeyValue(string key)
{
if (!_checkDic.TryGetValue(key, out var checkMgr))
{
return;
}
var childList = checkMgr.m_childList;
foreach (var childKey in childList)
{
RedNoteValueItem redNoteValueItem = GetNotifyValueItem(childKey);
redNoteValueItem.ClearRedNoteState(false);
RecursiveClearNotifyKeyValue(childKey);
}
}
/// <summary>
/// 清理数据。
/// </summary>
public void OnRoleLogout()
{
var enumerator = _notifyMap.GetEnumerator();
while (enumerator.MoveNext())
{
enumerator.Current.Value.ClearRedNoteState(true);
}
enumerator.Dispose();
}
public string NotifyTypeToString(RedNoteNotify notify)
{
_notifyStringMap.TryGetValue((int)notify, out var str);
return str;
}
public string BuildKey(RedNoteNotify notifyType, List<ulong> paramList)
{
var notifyStr = NotifyTypeToString(notifyType);
if (notifyStr == null)
{
Log.Error("RedNoteNotifyId :{0} Not Exit! Please Check", notifyType.ToString());
return string.Empty;
}
if (!_keyDic.TryGetValue(notifyStr, out var dicData))
{
dicData = new RedNoteStructDic();
_keyDic[notifyStr] = dicData;
}
var key = dicData.TryGetKey(notifyStr, paramList);
return key;
}
public static string GetKeyString(string notify, List<ulong> paramList)
{
if (paramList == null || paramList.Count == 0)
{
return notify;
}
string key;
if (paramList.Count <= 1)
{
key = $"{notify}-{paramList[0]}";
}
else if (paramList.Count <= 2)
{
key = $"{notify}-{paramList[0]}-{paramList[1]}";
}
else if (paramList.Count <= 3)
{
key = $"{notify}-{paramList[0]}-{paramList[1]}-{paramList[2]}";
}
else
{
StringBuilder s = new StringBuilder();
s.Append(notify + "-");
for (var i = 0; i < paramList.Count; i++)
{
s.Append(paramList[i]);
if (i != paramList.Count - 1)
s.Append("-");
}
key = s.ToString();
}
return key;
}
public void SetKeyConvertDic(string key, RedNoteKeyStruct keyStruct)
{
_keyConvertDic[key] = keyStruct;
}
private readonly List<ulong> _tmpParamList = new List<ulong>();
/// <summary>
/// 计算红点关联.
/// </summary>
/// <param name="notifyKey"></param>
private void CalcRedNoteRelation(string notifyKey)
{
var key = notifyKey;
if (_checkOwnDic.TryGetValue(key, out var ownerList))
{
foreach (var owner in ownerList)
{
if (_checkDic.TryGetValue(owner, out var checker))
{
checker.CheckChildRedNote();
}
}
}
}
/// <summary>
/// 初始化红点状态.
/// </summary>
private void InitState()
{
var array = (RedNoteNotify[])Enum.GetValues(typeof(RedNoteNotify));
var redNoteCnt = array.Length;
_notifyMap = new Dictionary<string, RedNoteValueItem>();
_dicRedNoteMap = new Dictionary<string, RedNoteNotify>(redNoteCnt);
_notifyStringMap = new Dictionary<int, string>(redNoteCnt);
foreach (var redNoteNotify in array)
{
var redNoteStr = redNoteNotify.ToString();
_dicRedNoteMap.Add(redNoteStr, redNoteNotify);
_notifyStringMap.Add((int)redNoteNotify, redNoteStr);
var key = BuildKey(redNoteNotify, _tmpParamList);
var redNoteValueItem = new RedNoteValueItem();
bool isNumType = IsNumType(redNoteNotify, null);
redNoteValueItem.Init(key, isNumType ? RedNoteType.WithNum : RedNoteType.Simple);
_notifyMap.Add(key, redNoteValueItem);
}
}
public RedNoteValueItem GetNotifyValueItem(string key)
{
_notifyMap.TryGetValue(key, out var redNoteValueItem);
return redNoteValueItem;
}
private RedNoteValueItem GetOrNewNotifyValueItem(RedNoteNotify notify, List<ulong> paramList)
{
var key = BuildKey(notify, paramList);
var redNoteValueItem = GetNotifyValueItem(key);
if (redNoteValueItem == null)
{
List<ulong> tmpParamList = new List<ulong>(paramList);
//从后往前创建item如(A, 1, 2)会创建A-1-2A-1A。
string lastChildKey = string.Empty;
int paramIndex = paramList.Count;
while (paramIndex >= 0)
{
var keyStr = BuildKey(notify, tmpParamList);
if (!_notifyMap.ContainsKey(keyStr))
{
RedNoteValueItem noteValueItem = new RedNoteValueItem();
bool isNumType = IsNumType(notify, paramList);
noteValueItem.Init(keyStr, isNumType ? RedNoteType.WithNum : RedNoteType.Simple);
_notifyMap.Add(keyStr, noteValueItem);
}
//叶子节点跳过(因为他没有子节点)
if (tmpParamList.Count < paramList.Count)
{
bool addedChild;
if (!_checkDic.TryGetValue(keyStr, out var checkMgr))
{
checkMgr = new RedNoteCheckMgr(keyStr);
addedChild = checkMgr.AddChild(lastChildKey);
}
else
{
addedChild = checkMgr.AddChild(lastChildKey);
}
if (addedChild)
{
AddDic(checkMgr); //重新生成父子关系
}
}
lastChildKey = keyStr;
paramIndex--;
if (paramIndex < tmpParamList.Count && tmpParamList.Count > 0)
{
tmpParamList.RemoveAt(paramIndex);
}
}
redNoteValueItem = _notifyMap[key];
}
return redNoteValueItem;
}
public void AddDic(RedNoteNotify owner, List<RedNoteNotify> childList)
{
AddDic(new RedNoteCheckMgr(owner, childList));
}
private void AddDic(RedNoteCheckMgr checker)
{
var owner = checker.m_ownerStr;
_checkDic[owner] = checker;
var childList = checker.m_childList;
int count = childList.Count;
for (int i = 0; i < count; i++)
{
var child = childList[i];
if (!_checkOwnDic.TryGetValue(child, out var ownerList))
{
ownerList = new List<string>();
_checkOwnDic[child] = ownerList;
}
if (!ownerList.Contains(owner))
{
ownerList.Add(owner);
}
}
}
public bool IsNumType(RedNoteNotify noteNotify, List<ulong> paramList)
{
if (paramList is { Count: > 0 })
{
return true;
}
return false;
}
// 通过名字获取红点类型
public static RedNoteNotify GetRedNoteByName(string redNoteName)
{
Instance._dicRedNoteMap.TryGetValue(redNoteName, out var redNote);
return redNote;
}
public void OnUpdate()
{
foreach (var redNoteValueItem in _notifyMap)
{
redNoteValueItem.Value.CheckDirty();
}
}
#region
/// <summary>
/// 初始化红点配置表
/// </summary>
private void InitRedNoteConfig()
{
// ResDictionaryList<uint, RedNoteConfig> cfgs = new ResDictionaryList<uint, RedNoteConfig>();
// cfgs.Init(val => val.RedNoteParentID);
// List<RedNoteNotify> list = new List<RedNoteNotify>();
// foreach (var kv in cfgs.Data)
// {
// list.Clear();
// foreach (var cfg in kv.Value)
// {
// list.Add((RedNoteNotify)cfg.RedNoteID);
// }
//
// AddDic((RedNoteNotify)kv.Key, list);
// }
}
//初始化红点关联
private void InitRelation()
{
}
#endregion
}
}
public class RedNoteStructDic
{
private readonly List<RedNoteKeyStruct> _keyStructList = new List<RedNoteKeyStruct>();
public string TryGetKey(string notify, List<ulong> paramList)
{
string key = string.Empty;
List<RedNoteKeyStruct> list = _keyStructList;
{
int count = list.Count;
for (int i = 0; i < count; i++)
{
var keyStruct = list[i];
if (keyStruct.IsSame(notify, paramList))
{
key = keyStruct.Key;
break;
}
}
}
if (string.IsNullOrEmpty(key))
{
var keyStruct = new RedNoteKeyStruct(notify, paramList);
key = keyStruct.Key;
RedNoteMgr.Instance.SetKeyConvertDic(key, keyStruct);
list.Add(keyStruct);
}
return key;
}
}
public class RedNoteKeyStruct
{
public string Notify;
public List<ulong> ParamList;
public RedNoteKeyStruct(string notify, List<ulong> paramList)
{
Notify = notify;
if (paramList != null)
{
ParamList = new List<ulong>(paramList);
}
else
{
ParamList = new List<ulong>();
}
}
private string _key;
public string Key
{
get
{
if (string.IsNullOrEmpty(_key))
{
_key = RedNoteMgr.GetKeyString(Notify, ParamList);
}
return _key;
}
}
public bool IsSame(string notify, List<ulong> paramList)
{
if (notify != Notify)
{
return false;
}
var list1 = paramList;
var list2 = ParamList;
int cnt1 = list1?.Count ?? 0;
int cnt2 = list2?.Count ?? 0;
if (cnt1 != cnt2)
{
return false;
}
if (cnt1 == 0)
{
return true;
}
for (int i = 0; i < cnt1; i++)
{
// ReSharper disable PossibleNullReferenceException
if (list1[i] != list2[i])
{
return false;
}
}
return true;
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 66ededab0a1e409588f150be58193032
timeCreated: 1687263893

View File

@@ -1,159 +0,0 @@
using System.Collections.Generic;
namespace GameLogic
{
public class RedNoteValueItem
{
public string m_key;
//所有关联的红点UI
private HashSet<RedNoteBehaviour> m_redNoteDic = new HashSet<RedNoteBehaviour>();
private bool m_state;
private int m_pointNum;
private RedNoteType m_noteType;
private bool m_dirty;
private bool m_tmpState;
public void Init(string keyStr, RedNoteType noteType)
{
m_key = keyStr;
m_noteType = noteType;
}
//添加红点对象
public void AddRedNote(RedNoteBehaviour redNote)
{
m_redNoteDic.Add(redNote);
}
//移除对象
public void RemoveRedNote(RedNoteBehaviour redNote)
{
m_redNoteDic.Remove(redNote);
}
//获取具体对象的状态
public bool GetRedNoteState()
{
if (m_dirty)
{
return m_tmpState;
}
return m_state;
}
//获取具体对象的红点数
public int GetRedNotePointNum()
{
return m_pointNum;
}
public RedNoteType GetRedNoteType()
{
return m_noteType;
}
public void SetStateDirty(bool state)
{
m_dirty = m_state != state;
m_tmpState = state;
}
//设置对象状态
public bool SetRedNoteState(bool state)
{
bool chg = state != m_state;
m_state = state;
if (chg)
{
SetBehaviourState(state);
}
return chg;
}
public bool SetRedNotePoint(int num)
{
if (m_pointNum != num)
{
m_pointNum = num;
SetBehaviourPoint(num);
return true;
}
return false;
}
private void SetBehaviourState(bool state)
{
//检查是否注册过具体对象
foreach (var redNote in m_redNoteDic)
{
if (redNote == null || redNote.gameObject == null)
continue;
redNote.SetRedNoteState(state);
}
// 移除空的红点
ClearTheNullRedNote();
}
private void SetBehaviourPoint(int pointNum)
{
foreach (var redNote in m_redNoteDic)
{
if (redNote == null || redNote.gameObject == null)
continue;
redNote.SetRedNotePointNum(pointNum);
}
// 移除空的红点
ClearTheNullRedNote();
}
// 移除空的红点
private void ClearTheNullRedNote()
{
m_redNoteDic.RemoveWhere(redNote => redNote == null || redNote.gameObject == null);
}
//清理状态
public void ClearRedNoteState(bool clearBehavior)
{
foreach (var redNote in m_redNoteDic)
{
if (redNote != null)
{
redNote.SetRedNoteState(false);
}
}
if (clearBehavior)
{
m_redNoteDic.Clear();
}
m_state = false;
m_dirty = false;
m_tmpState = false;
}
public void CheckDirty()
{
if (m_dirty)
{
m_dirty = false;
RedNoteMgr.Instance.SetNotifyKeyValue(m_key, m_tmpState);
}
}
}
public enum RedNoteType
{
Simple,
WithNum,
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 3c29f4a552c34bd8ab9d2c64b5b2b49d
timeCreated: 1687263893

View File

@@ -1,57 +0,0 @@
using TEngine;
using UnityEngine;
using UnityEngine.UI;
namespace GameLogic
{
public class RedNoteWidget : UIWidget
{
#region
protected override void ScriptGenerator()
{
}
#endregion
private Image m_image;
public RedNoteBehaviour m_redNote;
protected override void OnCreate()
{
m_redNote = CreateWidget<RedNoteBehaviour>(gameObject);
m_image = gameObject.GetComponent<Image>();
rectTransform.anchoredPosition = Vector2.zero;
SetNotifyState(false);
}
public void SetNotifyType(RedNoteNotify notifyType)
{
m_redNote.SetNotifyType(notifyType);
}
public void SetNotifyType(RedNoteNotify notifyType, ulong param1)
{
m_redNote.SetNotifyType(notifyType, param1);
}
public void SetNotifyType(RedNoteNotify notifyType, ulong param1, ulong param2)
{
m_redNote.SetNotifyType(notifyType, param1, param2);
}
public void SetNotifyState(bool state)
{
m_redNote.SetRedNoteState(state);
}
public void SetSprite(string sprite)
{
// m_image.SetSprite(sprite);
}
protected override void OnUpdate()
{
/*if (!m_redNote.CurState)
{
return;
}
gameObject.transform.localScale = RedNoteMgr.Instance.GlobalTwScale;*/
}
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 2644c5700a07442a995008ee9fa8159d
timeCreated: 1695289825

View File

@@ -1,49 +0,0 @@
using UnityEngine;
namespace TEngine
{
/// <summary>
/// 封装一个角色可能用到的各种shader场景。
/// </summary>
class ActorShaderGroup
{
private readonly TShader[] _allShader = new TShader[(int)ActorShaderEnvType.EnvTypeMax];
/// <summary>
/// 增加Shader到角色Shader分组。
/// </summary>
/// <param name="shaderType">当前环境类型。</param>
/// <param name="shader">TShader。</param>
public void AddShader(ActorShaderEnvType shaderType, TShader shader)
{
_allShader[(int)shaderType] = shader;
}
/// <summary>
/// 根据当前环境获取Shader。
/// </summary>
/// <param name="type">当前环境类型。</param>
/// <returns>TShader。</returns>
public TShader GetShader(ActorShaderEnvType type)
{
return _allShader[(int)type];
}
/// <summary>
/// 判断是否符合shader集合。
/// </summary>
/// <param name="shader">Shader实例。</param>
/// <returns>是否符合。</returns>
public bool IsMatch(Shader shader)
{
foreach (var dodShader in _allShader)
{
if (dodShader != null && dodShader.Shader == shader)
{
return true;
}
}
return false;
}
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 79b6e5be73e14c929b6a3b4a980976ac
timeCreated: 1701916950

View File

@@ -1,117 +0,0 @@
using GameBase;
using UnityEngine;
namespace TEngine
{
enum ActorShaderGroupType
{
/// <summary>
/// 通用的角色shader
/// </summary>
Brdf = 0,
/// <summary>
/// 眼睛
/// </summary>
BrdfEye,
///可能后面扩展,比如特效的特殊角色材质
GroupMax,
}
enum ActorShaderEnvType
{
/// <summary>
/// 游戏内场景默认模型不带阴影不带xray不透明效果
/// </summary>
EnvNormal = 0,
/// <summary>
/// 展示场景
/// </summary>
EnvShow,
/// <summary>
/// 带阴影
/// </summary>
EnvShadow,
/// <summary>
/// 带xray默认也带Shadow
/// </summary>
EnvXRay,
/// <summary>
/// 透明渐隐效果
/// </summary>
EnvAlphaFade,
/// <summary>
/// 展示场景没shadow
/// </summary>
EnvShow_NoShadow,
EnvTypeMax
}
/// <summary>
/// 角色Shader管理器。
/// </summary>
class ActorShaderMgr : Singleton<ActorShaderMgr>
{
private readonly ActorShaderGroup[] _allShaderGroup = new ActorShaderGroup[(int)ActorShaderGroupType.GroupMax];
public ActorShaderMgr()
{
CreateBrdfShader();
}
/// <summary>
/// 根据当前Render查找角色的Shader分组。
/// </summary>
/// <param name="render">Render。</param>
/// <returns>角色的Shader分组。</returns>
public ActorShaderGroup FindShaderGroup(Renderer render)
{
var sharedMat = render.sharedMaterial;
if (sharedMat == null)
{
return null;
}
var shader = sharedMat.shader;
foreach (var group in _allShaderGroup)
{
if (group != null && group.IsMatch(shader))
{
return group;
}
}
return null;
}
private void CreateBrdfShader()
{
//通用的效果
var actorShader = new ActorShaderGroup();
actorShader.AddShader(ActorShaderEnvType.EnvNormal, new TShader("TEngine/Actor/ActorBrdf",shaderLocation:"ActorBrdf"));
actorShader.AddShader(ActorShaderEnvType.EnvShow, new TShader("TEngine/Actor/Show/ActorBrdf",shaderLocation:"ActorBrdf_Show"));
actorShader.AddShader(ActorShaderEnvType.EnvShow_NoShadow, new TShader("TEngine/Actor/Show/ActorBrdf_NoShadow",shaderLocation:"ActorBrdf_NoShadow"));
actorShader.AddShader(ActorShaderEnvType.EnvShadow, new TShader("TEngine/Actor/ActorBrdf",shaderLocation:"ActorBrdf_Normal"));
actorShader.AddShader(ActorShaderEnvType.EnvXRay, new TShader("TEngine/Actor/X-Ray",shaderLocation:"X-Ray"));
actorShader.AddShader(ActorShaderEnvType.EnvAlphaFade, new TShader("TEngine/Actor/Fade/ActorBrdf",shaderLocation:"ActorBrdf_Fade"));
_allShaderGroup[(int)ActorShaderGroupType.Brdf] = actorShader;
//眼睛效果
actorShader = new ActorShaderGroup();
actorShader.AddShader(ActorShaderEnvType.EnvNormal, new TShader("TEngine/Actor/ActorEye",shaderLocation:"ActorEye"));
actorShader.AddShader(ActorShaderEnvType.EnvShow, new TShader("TEngine/Actor/Show/ActorEye",shaderLocation:"ActorEye_Show", "MRT_DISABLE", "MRT_ENABLE"));
actorShader.AddShader(ActorShaderEnvType.EnvShadow, new TShader("TEngine/Actor/ActorEye",shaderLocation:"ActorEye"));
actorShader.AddShader(ActorShaderEnvType.EnvXRay, new TShader("TEngine/Actor/ActorEye",shaderLocation:"ActorEye"));
actorShader.AddShader(ActorShaderEnvType.EnvAlphaFade, new TShader("TEngine/Actor/Fade/ActorEye",shaderLocation:"ActorEye_Fade"));
_allShaderGroup[(int)ActorShaderGroupType.BrdfEye] = actorShader;
}
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 5a38b9b4bee84fabb1ef8db5292a6db6
timeCreated: 1701916853

View File

@@ -1,154 +0,0 @@
using System.Collections.Generic;
using UnityEngine;
namespace TEngine
{
/// <summary>
/// TShader scripts used for all rendering.
/// <remarks>统一封装对shader的管理。</remarks>
/// </summary>
public class TShader
{
private bool _loaded;
private Shader _shader;
private readonly string _shaderName;
private readonly string _shaderLocation;
private readonly List<string> _keywordOn = new List<string>();
private readonly List<string> _keywordOff = new List<string>();
/// <summary>
/// Shader scripts used for all rendering.
/// </summary>
public Shader Shader
{
get
{
if (!_loaded)
{
_loaded = true;
_shader = FindShader(_shaderLocation,_shaderName);
if (_shader == null)
{
Log.Error($"invalid shader path: {_shaderLocation}, shader name {_shaderName}");
}
}
return _shader;
}
}
/// <summary>
/// 查找Shader。
/// </summary>
/// <param name="shaderLocation">Shader定位地址。</param>
/// <param name="shaderName">Shader名称。</param>
/// <returns>Shader实例。</returns>
public static Shader FindShader(string shaderLocation,string shaderName)
{
Shader shader = GameModule.Resource.LoadAsset<Shader>(shaderLocation);
if (shader != null)
{
return shader;
}
return Shader.Find(shaderName);
}
/// <summary>
/// TShader构造函数。
/// </summary>
/// <param name="shaderName">shader名称。</param>
/// <param name="shaderLocation">shader路径。</param>
public TShader(string shaderName, string shaderLocation)
{
_shaderName = shaderName;
_shaderLocation = shaderLocation;
_shader = null;
}
/// <summary>
/// TShader构造函数。
/// </summary>
/// <param name="shaderName">shader名称。</param>
/// <param name="shaderLocation">shader路径。</param>
/// <param name="keywordOn">开启选项。</param>
/// <param name="keywordOff">关闭选项。</param>
public TShader(string shaderName, string shaderLocation, string keywordOn, string keywordOff)
{
_shaderName = shaderName;
_shaderLocation = shaderLocation;
_shader = null;
_keywordOn.Add(keywordOn);
_keywordOff.Add(keywordOff);
}
/// <summary>
/// TShader构造函数。
/// </summary>
/// <param name="shaderName">shader名称。</param>
/// <param name="shaderLocation">shader路径。</param>
/// <param name="keywordOn">开启选项。</param>
/// <param name="keywordOff">关闭选项。</param>
public TShader(string shaderName, string shaderLocation, string[] keywordOn, string[] keywordOff)
{
_shaderName = shaderName;
_shaderLocation = shaderLocation;
_shader = null;
_keywordOn.AddRange(keywordOn);
_keywordOff.AddRange(keywordOff);
}
/// <summary>
/// 设置Shader效果。
/// </summary>
/// <param name="render">渲染对象。</param>
public void ApplyRender(Renderer render)
{
var sharedMat = render.sharedMaterial;
if (sharedMat != null)
{
//copy一份材质
sharedMat = render.material;
sharedMat.shader = Shader;
foreach (var keyword in _keywordOff)
{
sharedMat.DisableKeyword(keyword);
}
foreach (var keyword in _keywordOn)
{
sharedMat.EnableKeyword(keyword);
}
}
}
/// <summary>
/// 清除shader。
/// </summary>
/// <param name="render">渲染对象。</param>
public void ClearRender(Renderer render)
{
if (_keywordOff.Count <= 0 && _keywordOn.Count <= 0)
{
return;
}
var sharedMat = render.sharedMaterial;
if (sharedMat != null)
{
//copy一份材质。
sharedMat = render.material;
for (int k = 0; k < _keywordOn.Count; k++)
{
sharedMat.DisableKeyword(_keywordOn[k]);
}
for (int k = 0; k < _keywordOff.Count; k++)
{
sharedMat.EnableKeyword(_keywordOff[k]);
}
}
}
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: e219233984c14f7d97bc744c07fe13d0
timeCreated: 1698115491

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 8a214e54975b4d7da2d804f869524801
timeCreated: 1695289293

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 0615e8b32d534bc48a60e42c973053ad
timeCreated: 1695289443

View File

@@ -1,84 +0,0 @@
using UnityEngine;
using UnityEngine.EventSystems;
namespace GameLogic
{
public class ClickEventListener : MonoBehaviour, IPointerClickHandler, IPointerDownHandler, IPointerUpHandler
{
public static ClickEventListener Get(GameObject obj)
{
ClickEventListener listener = obj.GetComponent<ClickEventListener>();
if (listener == null)
{
listener = obj.AddComponent<ClickEventListener>();
}
return listener;
}
private System.Action<GameObject> _clickedHandler = null;
private System.Action<GameObject> _doubleClickedHandler = null;
private System.Action<GameObject> _onPointerDownHandler = null;
private System.Action<GameObject> _onPointerUpHandler = null;
bool _isPressed = false;
public bool IsPressed => _isPressed;
public void OnPointerClick(PointerEventData eventData)
{
if (eventData.clickCount == 2)
{
if (_doubleClickedHandler != null)
{
_doubleClickedHandler(gameObject);
}
}
else
{
if (_clickedHandler != null)
{
_clickedHandler(gameObject);
}
}
}
public void SetClickEventHandler(System.Action<GameObject> handler)
{
_clickedHandler = handler;
}
public void SetDoubleClickEventHandler(System.Action<GameObject> handler)
{
_doubleClickedHandler = handler;
}
public void SetPointerDownHandler(System.Action<GameObject> handler)
{
_onPointerDownHandler = handler;
}
public void SetPointerUpHandler(System.Action<GameObject> handler)
{
_onPointerUpHandler = handler;
}
public void OnPointerDown(PointerEventData eventData)
{
_isPressed = true;
if (_onPointerDownHandler != null)
{
_onPointerDownHandler(gameObject);
}
}
public void OnPointerUp(PointerEventData eventData)
{
_isPressed = false;
if (_onPointerUpHandler != null)
{
_onPointerUpHandler(gameObject);
}
}
}
}

View File

@@ -1,86 +0,0 @@
using System;
using System.Collections.Generic;
namespace GameLogic
{
public enum SnapStatus
{
NoTargetSet = 0,
TargetHasSet = 1,
SnapMoving = 2,
SnapMoveFinish = 3
}
public enum ItemCornerEnum
{
LeftBottom = 0,
LeftTop,
RightTop,
RightBottom,
}
public enum ListItemArrangeType
{
TopToBottom = 0,
BottomToTop,
LeftToRight,
RightToLeft,
}
public enum GridItemArrangeType
{
TopLeftToBottomRight = 0,
BottomLeftToTopRight,
TopRightToBottomLeft,
BottomRightToTopLeft,
}
public enum GridFixedType
{
ColumnCountFixed = 0,
RowCountFixed,
}
public struct RowColumnPair
{
public RowColumnPair(int row1, int column1)
{
mRow = row1;
mColumn = column1;
}
public bool Equals(RowColumnPair other)
{
return this.mRow == other.mRow && this.mColumn == other.mColumn;
}
public static bool operator ==(RowColumnPair a, RowColumnPair b)
{
return (a.mRow == b.mRow)&&(a.mColumn == b.mColumn);
}
public static bool operator !=(RowColumnPair a, RowColumnPair b)
{
return (a.mRow != b.mRow) || (a.mColumn != b.mColumn); ;
}
public override int GetHashCode()
{
return 0;
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj))
{
return false;
}
return (obj is RowColumnPair) && Equals((RowColumnPair)obj);
}
public int mRow;
public int mColumn;
}
}

View File

@@ -1,12 +0,0 @@
fileFormatVersion: 2
guid: 19e4e487f35877f4b9bb864eb43484d6
timeCreated: 1534508353
licenseType: Store
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,326 +0,0 @@
using System;
using System.Collections.Generic;
namespace GameLogic
{
public class ItemSizeGroup
{
public float[] ItemSizeArray = null;
public float[] ItemStartPosArray = null;
public int ItemCount = 0;
private int _dirtyBeginIndex = ItemPosMgr.ItemMaxCountPerGroup;
public float GroupSize = 0;
public float GroupStartPos = 0;
public float GroupEndPos = 0;
public int GroupIndex = 0;
public float ItemDefaultSize = 0;
public ItemSizeGroup(int index, float itemDefaultSize)
{
GroupIndex = index;
ItemDefaultSize = itemDefaultSize;
Init();
}
public void Init()
{
ItemSizeArray = new float[ItemPosMgr.ItemMaxCountPerGroup];
if (ItemDefaultSize != 0)
{
for (int i = 0; i < ItemSizeArray.Length; ++i)
{
ItemSizeArray[i] = ItemDefaultSize;
}
}
ItemStartPosArray = new float[ItemPosMgr.ItemMaxCountPerGroup];
ItemStartPosArray[0] = 0;
ItemCount = ItemPosMgr.ItemMaxCountPerGroup;
GroupSize = ItemDefaultSize * ItemSizeArray.Length;
if (ItemDefaultSize != 0)
{
_dirtyBeginIndex = 0;
}
else
{
_dirtyBeginIndex = ItemPosMgr.ItemMaxCountPerGroup;
}
}
public float GetItemStartPos(int index)
{
return GroupStartPos + ItemStartPosArray[index];
}
public bool IsDirty
{
get { return (_dirtyBeginIndex < ItemCount); }
}
public float SetItemSize(int index, float size)
{
float old = ItemSizeArray[index];
if (Math.Abs(old - size) < 0.001f)
{
return 0;
}
ItemSizeArray[index] = size;
if (index < _dirtyBeginIndex)
{
_dirtyBeginIndex = index;
}
float ds = size - old;
GroupSize = GroupSize + ds;
return ds;
}
public void SetItemCount(int count)
{
if (ItemCount == count)
{
return;
}
ItemCount = count;
RecalcGroupSize();
}
public void RecalcGroupSize()
{
GroupSize = 0;
for (int i = 0; i < ItemCount; ++i)
{
GroupSize += ItemSizeArray[i];
}
}
public int GetItemIndexByPos(float pos)
{
if (ItemCount == 0)
{
return -1;
}
int low = 0;
int high = ItemCount - 1;
while (low <= high)
{
int mid = (low + high) / 2;
float startPos = ItemStartPosArray[mid];
float endPos = startPos + ItemSizeArray[mid];
if (startPos <= pos && endPos >= pos)
{
return mid;
}
else if (pos > endPos)
{
low = mid + 1;
}
else
{
high = mid - 1;
}
}
return -1;
}
public void UpdateAllItemStartPos()
{
if (_dirtyBeginIndex >= ItemCount)
{
return;
}
int startIndex = (_dirtyBeginIndex < 1) ? 1 : _dirtyBeginIndex;
for (int i = startIndex; i < ItemCount; ++i)
{
ItemStartPosArray[i] = ItemStartPosArray[i - 1] + ItemSizeArray[i - 1];
}
_dirtyBeginIndex = ItemCount;
}
}
public class ItemPosMgr
{
public const int ItemMaxCountPerGroup = 100;
readonly List<ItemSizeGroup> _itemSizeGroupList = new List<ItemSizeGroup>();
public int _dirtyBeginIndex = int.MaxValue;
public float TotalSize = 0;
public float ItemDefaultSize = 20;
public ItemPosMgr(float itemDefaultSize)
{
ItemDefaultSize = itemDefaultSize;
}
public void SetItemMaxCount(int maxCount)
{
_dirtyBeginIndex = 0;
TotalSize = 0;
int st = maxCount % ItemMaxCountPerGroup;
int lastGroupItemCount = st;
int needMaxGroupCount = maxCount / ItemMaxCountPerGroup;
if (st > 0)
{
needMaxGroupCount++;
}
else
{
lastGroupItemCount = ItemMaxCountPerGroup;
}
int count = _itemSizeGroupList.Count;
if (count > needMaxGroupCount)
{
int d = count - needMaxGroupCount;
_itemSizeGroupList.RemoveRange(needMaxGroupCount, d);
}
else if (count < needMaxGroupCount)
{
int d = needMaxGroupCount - count;
for (int i = 0; i < d; ++i)
{
ItemSizeGroup tGroup = new ItemSizeGroup(count + i, ItemDefaultSize);
_itemSizeGroupList.Add(tGroup);
}
}
count = _itemSizeGroupList.Count;
if (count == 0)
{
return;
}
for (int i = 0; i < count - 1; ++i)
{
_itemSizeGroupList[i].SetItemCount(ItemMaxCountPerGroup);
}
_itemSizeGroupList[count - 1].SetItemCount(lastGroupItemCount);
for (int i = 0; i < count; ++i)
{
TotalSize = TotalSize + _itemSizeGroupList[i].GroupSize;
}
}
public void SetItemSize(int itemIndex, float size)
{
int groupIndex = itemIndex / ItemMaxCountPerGroup;
int indexInGroup = itemIndex % ItemMaxCountPerGroup;
ItemSizeGroup tGroup = _itemSizeGroupList[groupIndex];
float changedSize = tGroup.SetItemSize(indexInGroup, size);
if (changedSize != 0f)
{
if (groupIndex < _dirtyBeginIndex)
{
_dirtyBeginIndex = groupIndex;
}
}
TotalSize += changedSize;
}
public float GetItemPos(int itemIndex)
{
Update(true);
int groupIndex = itemIndex / ItemMaxCountPerGroup;
int indexInGroup = itemIndex % ItemMaxCountPerGroup;
return _itemSizeGroupList[groupIndex].GetItemStartPos(indexInGroup);
}
public void GetItemIndexAndPosAtGivenPos(float pos, ref int index, ref float itemPos)
{
Update(true);
index = 0;
itemPos = 0f;
int count = _itemSizeGroupList.Count;
if (count == 0)
{
return;
}
ItemSizeGroup hitGroup = null;
int low = 0;
int high = count - 1;
while (low <= high)
{
int mid = (low + high) / 2;
ItemSizeGroup tGroup = _itemSizeGroupList[mid];
if (tGroup.GroupStartPos <= pos && tGroup.GroupEndPos >= pos)
{
hitGroup = tGroup;
break;
}
else if (pos > tGroup.GroupEndPos)
{
low = mid + 1;
}
else
{
high = mid - 1;
}
}
int hitIndex = -1;
if (hitGroup != null)
{
hitIndex = hitGroup.GetItemIndexByPos(pos - hitGroup.GroupStartPos);
}
else
{
return;
}
if (hitIndex < 0)
{
return;
}
index = hitIndex + hitGroup.GroupIndex * ItemMaxCountPerGroup;
itemPos = hitGroup.GetItemStartPos(hitIndex);
}
public void Update(bool updateAll)
{
int count = _itemSizeGroupList.Count;
if (count == 0)
{
return;
}
if (_dirtyBeginIndex >= count)
{
return;
}
int loopCount = 0;
for (int i = _dirtyBeginIndex; i < count; ++i)
{
loopCount++;
ItemSizeGroup tGroup = _itemSizeGroupList[i];
_dirtyBeginIndex++;
tGroup.UpdateAllItemStartPos();
if (i == 0)
{
tGroup.GroupStartPos = 0;
tGroup.GroupEndPos = tGroup.GroupSize;
}
else
{
tGroup.GroupStartPos = _itemSizeGroupList[i - 1].GroupEndPos;
tGroup.GroupEndPos = tGroup.GroupStartPos + tGroup.GroupSize;
}
if (!updateAll && loopCount > 1)
{
return;
}
}
}
}
}

View File

@@ -1,173 +0,0 @@
namespace GameLogic
{
//if GridFixedType is GridFixedType.ColumnCountFixed, then the GridItemGroup is one row of the gridview
//if GridFixedType is GridFixedType.RowCountFixed, then the GridItemGroup is one column of the gridview
public class GridItemGroup
{
private int _count = 0;
private int _groupIndex = -1;//the row index or the column index of this group
private LoopGridViewItem _first = null;
private LoopGridViewItem _last = null;
public int Count => _count;
public LoopGridViewItem First => _first;
public LoopGridViewItem Last => _last;
public int GroupIndex
{
get => _groupIndex;
set => _groupIndex = value;
}
public LoopGridViewItem GetItemByColumn(int column)
{
LoopGridViewItem cur = _first;
while(cur != null)
{
if(cur.Column == column)
{
return cur;
}
cur = cur.NextItem;
}
return null;
}
public LoopGridViewItem GetItemByRow(int row)
{
LoopGridViewItem cur = _first;
while (cur != null)
{
if (cur.Row == row)
{
return cur;
}
cur = cur.NextItem;
}
return null;
}
public void ReplaceItem(LoopGridViewItem curItem,LoopGridViewItem newItem)
{
newItem.PrevItem = curItem.PrevItem;
newItem.NextItem = curItem.NextItem;
if(newItem.PrevItem != null)
{
newItem.PrevItem.NextItem = newItem;
}
if(newItem.NextItem != null)
{
newItem.NextItem.PrevItem = newItem;
}
if(_first == curItem)
{
_first = newItem;
}
if(_last == curItem)
{
_last = newItem;
}
}
public void AddFirst(LoopGridViewItem newItem)
{
newItem.PrevItem = null;
newItem.NextItem = null;
if (_first == null)
{
_first = newItem;
_last = newItem;
_first.PrevItem = null;
_first.NextItem = null;
_count++;
}
else
{
_first.PrevItem = newItem;
newItem.PrevItem = null;
newItem.NextItem = _first;
_first = newItem;
_count++;
}
}
public void AddLast(LoopGridViewItem newItem)
{
newItem.PrevItem = null;
newItem.NextItem = null;
if (_first == null)
{
_first = newItem;
_last = newItem;
_first.PrevItem = null;
_first.NextItem = null;
_count++;
}
else
{
_last.NextItem = newItem;
newItem.PrevItem = _last;
newItem.NextItem = null;
_last = newItem;
_count++;
}
}
public LoopGridViewItem RemoveFirst()
{
LoopGridViewItem ret = _first;
if (_first == null)
{
return ret;
}
if(_first == _last)
{
_first = null;
_last = null;
--_count;
return ret;
}
_first = _first.NextItem;
_first.PrevItem = null;
--_count;
return ret;
}
public LoopGridViewItem RemoveLast()
{
LoopGridViewItem ret = _last;
if (_first == null)
{
return ret;
}
if (_first == _last)
{
_first = null;
_last = null;
--_count;
return ret;
}
_last = _last.PrevItem;
_last.NextItem = null;
--_count;
return ret;
}
public void Clear()
{
LoopGridViewItem current = _first;
while (current != null)
{
current.PrevItem = null;
current.NextItem = null;
current = current.NextItem;
}
_first = null;
_last = null;
_count = 0;
}
}
}

View File

@@ -1,12 +0,0 @@
fileFormatVersion: 2
guid: f7e7eb25fe1319d4b8773ddfab7a240e
timeCreated: 1554538573
licenseType: Store
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,113 +0,0 @@
using System;
using System.Collections.Generic;
using UnityEngine;
namespace GameLogic
{
public class GridItemPool
{
private GameObject _prefabObj;
private string _prefabName;
private int _initCreateCount = 1;
private readonly List<LoopGridViewItem> _tmpPooledItemList = new List<LoopGridViewItem>();
private readonly List<LoopGridViewItem> _pooledItemList = new List<LoopGridViewItem>();
private static int _curItemIdCount = 0;
private RectTransform _itemParent = null;
public GridItemPool()
{
}
public void Init(GameObject prefabObj, int createCount, RectTransform parent)
{
_prefabObj = prefabObj;
_prefabName = _prefabObj.name;
_initCreateCount = createCount;
_itemParent = parent;
_prefabObj.SetActive(false);
for (int i = 0; i < _initCreateCount; ++i)
{
LoopGridViewItem tViewItem = CreateItem();
RecycleItemReal(tViewItem);
}
}
public LoopGridViewItem GetItem()
{
_curItemIdCount++;
LoopGridViewItem tItem = null;
if (_tmpPooledItemList.Count > 0)
{
int count = _tmpPooledItemList.Count;
tItem = _tmpPooledItemList[count - 1];
_tmpPooledItemList.RemoveAt(count - 1);
tItem.gameObject.SetActive(true);
}
else
{
int count = _pooledItemList.Count;
if (count == 0)
{
tItem = CreateItem();
}
else
{
tItem = _pooledItemList[count - 1];
_pooledItemList.RemoveAt(count - 1);
tItem.gameObject.SetActive(true);
}
}
tItem.ItemId = _curItemIdCount;
return tItem;
}
public void DestroyAllItem()
{
ClearTmpRecycledItem();
int count = _pooledItemList.Count;
for (int i = 0; i < count; ++i)
{
GameObject.DestroyImmediate(_pooledItemList[i].gameObject);
}
_pooledItemList.Clear();
}
public LoopGridViewItem CreateItem()
{
GameObject go = GameObject.Instantiate<GameObject>(_prefabObj, Vector3.zero, Quaternion.identity, _itemParent);
go.SetActive(true);
RectTransform rf = go.GetComponent<RectTransform>();
rf.localScale = Vector3.one;
rf.anchoredPosition3D = Vector3.zero;
rf.localEulerAngles = Vector3.zero;
LoopGridViewItem tViewItem = go.GetComponent<LoopGridViewItem>();
tViewItem.ItemPrefabName = _prefabName;
tViewItem.GoId = go.GetHashCode();
return tViewItem;
}
void RecycleItemReal(LoopGridViewItem item)
{
item.gameObject.SetActive(false);
_pooledItemList.Add(item);
}
public void RecycleItem(LoopGridViewItem item)
{
item.PrevItem = null;
item.NextItem = null;
_tmpPooledItemList.Add(item);
}
public void ClearTmpRecycledItem()
{
int count = _tmpPooledItemList.Count;
if (count == 0)
{
return;
}
for (int i = 0; i < count; ++i)
{
RecycleItemReal(_tmpPooledItemList[i]);
}
_tmpPooledItemList.Clear();
}
}
}

View File

@@ -1,12 +0,0 @@
fileFormatVersion: 2
guid: c1eb92a17e8cee642a2245950dfaabea
timeCreated: 1554538573
licenseType: Store
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,12 +0,0 @@
fileFormatVersion: 2
guid: 17e9881a7bce8124a8f855b96a8ca11a
timeCreated: 1554538573
licenseType: Store
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,184 +0,0 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace GameLogic
{
public class LoopGridViewItem : MonoBehaviour
{
// indicates the items index in the list the mItemIndex can only be from 0 to itemTotalCount -1.
int mItemIndex = -1;
// the row index, the item is in. starting from 0.
int mRow = -1;
// the column index, the item is in. starting from 0.
int mColumn = -1;
//indicates the items id.
//This property is set when the item is created or fetched from pool,
//and will no longer change until the item is recycled back to pool.
int mItemId = -1;
private int _goId = 0;
public int GoId
{
set => _goId = value;
get => _goId;
}
LoopGridView mParentGridView = null;
bool mIsInitHandlerCalled = false;
string mItemPrefabName;
RectTransform mCachedRectTransform;
int mItemCreatedCheckFrameCount = 0;
object mUserObjectData = null;
int mUserIntData1 = 0;
int mUserIntData2 = 0;
string mUserStringData1 = null;
string mUserStringData2 = null;
LoopGridViewItem mPrevItem;
LoopGridViewItem mNextItem;
public object UserObjectData
{
get { return mUserObjectData; }
set { mUserObjectData = value; }
}
public int UserIntData1
{
get { return mUserIntData1; }
set { mUserIntData1 = value; }
}
public int UserIntData2
{
get { return mUserIntData2; }
set { mUserIntData2 = value; }
}
public string UserStringData1
{
get { return mUserStringData1; }
set { mUserStringData1 = value; }
}
public string UserStringData2
{
get { return mUserStringData2; }
set { mUserStringData2 = value; }
}
public int ItemCreatedCheckFrameCount
{
get { return mItemCreatedCheckFrameCount; }
set { mItemCreatedCheckFrameCount = value; }
}
public RectTransform CachedRectTransform
{
get
{
if (mCachedRectTransform == null)
{
mCachedRectTransform = gameObject.GetComponent<RectTransform>();
}
return mCachedRectTransform;
}
}
public string ItemPrefabName
{
get
{
return mItemPrefabName;
}
set
{
mItemPrefabName = value;
}
}
public int Row
{
get
{
return mRow;
}
set
{
mRow = value;
}
}
public int Column
{
get
{
return mColumn;
}
set
{
mColumn = value;
}
}
public int ItemIndex
{
get
{
return mItemIndex;
}
set
{
mItemIndex = value;
}
}
public int ItemId
{
get
{
return mItemId;
}
set
{
mItemId = value;
}
}
public bool IsInitHandlerCalled
{
get
{
return mIsInitHandlerCalled;
}
set
{
mIsInitHandlerCalled = value;
}
}
public LoopGridView ParentGridView
{
get
{
return mParentGridView;
}
set
{
mParentGridView = value;
}
}
public LoopGridViewItem PrevItem
{
get { return mPrevItem; }
set { mPrevItem = value; }
}
public LoopGridViewItem NextItem
{
get { return mNextItem; }
set { mNextItem = value; }
}
}
}

View File

@@ -1,12 +0,0 @@
fileFormatVersion: 2
guid: ec0432517adfcb84bb6163d7a44ab8c1
timeCreated: 1554538573
licenseType: Store
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: e9bbd48a4abc45c46a92b92d0df3ae07
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,216 +0,0 @@
using UnityEngine;
namespace GameLogic
{
public class LoopListViewItem : MonoBehaviour
{
public float Padding;
private int _itemIndex = -1;
private int _itemId = -1;
private LoopListView _parentListView = null;
private bool _isInitHandlerCalled = false;
private string _itemPrefabName;
private RectTransform _cachedRectTransform;
private float _padding;
private float _distanceWithViewPortSnapCenter = 0;
private int _itemCreatedCheckFrameCount = 0;
private float _startPosOffset = 0;
private object _userObjectData = null;
private int _userIntData1 = 0;
private int _userIntData2 = 0;
private string _userStringData1 = null;
private string _userStringData2 = null;
private int _goId = 0;
public int GoId
{
set => _goId = value;
get => _goId;
}
public object UserObjectData
{
get => _userObjectData;
set => _userObjectData = value;
}
public int UserIntData1
{
get => _userIntData1;
set => _userIntData1 = value;
}
public int UserIntData2
{
get => _userIntData2;
set => _userIntData2 = value;
}
public string UserStringData1
{
get => _userStringData1;
set => _userStringData1 = value;
}
public string UserStringData2
{
get => _userStringData2;
set => _userStringData2 = value;
}
public float DistanceWithViewPortSnapCenter
{
get => _distanceWithViewPortSnapCenter;
set => _distanceWithViewPortSnapCenter = value;
}
public float StartPosOffset
{
get => _startPosOffset;
set => _startPosOffset = value;
}
public int ItemCreatedCheckFrameCount
{
get => _itemCreatedCheckFrameCount;
set => _itemCreatedCheckFrameCount = value;
}
public RectTransform CachedRectTransform
{
get
{
if (_cachedRectTransform == null)
{
_cachedRectTransform = gameObject.GetComponent<RectTransform>();
}
return _cachedRectTransform;
}
}
public string ItemPrefabName
{
get => _itemPrefabName;
set => _itemPrefabName = value;
}
public int ItemIndex
{
get => _itemIndex;
set => _itemIndex = value;
}
public int ItemId
{
get => _itemId;
set => _itemId = value;
}
public bool IsInitHandlerCalled
{
get => _isInitHandlerCalled;
set => _isInitHandlerCalled = value;
}
public LoopListView ParentListView
{
get => _parentListView;
set => _parentListView = value;
}
public float TopY
{
get
{
ListItemArrangeType arrageType = ParentListView.ArrangeType;
if (arrageType == ListItemArrangeType.TopToBottom)
{
return CachedRectTransform.localPosition.y;
}
else if (arrageType == ListItemArrangeType.BottomToTop)
{
return CachedRectTransform.localPosition.y + CachedRectTransform.rect.height;
}
return 0;
}
}
public float BottomY
{
get
{
ListItemArrangeType arrageType = ParentListView.ArrangeType;
if (arrageType == ListItemArrangeType.TopToBottom)
{
return CachedRectTransform.localPosition.y - CachedRectTransform.rect.height;
}
else if (arrageType == ListItemArrangeType.BottomToTop)
{
return CachedRectTransform.localPosition.y;
}
return 0;
}
}
public float LeftX
{
get
{
ListItemArrangeType arrageType = ParentListView.ArrangeType;
if (arrageType == ListItemArrangeType.LeftToRight)
{
return CachedRectTransform.localPosition.x;
}
else if (arrageType == ListItemArrangeType.RightToLeft)
{
return CachedRectTransform.localPosition.x - CachedRectTransform.rect.width;
}
return 0;
}
}
public float RightX
{
get
{
ListItemArrangeType arrageType = ParentListView.ArrangeType;
if (arrageType == ListItemArrangeType.LeftToRight)
{
return CachedRectTransform.localPosition.x + CachedRectTransform.rect.width;
}
else if (arrageType == ListItemArrangeType.RightToLeft)
{
return CachedRectTransform.localPosition.x;
}
return 0;
}
}
public float ItemSize
{
get
{
if (ParentListView.IsVertList)
{
return CachedRectTransform.rect.height;
}
else
{
return CachedRectTransform.rect.width;
}
}
}
public float ItemSizeWithPadding => ItemSize + _padding;
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 4f3fbd5ce2514056b72986a6dea2aec2
timeCreated: 1695289443

View File

@@ -1,71 +0,0 @@
using TEngine;
namespace GameLogic
{
/// <summary>
/// 子界面之间共享的数据。
/// </summary>
public class ChildPageSharData
{
private object[] m_arrParams = new object[3]; // 共享参数列表
public object Param1 { get { return m_arrParams[0]; } }
public object Param2 { get { return m_arrParams[1]; } }
public object Param3 { get { return m_arrParams[2]; } }
/// <summary>
/// 设置指定索引的参数。
/// </summary>
/// <param name="paramIdx"></param>
/// <param name="param"></param>
public void SetParam(int paramIdx, object param)
{
if (paramIdx >= m_arrParams.Length)
return;
m_arrParams[paramIdx] = param;
}
}
public class ChildPageBase : UIWidget
{
protected ChildPageSharData m_shareObjData; // 共享数据
// 初始化数据
public void InitData(ChildPageSharData shareObjData)
{
m_shareObjData = shareObjData;
}
public virtual void OnPageShowed(int oldShowType, int newShowType)
{
}
// 无参数刷新当前子界面
// 收到那些数据变动的消息的时候使用
public virtual void RefreshPage()
{
}
public object ShareData1
{
get => m_shareObjData.Param1;
set => m_shareObjData.SetParam(0, value);
}
public object ShareData2
{
get => m_shareObjData.Param2;
set => m_shareObjData.SetParam(1, value);
}
public object ShareData3
{
get => m_shareObjData.Param3;
set => m_shareObjData.SetParam(2, value);
}
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: e4b742d9af72478b9d6f7ebd2fa493a0
timeCreated: 1687859782

View File

@@ -1,457 +0,0 @@
using System;
using System.Collections.Generic;
using TEngine;
using UnityEngine;
namespace GameLogic
{
public class SwitchPageMgr
{
private event Action<int, int> SwitchTabAction;
public delegate bool SwitchTabCondition(int selectId);
private SwitchTabCondition _switchTabCondition;
/// <summary>
/// 页签Grid。
/// </summary>
protected Transform m_tabGrid;
/// <summary>
/// 子UI父节点。
/// </summary>
public Transform ChildPageParent;
/// <summary>
/// 存储子UI。
/// </summary>
private readonly Dictionary<int, List<string>> _switchPageDic = new Dictionary<int, List<string>>();
/// <summary>
/// 子页签名字。
/// </summary>
private readonly List<string> _childPageNames = new List<string>();
/// <summary>
/// 子页签字典。
/// </summary>
private readonly Dictionary<string, ChildPageBase> _childPageDic = new Dictionary<string, ChildPageBase>();
/// <summary>
/// 存储页签。
/// </summary>
private readonly Dictionary<int, SwitchTabItem> _tabDic = new Dictionary<int, SwitchTabItem>();
private readonly Dictionary<int, string> _tabName = new Dictionary<int, string>();
protected readonly List<int> IDList = new List<int>();
private readonly UIBase _owner;
protected int CurrentChildID = -100;
/// <summary>
/// 需要设置显示隐藏。
/// </summary>
private readonly bool _needSetActive;
/// <summary>
/// 子界面的共享数据。
/// </summary>
private readonly ChildPageSharData _shareData = new ChildPageSharData();
public object ShareData1 => _shareData.Param1;
public object ShareData2 => _shareData.Param2;
public object ShareData3 => _shareData.Param3;
public SwitchPageMgr(Transform grid, Transform childPageParent, UIBase owner, bool needSetActive = true)
{
m_tabGrid = grid;
ChildPageParent = childPageParent;
_owner = owner;
_needSetActive = needSetActive;
}
public void AddSwitchAction(Action<int, int> action)
{
SwitchTabAction += action;
}
public void RemoveSwitchAction(Action<int, int> action)
{
SwitchTabAction -= action;
}
public void AddSwitchCondition(SwitchTabCondition action)
{
_switchTabCondition = action;
}
public void BindChildPage<T>(int childID) where T : ChildPageBase, new()
{
BindChildPage<T>(childID, string.Empty);
}
public void BindChildPage<T>(int childID, string tabName) where T : ChildPageBase, new()
{
var pageName = typeof(T).Name;
if (IDList.IndexOf(childID) < 0)
{
IDList.Add(childID);
}
if (!_childPageDic.ContainsKey(pageName))
{
_childPageDic[pageName] = new T();
_childPageNames.Add(pageName);
}
if (!_switchPageDic.ContainsKey(childID))
{
_switchPageDic[childID] = new List<string>();
}
if (_switchPageDic[childID].IndexOf(pageName) < 0)
{
_switchPageDic[childID].Add(pageName);
}
_tabName[childID] = tabName;
}
public T CreatTab<T>(int initChildID, GameObject tabTemp = null) where T : SwitchTabItem, new()
{
T tab = null;
for (var index = 0; index < IDList.Count; index++)
{
var childID = IDList[index];
if (!_tabDic.ContainsKey(childID))
{
if (tabTemp != null)
{
tab = _owner.CreateWidgetByPrefab<T>(tabTemp, m_tabGrid);
}
else
{
tab = _owner.CreateWidgetByType<T>(m_tabGrid);
}
tab.UpdateTabName(_tabName[childID]);
tab.BindClickEvent(TabOnClick, childID);
_tabDic[childID] = tab;
break;
}
}
SwitchPage(initChildID);
return tab;
}
public void CreatTabByItem<T>(int initChildID, GameObject go) where T : SwitchTabItem, new()
{
if (!_tabDic.ContainsKey(initChildID))
{
T tab = _owner.CreateWidgetByPrefab<T>(go, m_tabGrid);
tab.UpdateTabName(_tabName[initChildID]);
tab.BindClickEvent(TabOnClick, initChildID);
_tabDic[initChildID] = tab;
}
}
// 设置页签的自定义点击行为
public void SetCustomTabClickAction(int tabIdx, Action<SwitchTabItem> clickAction, object param1 = null,
object param2 = null, object param3 = null)
{
_tabDic[tabIdx].BindClickEvent(clickAction, param1, param2, param3);
}
public int TabCount => _tabDic.Count;
public void SetTabRedNode(int tabId, bool isShow)
{
if (_tabDic.TryGetValue(tabId, out var value))
{
value.SetRedNote(isShow);
}
}
public void SetTabFontSize(int fontSize)
{
for (int i = 0; i < IDList.Count; i++)
{
var tabId = IDList[i];
_tabDic[tabId].SetITabTextFontSize(fontSize);
}
}
private void TabOnClick(SwitchTabItem tab)
{
var childID = (int)tab.EventParam1;
SwitchPage(childID);
}
public virtual void SwitchPage(int selectID)
{
if (_switchTabCondition != null && !_switchTabCondition(selectID))
{
return;
}
if (CurrentChildID != selectID)
{
if (_switchPageDic.TryGetValue(selectID, out var pageLs))
{
for (int i = 0; i < pageLs.Count; i++)
{
var pageName = pageLs[i];
ChildPageBase page = GetChildPageByName(pageName);
if (page != null && page.gameObject == null)
{
page.CreateByPath(pageName, _owner, ChildPageParent);
page.InitData(_shareData);
}
}
for (int i = 0; i < _childPageNames.Count; i++)
{
string pageName = _childPageNames[i];
ChildPageBase page = GetChildPageByName(pageName);
bool beShow = pageLs.IndexOf(pageName) >= 0;
if (page != null && page.gameObject != null)
{
if (_needSetActive)
{
//page.Show(beShow);
if (beShow)
{
page.gameObject.SetActive(true);
// page.Visible = true;
}
else
{
page.gameObject.SetActive(false);
// page.Visible = false;
}
}
}
// if (page != null && beShow)
if (page != null)
{
page.OnPageShowed(CurrentChildID, selectID);
}
}
}
for (var index = 0; index < IDList.Count; index++)
{
var childID = IDList[index];
SwitchTabItem tab;
if (_tabDic.TryGetValue(childID, out tab))
{
tab.SetState(selectID == childID);
}
}
}
var oldID = CurrentChildID;
CurrentChildID = selectID;
if (SwitchTabAction != null)
{
SwitchTabAction(oldID, selectID);
}
}
public virtual void ShowPage(int selectID)
{
if (_switchPageDic.TryGetValue(selectID, out var pageLs))
{
for (int i = 0; i < pageLs.Count; i++)
{
var pageName = pageLs[i];
ChildPageBase page = GetChildPageByName(pageName);
if (page != null && page.gameObject == null)
{
page.CreateByPath(pageName, _owner, ChildPageParent);
page.InitData(_shareData);
}
}
for (int i = 0; i < _childPageNames.Count; i++)
{
string pageName = _childPageNames[i];
ChildPageBase page = GetChildPageByName(pageName);
bool beShow = pageLs.IndexOf(pageName) >= 0;
if (page != null && page.gameObject != null)
{
if (beShow)
{
page.gameObject.SetActive(true);
// page.Visible = true;
}
else
{
page.gameObject.SetActive(false);
// page.Visible = false;
}
}
}
}
for (var index = 0; index < IDList.Count; index++)
{
var childID = IDList[index];
SwitchTabItem tab;
if (_tabDic.TryGetValue(childID, out tab))
{
tab.SetState(selectID == childID);
}
}
}
public void RefreshCurrentChildPage()
{
if (_switchPageDic.TryGetValue(CurrentChildID, out var pageNames))
{
for (int i = 0; i < pageNames.Count; i++)
{
ChildPageBase page = GetChildPageByName(pageNames[i]);
if (page != null && page.gameObject != null)
{
page.RefreshPage();
}
}
}
}
public void RefreshChildPage(int childID)
{
if (_switchPageDic.TryGetValue(childID, out var pageNames))
{
for (int i = 0; i < pageNames.Count; i++)
{
ChildPageBase page = GetChildPageByName(pageNames[i]);
if (page != null && page.gameObject != null)
{
page.RefreshPage();
}
}
}
}
public bool TryGetChildPage<T>(out T t) where T : ChildPageBase
{
t = GetChildPage<T>();
return t != null;
}
public int GetCurShowType()
{
return CurrentChildID;
}
public void ReductionShowType()
{
CurrentChildID = -100;
}
#region ChildPagem_switchTabAction来处理切页事件()
public SwitchTabItem GetTabItem(int childId)
{
_tabDic.TryGetValue(childId, out var item);
return item;
}
public void CreateJumpTab<T>(int initChildID, string tabName, GameObject tabTemp = null)
where T : SwitchTabItem, new()
{
if (IDList.IndexOf(initChildID) < 0)
{
IDList.Add(initChildID);
}
_tabName[initChildID] = tabName;
for (var index = 0; index < IDList.Count; index++)
{
var childID = IDList[index];
if (!_tabDic.ContainsKey(childID))
{
T tab;
if (tabTemp != null)
{
tab = _owner.CreateWidgetByPrefab<T>(tabTemp, m_tabGrid);
}
else
{
tab = _owner.CreateWidgetByType<T>(m_tabGrid);
}
tab.UpdateTabName(_tabName[childID]);
tab.BindClickEvent(TabOnClick, childID);
_tabDic[childID] = tab;
}
}
SwitchPage(initChildID);
}
#endregion
/// <summary>
/// 设置共享参数。
/// </summary>
/// <param name="paramIdx"></param>
/// <param name="param"></param>
public void SetShareParam(int paramIdx, object param)
{
_shareData.SetParam(paramIdx, param);
}
public T GetChildPage<T>() where T : ChildPageBase
{
var pageName = typeof(T).Name;
_childPageDic.TryGetValue(pageName, out var page);
return page as T;
}
public ChildPageBase GetChildPageByName(string pageName)
{
_childPageDic.TryGetValue(pageName, out var page);
return page;
}
public void BindChildPage<T, U>(int childID, string tabName)
where T : ChildPageBase, new()
where U : ChildPageBase, new()
{
BindChildPage<T>(childID, tabName);
BindChildPage<U>(childID, tabName);
}
public void BindChildPage<T, U, V>(int childID, string tabName)
where T : ChildPageBase, new()
where U : ChildPageBase, new()
where V : ChildPageBase, new()
{
BindChildPage<T>(childID, tabName);
BindChildPage<U>(childID, tabName);
BindChildPage<V>(childID, tabName);
}
public void BindChildPage<T, U, V, W>(int childID, string tabName)
where T : ChildPageBase, new()
where U : ChildPageBase, new()
where V : ChildPageBase, new()
where W : ChildPageBase, new()
{
BindChildPage<T>(childID, tabName);
BindChildPage<U>(childID, tabName);
BindChildPage<V>(childID, tabName);
BindChildPage<W>(childID, tabName);
}
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: e04155ae1ce3448587a5e322477d0076
timeCreated: 1687859725

View File

@@ -1,263 +0,0 @@
using System;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
namespace GameLogic
{
public class SwitchTabItem : UIEventItem<SwitchTabItem>
{
//选中时的文本
protected TextMeshProUGUI m_selectText;
//未选中时的文本
protected TextMeshProUGUI m_noSelectText;
//选中时的图片
protected Image m_selectImage;
//未选中时的图片
protected Image m_noSelectImage;
//选中时的节点
protected Transform m_selectNode;
//未选中时的节点
protected Transform m_noSelectNode;
//选中时的Icon
protected Image m_selectIcon;
//未选中时的Icon
protected Image m_noSelectIcon;
protected GameObject m_goRedNote;
//是否选中
public bool IsSelect
{
get { return m_isSelect; }
set { SetState(value); }
}
protected bool m_isSelect = false;
//private RedNoteBehaviour m_redNote;
public RedNoteWidget m_redNote { get; private set; }
public virtual Vector2 SelectRedPointPos
{
get
{
return Vector2.zero;
}
}
public virtual Vector2 NoSelectRedPointPos
{
get
{
return Vector2.zero;
}
}
protected override void BindMemberProperty()
{
m_selectNode = FindChild("SelectNode");
m_noSelectNode = FindChild("NoSelectNode");
if (m_selectNode != null)
{
m_selectText = FindChildComponent<TextMeshProUGUI>(m_selectNode, "SelectText");
m_selectImage = FindChildComponent<Image>(m_selectNode, "SelectImage");
m_selectIcon = FindChildComponent<Image>(m_selectNode, "SelectIcon");
}
if (m_noSelectNode != null)
{
m_noSelectText = FindChildComponent<TextMeshProUGUI>(m_noSelectNode, "NoSelectText");
m_noSelectImage = FindChildComponent<Image>(m_noSelectNode, "NoSelectImage");
m_noSelectIcon = FindChildComponent<Image>(m_noSelectNode, "NoSelectIcon");
}
var tf = FindChild("m_goRedNote");
if (tf != null)
{
m_goRedNote = tf.gameObject;
m_redNote = CreateWidgetByType<RedNoteWidget>(tf);
m_redNote.rectTransform.anchoredPosition = Vector2.zero;
SetRedNote(false);
//CreateDefaultRedNote();
}
}
#region
public void SetRedNoteType(RedNoteNotify type)
{
if (m_redNote != null)
{
m_redNote.m_redNote.SetNotifyType(type);
}
SetRedNote(true);
}
public void SetRedNoteType(RedNoteNotify type, ulong param1)
{
if (m_redNote != null)
{
m_redNote.m_redNote.SetNotifyType(type, param1);
}
SetRedNote(true);
}
public void SetRedNoteType(RedNoteNotify type, ulong param1, ulong param2)
{
if (m_redNote != null)
{
m_redNote.m_redNote.SetNotifyType(type, param1, param2);
}
SetRedNote(true);
}
public void SetRedNoteType(RedNoteNotify type, ulong param1, ulong param2, ulong param3)
{
if (m_redNote != null)
{
m_redNote.m_redNote.SetNotifyType(type, param1, param2, param3);
}
SetRedNote(true);
}
public void SetRedNoteState(bool state)
{
if (m_redNote != null)
{
m_redNote.m_redNote.SetRedNoteState(state);
}
SetRedNote(state);
}
#endregion
public void UpdateTabName(string tabName)
{
if (m_selectText != null)
{
m_selectText.text = tabName;
m_selectText.rectTransform.sizeDelta = new Vector2(m_selectText.preferredWidth, m_selectText.rectTransform.sizeDelta.y);
}
if (m_noSelectText != null)
{
m_noSelectText.text = tabName;
m_noSelectText.rectTransform.sizeDelta = new Vector2(m_noSelectText.preferredWidth, m_noSelectText
.rectTransform.sizeDelta.y);
}
}
// public void UpdateTabImage(string selectImageName,string noSelectImageName)
// {
// if (m_selectImage != null)
// {
// UISpriteHelper.Instance.SetSprite(m_selectImage, selectImageName);
// }
// if (m_noSelectImage != null)
// {
// UISpriteHelper.Instance.SetSprite(m_noSelectImage, noSelectImageName);
// }
// }
//
// public void UpdateIcon(string selectIconName, string noSelectIconName)
// {
// if (m_selectIcon != null)
// {
// DUISpriteHelper.Instance.SetSprite(m_selectIcon, selectIconName, true);
// }
// if (m_noSelectIcon != null)
// {
// DUISpriteHelper.Instance.SetSprite(m_noSelectIcon, noSelectIconName, true);
// }
// }
//
// public virtual void CreateDefaultRedNote()
// {
// if (m_goRedNote != null)
// {
// UIEffectHelper.CreateUIEffectGoById((uint)CommonEffectID.EffectRedPoint, m_goRedNote.transform);
// }
// }
public void SetRedNote(bool show)
{
if (m_goRedNote != null)
{
m_goRedNote.SetActive(show);
}
}
public virtual void SetState(bool select)
{
m_isSelect = select;
if (m_selectNode != null)
{
m_selectNode.gameObject.SetActive(select);
}
if (m_noSelectNode != null)
{
m_noSelectNode.gameObject.SetActive(!select);
}
if (m_goRedNote != null)
{
if (select)
{
if (SelectRedPointPos != Vector2.zero)
{
((RectTransform)m_goRedNote.transform).anchoredPosition = SelectRedPointPos;
}
}
else
{
if (NoSelectRedPointPos != Vector2.zero)
{
((RectTransform)m_goRedNote.transform).anchoredPosition = NoSelectRedPointPos;
}
}
}
}
public void SetITabTextFontSize(int fontSize)
{
if (m_selectText != null)
{
m_selectText.fontSize = fontSize;
}
if (m_noSelectText != null)
{
m_noSelectText.fontSize = fontSize;
}
}
#region UI-ID
/// <summary>
/// UI-ID
/// </summary>
public uint uiID;
/// <summary>
/// UI标识
/// </summary>
protected string m_uiFlag;
/// <summary>
/// 检查方法
/// </summary>
protected Func<bool> m_funcCheck;
/// <summary>
/// 页签索引
/// </summary>
public int tabIndex = -1;
/// <summary>
/// UI标识
/// </summary>
/// <returns></returns>
public virtual string GetUiFlag()
{
return string.IsNullOrEmpty(m_uiFlag) ? uiID.ToString() : m_uiFlag;
}
#endregion
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 498417b8785d47249da952f77d069c33
timeCreated: 1687667780

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: b50cf85b0f0d4e43b12cb694f6c07979
timeCreated: 1695289335

View File

@@ -1,18 +0,0 @@
using UnityEngine.UI;
public class EmptyGraph : Graphic
{
public bool m_debug = false;
protected override void OnPopulateMesh(VertexHelper vbo)
{
vbo.Clear();
#if UNITY_EDITOR
if (m_debug)
{
base.OnPopulateMesh(vbo);
}
#endif
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 21df3dfa358b498e8da3d169d736df58
timeCreated: 1695289370

View File

@@ -1,138 +0,0 @@
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace GameLogic
{
[AddComponentMenu("UI/TScrollRect Rect", 37)]
[SelectionBase]
[ExecuteAlways]
[DisallowMultipleComponent]
[RequireComponent(typeof (RectTransform))]
public class TScrollRect : ScrollRect
{
private event Action ActionBeginDrag;
private event Action ActionOnDrag;
private event Action ActionEndDrag;
public List<ScrollRect> parentScrollRectList;
protected override void Awake()
{
base.Awake();
if (parentScrollRectList != null && parentScrollRectList.Count > 0)
{
for (int i = 0; i < parentScrollRectList.Count; i++)
{
AddParentScrollRect(parentScrollRectList[i]);
}
}
}
private List<ScrollRect> m_listParentScrollRect;
public void AddParentScrollRect(ScrollRect parentScrollRect)
{
if (parentScrollRect == null)
{
return;
}
if (m_listParentScrollRect == null)
{
m_listParentScrollRect = new List<ScrollRect>();
}
if (!m_listParentScrollRect.Contains(parentScrollRect))
{
m_listParentScrollRect.Add(parentScrollRect);
}
}
public void AddBeginDragListener(Action action)
{
ActionBeginDrag += action;
}
public void RemoveBeginDragListener(Action action)
{
ActionBeginDrag -= action;
}
public void AddOnDragListener(Action action)
{
ActionOnDrag += action;
}
public void RemoveOnDragListener(Action action)
{
ActionOnDrag -= action;
}
public void AddEndDragListener(Action action)
{
ActionEndDrag += action;
}
public void RemoveEndDragListener(Action action)
{
ActionEndDrag -= action;
}
public override void OnBeginDrag(PointerEventData eventData)
{
base.OnBeginDrag(eventData);
if (ActionBeginDrag != null)
{
ActionBeginDrag();
}
if (m_listParentScrollRect != null)
{
for (int i = 0; i < m_listParentScrollRect.Count; i++)
{
var parentScrollRect = m_listParentScrollRect[i];
parentScrollRect.OnBeginDrag(eventData);
}
}
}
public override void OnDrag(PointerEventData eventData)
{
base.OnDrag(eventData);
if (ActionOnDrag != null)
{
ActionOnDrag();
}
if (m_listParentScrollRect != null)
{
for (int i = 0; i < m_listParentScrollRect.Count; i++)
{
var parentScrollRect = m_listParentScrollRect[i];
parentScrollRect.OnDrag(eventData);
}
}
}
public override void OnEndDrag(PointerEventData eventData)
{
base.OnEndDrag(eventData);
if (ActionEndDrag != null)
{
ActionEndDrag();
}
if (m_listParentScrollRect != null)
{
for (int i = 0; i < m_listParentScrollRect.Count; i++)
{
var parentScrollRect = m_listParentScrollRect[i];
parentScrollRect.OnEndDrag(eventData);
}
}
}
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: d322e77e03014f65a9ec277d50bd12f8
timeCreated: 1695289370

View File

@@ -1,26 +0,0 @@
using System;
using UnityEngine;
using UnityEngine.EventSystems;
namespace GameLogic
{
public class UIButtonSound : MonoBehaviour, IPointerClickHandler
{
private static Action<int> _playSoundAction = null;
public int clickSound = 2;
public void OnPointerClick(PointerEventData eventData)
{
if (_playSoundAction != null)
{
_playSoundAction(clickSound);
}
}
public static void AddPlaySoundAction(Action<int> onClick)
{
_playSoundAction += onClick;
}
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: bb272eb1eec94625884e6e83889daa9a
timeCreated: 1695289370

View File

@@ -1,226 +0,0 @@
using System;
using TEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace GameLogic
{
public class UIEventItem<T> : UIWidget where T : UIEventItem<T>
{
private object m_eventParam1;
private object m_eventParam2;
private object m_eventParam3;
public object EventParam1 => m_eventParam1;
public object EventParam2 => m_eventParam2;
public object EventParam3 => m_eventParam3;
private Action<T> m_clickAction;
private Action<T, bool> m_pressAction;
private Action<T, PointerEventData> m_beginDragAction;
private Action<T, PointerEventData> m_dragAction;
private Action<T, PointerEventData> m_endDragAction;
public void BindClickEvent(Action<T> clickAction, object eParam1 = null, object eParam2 = null, object eParam3 = null,
Selectable.Transition transition = Selectable.Transition.ColorTint)
{
if (m_clickAction != null)
{
m_clickAction = clickAction;
}
else
{
m_clickAction = clickAction;
var button = gameObject.GetOrAddComponent<Button>();
button.transition = transition;
button.onClick.AddListener(() =>
{
if (m_clickAction != null)
{
m_clickAction(this as T);
}
});
}
SetEventParam(eParam1, eParam2, eParam3);
}
public void BindClickEventEx(Action<T> clickAction, object eParam1 = null, object eParam2 = null, object eParam3 = null)
{
if (m_clickAction != null)
{
m_clickAction = clickAction;
}
else
{
m_clickAction = clickAction;
var button = gameObject.GetOrAddComponent<Button>();
button.onClick.AddListener(() =>
{
if (m_clickAction != null)
{
m_clickAction(this as T);
}
});
}
SetEventParam(eParam1, eParam2, eParam3);
}
public void BindBeginDragEvent(Action<T, PointerEventData> dragAction, object eParam1 = null, object eParam2 = null, object eParam3 = null)
{
if (m_beginDragAction != null)
{
m_beginDragAction = dragAction;
}
else
{
m_beginDragAction = dragAction;
var trigger = gameObject.GetOrAddComponent<EventTrigger>();
EventTrigger.Entry entry = new EventTrigger.Entry();
entry.eventID = EventTriggerType.BeginDrag;
entry.callback = new EventTrigger.TriggerEvent();
entry.callback.AddListener((data) =>
{
var pointerEventData = (PointerEventData)data;
if (m_beginDragAction != null)
{
m_beginDragAction(this as T, pointerEventData);
}
});
trigger.triggers.Add(entry);
}
SetEventParam(eParam1, eParam2, eParam3);
}
public void BindDragEvent(Action<T, PointerEventData> dragAction, object eParam1 = null, object eParam2 = null, object eParam3 = null)
{
if (m_dragAction != null)
{
m_dragAction = dragAction;
}
else
{
m_dragAction = dragAction;
var trigger = gameObject.GetOrAddComponent<EventTrigger>();
EventTrigger.Entry entry = new EventTrigger.Entry();
entry.eventID = EventTriggerType.Drag;
entry.callback = new EventTrigger.TriggerEvent();
entry.callback.AddListener((data) =>
{
var pointerEventData = (PointerEventData)data;
if (m_dragAction != null)
{
m_dragAction(this as T, pointerEventData);
}
});
trigger.triggers.Add(entry);
}
SetEventParam(eParam1, eParam2, eParam3);
}
public void BindEndDragEvent(Action<T, PointerEventData> dragendAction, object eParam1 = null, object eParam2 = null, object eParam3 = null)
{
if (m_endDragAction != null)
{
m_endDragAction = dragendAction;
}
else
{
m_endDragAction = dragendAction;
var trigger = gameObject.GetOrAddComponent<EventTrigger>();
EventTrigger.Entry entry = new EventTrigger.Entry();
entry.eventID = EventTriggerType.EndDrag;
entry.callback = new EventTrigger.TriggerEvent();
entry.callback.AddListener((data) =>
{
if (m_endDragAction != null)
{
m_endDragAction(this as T, (PointerEventData)data);
}
});
trigger.triggers.Add(entry);
}
SetEventParam(eParam1, eParam2, eParam3);
}
public void BindPressEvent(Action<T, bool> pressAction, object eParam1 = null, object eParam2 = null, object eParam3 = null)
{
if (m_pressAction != null)
{
m_pressAction = pressAction;
}
else
{
m_pressAction = pressAction;
var trigger = gameObject.GetOrAddComponent<EventTrigger>();
EventTrigger.Entry entry = new EventTrigger.Entry();
entry.eventID = EventTriggerType.PointerDown;
entry.callback = new EventTrigger.TriggerEvent();
entry.callback.AddListener((data) =>
{
if (m_pressAction != null)
{
m_pressAction(this as T, true);
}
});
trigger.triggers.Add(entry);
entry = new EventTrigger.Entry();
entry.eventID = EventTriggerType.PointerUp;
entry.callback = new EventTrigger.TriggerEvent();
entry.callback.AddListener((data) =>
{
if (m_pressAction != null)
{
m_pressAction(this as T, false);
}
});
trigger.triggers.Add(entry);
}
SetEventParam(eParam1, eParam2, eParam3);
}
public void BindPressEventEx(Action<T, bool> pressAction, object eParam1 = null, object eParam2 = null, object eParam3 = null,
float durationThreshold = 1)
{
if (m_pressAction != null)
{
m_pressAction = pressAction;
}
else
{
m_pressAction = pressAction;
var button = gameObject.GetOrAddComponent<UIButtonSuper>();
button.m_LongPressDurationTime = durationThreshold;
button.onPress.AddListener(() =>
{
if (m_pressAction != null)
{
m_pressAction(this as T, true);
}
});
}
SetEventParam(eParam1, eParam2, eParam3);
}
public void SetEventParam(object eParam1, object eParam2 = null, object eParam3 = null)
{
m_eventParam1 = eParam1;
m_eventParam2 = eParam2;
m_eventParam3 = eParam3;
}
public void OnTriggerBtnEvent()
{
if (m_clickAction != null)
{
m_clickAction(this as T);
}
}
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: c9972ff1d1514807bbd21d6bc4c035f4
timeCreated: 1695289504

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 2d3f2e9ab868464da947f3d52aa9c3f6
timeCreated: 1695289443

View File

@@ -1,349 +0,0 @@
using System;
using System.Collections.Generic;
using TEngine;
using UnityEngine;
using UnityEngine.UI;
namespace GameLogic
{
/// <summary>
/// UI列表Item
/// </summary>
/// <typeparam name="TData"></typeparam>
public interface IListDataItem<in TData>
{
void SetItemData(TData d);
}
/// <summary>
/// UI列表Item
/// </summary>
public interface IListSelectItem
{
/// <summary>
/// 获取索引。
/// </summary>
/// <returns></returns>
int GetItemIndex();
/// <summary>
/// 设置索引。
/// </summary>
/// <param name="i"></param>
void SetItemIndex(int i);
/// <summary>
/// 是否被选中。
/// </summary>
/// <returns></returns>
bool IsSelected();
/// <summary>
/// 设置是否选中。
/// </summary>
/// <param name="v"></param>
void SetSelected(bool v);
}
public class SelectItemBase : UIEventItem<SelectItemBase>, IListSelectItem
{
/// <summary>
/// 索引。
/// </summary>
protected int m_itemIndex;
public int GetItemIndex()
{
return m_itemIndex;
}
public void SetItemIndex(int i)
{
m_itemIndex = i;
}
/// <summary>
/// 是否被选中。
/// </summary>
protected bool m_isSelected;
public virtual bool IsSelected()
{
return m_isSelected;
}
public virtual void SetSelected(bool v)
{
if (m_isSelected == v) return;
m_isSelected = v;
UpdateSelect();
}
/// <summary>
/// 刷新选中状态。
/// </summary>
public virtual void UpdateSelect()
{
}
protected override void RegisterEvent()
{
base.RegisterEvent();
AddSelectEvt();
}
/// <summary>
/// 监听选中事件。
/// </summary>
protected virtual void AddSelectEvt()
{
if (Parent == null || !(Parent is IUISelectList)) return;
var btn = gameObject.GetOrAddComponent<Button>();
if (btn != null)
{
btn.onClick.AddListener(OnSelectClick);
}
}
/// <summary>
/// 选中点击
/// </summary>
protected virtual void OnSelectClick()
{
var p = Parent as IUISelectList;
if (p != null)
{
p.OnItemClick(this, GetItemIndex());
}
}
}
interface IUISelectList
{
void OnItemClick(object item, int i);
}
/// <summary>
/// UI列表
/// </summary>
public class UIListBase<ItemT, DataT> : UIWidget, IUISelectList where ItemT : UIWidget, new()
{
/// <summary>
/// item模板
/// </summary>
public GameObject itemBase;
/// <summary>
/// 数据列表
/// </summary>
protected List<DataT> m_datas;
/// <summary>
/// 数据列表
/// </summary>
public List<DataT> datas => m_datas;
/// <summary>
/// 数据数量
/// </summary>
public int DataNum => m_datas?.Count ?? 0;
/// <summary>
/// 数量
/// </summary>
protected int m_num;
/// <summary>
/// 数量
/// </summary>
public int num => m_num;
/// <summary>
/// 设置数据数量
/// </summary>
/// <param name="n"></param>
/// <param name="funcItem"></param>
public void SetDataNum(int n, Action<ItemT, int> funcItem = null)
{
AdjustItemNum(n, null, funcItem);
}
/// <summary>
/// 数据起始索引
/// </summary>
public int dataStartOffset = 0;
/// <summary>
/// 设置数据
/// </summary>
/// <param name="dataList"></param>
/// <param name="n"></param>
public void SetDatas(List<DataT> dataList, int n = -1)
{
AdjustItemNum(Mathf.Max(0, n >= 0 ? n : (dataList == null ? 0 : (dataList.Count - dataStartOffset))), dataList);
}
/// <summary>
/// 设置显示数据
/// </summary>
/// <param name="n"></param>
/// <param name="datas"></param>
/// <param name="funcItem"></param>
protected virtual void AdjustItemNum(int n, List<DataT> datas = null, Action<ItemT, int> funcItem = null)
{
m_num = n;
m_datas = datas;
if (itemBase != null)
{
itemBase.SetActive(false);
}
}
/// <summary>
/// 刷新列表ITEM
/// </summary>
/// <param name="item"></param>
/// <param name="i"></param>
/// <param name="func"></param>
protected virtual void UpdateListItem(ItemT item, int i, Action<ItemT, int> func)
{
if (item == null) return;
if (func != null)
{
func.Invoke(item, i);
return;
}
if (item is IListDataItem<DataT> listDataItem)
{
listDataItem.SetItemData(GetData(i));
}
}
/// <summary>
/// 选中索引
/// </summary>
protected int m_selectIndex = -1;
/// <summary>
/// Item点击
/// </summary>
public Action<int> funcOnItemClick;
/// <summary>
/// 选中变化回调函数
/// </summary>
public Action funcOnSelectChange;
/// <summary>
/// 点击无选中变化回调
/// </summary>
public Action funcNoSelectChange;
/// <summary>
/// 选中索引
/// </summary>
public int selectIndex
{
get => m_selectIndex;
set => SetSelectIndex(value);
}
/// <summary>
/// 设置选中索引
/// </summary>
/// <param name="i"></param>
/// <param name="forceUpdate"></param>
/// <param name="triggerEvt"></param>
public void SetSelectIndex(int i, bool forceUpdate = false, bool triggerEvt = true)
{
if (!forceUpdate && m_selectIndex == i)
{
if (funcNoSelectChange != null)
{
funcNoSelectChange.Invoke();
}
return;
}
var preIndex = selectIndex;
m_selectIndex = i;
if (GetItem(preIndex) is IListSelectItem item)
{
item.SetSelected(false);
}
item = GetItem(selectIndex) as IListSelectItem;
if (item != null)
{
item.SetSelected(true);
}
UpdateSnapTargetItem();
if (triggerEvt && funcOnSelectChange != null)
{
funcOnSelectChange.Invoke();
}
}
/// <summary>
/// 刷新Snap
/// </summary>
protected virtual void UpdateSnapTargetItem()
{
}
/// <summary>
/// 获取当前选中的数据
/// </summary>
/// <returns></returns>
public DataT GetSelectData()
{
return GetData(selectIndex);
}
/// <summary>
/// 获取数据
/// </summary>
/// <param name="i"></param>
/// <returns></returns>
public DataT GetData(int i)
{
i += dataStartOffset;
return m_datas == null || i < 0 || i >= m_datas.Count ? default(DataT) : m_datas[i];
}
/// <summary>
/// 获取item
/// </summary>
/// <param name="i"></param>
/// <returns></returns>
public virtual ItemT GetItem(int i)
{
return null;
}
/// <summary>
/// 点击选择
/// </summary>
public bool SelectByClick = true;
/// <summary>
/// item被点击
/// </summary>
/// <param name="item"></param>
/// <param name="i"></param>
public void OnItemClick(object item, int i)
{
if (funcOnItemClick != null)
{
funcOnItemClick.Invoke(i);
}
if (SelectByClick)
{
selectIndex = i;
}
}
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 9d3742a744bb4934a4848b54bb6910a2
timeCreated: 1691679426

View File

@@ -1,57 +0,0 @@
using System;
using System.Collections.Generic;
using TEngine;
namespace GameLogic
{
/// <summary>
/// 普通UI列表。
/// </summary>
public class UIListWidget<TItem, TData> : UIListBase<TItem, TData> where TItem : UIWidget, new()
{
/// <summary>
/// item列表。
/// </summary>
protected List<TItem> m_items = new List<TItem>();
/// <summary>
/// item列表。
/// </summary>
public List<TItem> items => m_items;
/// <summary>
/// 设置显示数据。
/// </summary>
/// <param name="n"></param>
/// <param name="datas"></param>
/// <param name="funcItem"></param>
protected override void AdjustItemNum(int n, List<TData> datas = null, Action<TItem, int> funcItem = null)
{
base.AdjustItemNum(n, datas, funcItem);
AdjustIconNum(m_items, n, gameObject.transform, itemBase);
UpdateList(funcItem);
}
/// <summary>
/// 刷新列表。
/// </summary>
/// <param name="funcItem"></param>
protected void UpdateList(Action<TItem, int> funcItem = null)
{
for (var i = 0; i < m_items.Count; i++)
{
UpdateListItem(m_items[i], i, funcItem);
}
}
/// <summary>
/// 获取item
/// </summary>
/// <param name="i"></param>
/// <returns></returns>
public override TItem GetItem(int i)
{
return i >= 0 && i < m_items.Count ? m_items[i] : null;
}
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 96f732d895e94fbc99c904d66ca844ca
timeCreated: 1701844130

View File

@@ -1,14 +0,0 @@
namespace GameLogic
{
public class UILoopGridItemWidget: SelectItemBase
{
public LoopGridViewItem LoopItem { set; get; }
public int Index { private set; get; }
public virtual void UpdateItem(int index)
{
Index = index;
}
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 47ee457a0d7549b3a3b5d23f4ac048cd
timeCreated: 1692346002

View File

@@ -1,208 +0,0 @@
using System;
using System.Collections.Generic;
using TEngine;
using UnityEngine;
namespace GameLogic
{
/// <summary>
/// UI列表。
/// </summary>
public class UILoopGridWidget<TItem, TData> : UIListBase<TItem, TData> where TItem : UILoopGridItemWidget, new()
{
/// <summary>
/// LoopRectView
/// </summary>
public LoopGridView LoopRectView { private set; get; }
/// <summary>
/// Item字典
/// </summary>
private GameFrameworkDictionary<int, TItem> m_itemCache = new GameFrameworkDictionary<int, TItem>();
/// <summary>
/// 计算偏差后的ItemList
/// </summary>
private List<TItem> m_items = new List<TItem>();
/// <summary>
/// 计算偏差后的ItemList
/// </summary>
public List<TItem> items => m_items;
protected override void BindMemberProperty()
{
base.BindMemberProperty();
LoopRectView = rectTransform.GetComponent<LoopGridView>();
}
protected override void OnCreate()
{
base.OnCreate();
LoopRectView.InitGridView(0, OnGetItemByIndex);
}
protected override void OnDestroy()
{
base.OnDestroy();
m_itemCache.Clear();
}
/// <summary>
/// Item回调函数
/// </summary>
protected Action<TItem, int> m_tpFuncItem;
/// <summary>
/// 设置显示数据
/// </summary>
/// <param name="n"></param>
/// <param name="datas"></param>
/// <param name="funcItem"></param>
protected override void AdjustItemNum(int n, List<TData> datas = null, Action<TItem, int> funcItem = null)
{
base.AdjustItemNum(n, datas, funcItem);
m_tpFuncItem = funcItem;
LoopRectView.SetListItemCount(n);
LoopRectView.RefreshAllShownItem();
m_tpFuncItem = null;
UpdateAllItemSelect();
}
/// <summary>
/// 获取Item
/// </summary>
/// <param name="listView"></param>
/// <param name="itemIndex"></param>
/// <param name="row"></param>
/// <param name="column"></param>
/// <returns></returns>
protected LoopGridViewItem OnGetItemByIndex(LoopGridView listView, int itemIndex,int row,int column)
{
if (itemIndex < 0 || itemIndex >= num) return null;
var item = itemBase == null ? CreateItem() : CreateItem(itemBase);
if (item == null) return null;
item.SetItemIndex(itemIndex);
UpdateListItem(item, itemIndex, m_tpFuncItem);
return item.LoopItem;
}
/// <summary>
/// 创建Item
/// </summary>
/// <returns></returns>
public TItem CreateItem()
{
return CreateItem(typeof(TItem).Name);
}
/// <summary>
/// 创建Item
/// </summary>
/// <param name="itemName"></param>
/// <returns></returns>
public TItem CreateItem(string itemName)
{
TItem widget = null;
LoopGridViewItem item = LoopRectView.AllocOrNewListViewItem(itemName);
if (item != null)
{
widget = CreateItem(item);
}
return widget;
}
/// <summary>
/// 创建Item
/// </summary>
/// <param name="prefab"></param>
/// <returns></returns>
public TItem CreateItem(GameObject prefab)
{
TItem widget = null;
LoopGridViewItem item = LoopRectView.AllocOrNewListViewItem(prefab);
if (item != null)
{
widget = CreateItem(item);
}
return widget;
}
/// <summary>
/// 创建Item
/// </summary>
/// <param name="item"></param>
/// <returns></returns>
private TItem CreateItem(LoopGridViewItem item)
{
TItem widget;
if (!m_itemCache.TryGetValue(item.GoId, out widget))
{
widget = CreateWidget<TItem>(item.gameObject);
widget.LoopItem = item;
m_itemCache.Add(item.GoId, widget);
}
return widget;
}
/// <summary>
/// 获取item
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public override TItem GetItem(int index)
{
for (var i = 0; i < m_itemCache.Count; i++)
{
var item = m_itemCache.GetValueByIndex(i);
if (item.GetItemIndex() == index)
{
return item;
}
}
return null;
}
/// <summary>
/// 获取itemList
/// </summary>
/// <returns></returns>
public List<TItem> GetItemList()
{
m_items.Clear();
for (int i = 0; i < m_itemCache.Count; i++)
{
m_items.Add(m_itemCache.GetValueByIndex(i));
}
return m_items;
}
/// <summary>
/// 获取Item。
/// </summary>
/// <param name="index">索引。</param>
/// <returns>TItem。</returns>
public TItem GetItemByIndex(int index)
{
return m_itemCache.GetValueByIndex(index);
}
/// <summary>
/// 刷新所有item选中状态
/// </summary>
/// <returns></returns>
public void UpdateAllItemSelect()
{
var index = selectIndex;
for (var i = 0; i < m_itemCache.Count; i++)
{
if (m_itemCache.GetValueByIndex(i) is IListSelectItem item)
{
item.SetSelected(item.GetItemIndex() == index);
}
}
}
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 0930448d067145dfb0428b248f1086ae
timeCreated: 1692346037

View File

@@ -1,14 +0,0 @@
namespace GameLogic
{
public class UILoopItemWidget : SelectItemBase
{
public LoopListViewItem LoopItem { set; get; }
public int Index { private set; get; }
public virtual void UpdateItem(int index)
{
Index = index;
}
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: b39b2f052eec4a4a97256e5aeee9e7dc
timeCreated: 1691679577

View File

@@ -1,94 +0,0 @@
using System.Collections.Generic;
using TEngine;
using UnityEngine;
namespace GameLogic
{
public class UILoopListViewWidget<T> : UIWidget where T : UILoopItemWidget, new()
{
public LoopListView LoopRectView { private set; get; }
private GameFrameworkDictionary<int, T> m_itemCache = new GameFrameworkDictionary<int, T>();
protected override void BindMemberProperty()
{
base.BindMemberProperty();
LoopRectView = this.rectTransform.GetComponent<LoopListView>();
}
protected override void OnDestroy()
{
base.OnDestroy();
m_itemCache.Clear();
}
public T CreateItem()
{
string typeName = typeof(T).Name;
return CreateItem(typeName);
;
}
public T CreateItem(string itemName)
{
T widget = null;
var item = LoopRectView.AllocOrNewListViewItem(itemName);
if (item != null)
{
widget = CreateItem(item);
}
return widget;
}
public T CreateItem(GameObject prefab)
{
T widget = null;
var item = LoopRectView.AllocOrNewListViewItem(prefab);
if (item != null)
{
widget = CreateItem(item);
}
return widget;
}
private T CreateItem(LoopListViewItem item)
{
T widget;
if (!m_itemCache.TryGetValue(item.GoId, out widget))
{
widget = CreateWidget<T>(item.gameObject);
widget.LoopItem = item;
m_itemCache.Add(item.GoId, widget);
}
return widget;
}
public List<T> GetItemList()
{
List<T> list = new List<T>();
for (int i = 0; i < m_itemCache.Count; i++)
{
list.Add(m_itemCache.GetValueByIndex(i));
}
return list;
}
public int GetItemCount()
{
return m_itemCache.Count;
}
/// <summary>
/// 获取Item。
/// </summary>
/// <param name="index">索引。</param>
/// <returns>TItem。</returns>
public T GetItemByIndex(int index)
{
return m_itemCache.GetValueByIndex(index);
}
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 9b87126ba47740708bc82eb0bb9e414e
timeCreated: 1691679617

View File

@@ -1,225 +0,0 @@
using System;
using System.Collections.Generic;
using TEngine;
using UnityEngine;
namespace GameLogic
{
/// <summary>
/// UI列表。
/// </summary>
public class UILoopListWidget<TItem, TData> : UIListBase<TItem, TData> where TItem : UILoopItemWidget, new()
{
/// <summary>
/// LoopRectView
/// </summary>
public LoopListView LoopRectView { private set; get; }
/// <summary>
/// Item字典
/// <remarks>Key => GameObjectHashCode | Value => TItem.</remarks>
/// </summary>
private GameFrameworkDictionary<int, TItem> m_itemCache = new GameFrameworkDictionary<int, TItem>();
/// <summary>
/// 计算偏差后的ItemList
/// </summary>
private List<TItem> m_items = new List<TItem>();
/// <summary>
/// 计算偏差后的ItemList
/// </summary>
public List<TItem> items => m_items;
protected override void BindMemberProperty()
{
base.BindMemberProperty();
LoopRectView = rectTransform.GetComponent<LoopListView>();
}
protected override void OnCreate()
{
base.OnCreate();
LoopRectView.InitListView(0, OnGetItemByIndex);
}
protected override void OnDestroy()
{
base.OnDestroy();
m_itemCache.Clear();
}
/// <summary>
/// Item回调函数
/// </summary>
protected Action<TItem, int> m_tpFuncItem;
/// <summary>
/// 设置显示数据
/// </summary>
/// <param name="n"></param>
/// <param name="datas"></param>
/// <param name="funcItem"></param>
protected override void AdjustItemNum(int n, List<TData> datas = null, Action<TItem, int> funcItem = null)
{
base.AdjustItemNum(n, datas, funcItem);
m_tpFuncItem = funcItem;
LoopRectView.SetListItemCount(n);
LoopRectView.RefreshAllShownItem();
m_tpFuncItem = null;
UpdateAllItemSelect();
}
/// <summary>
/// 获取Item
/// </summary>
/// <param name="listView"></param>
/// <param name="index"></param>
/// <returns></returns>
protected LoopListViewItem OnGetItemByIndex(LoopListView listView, int index)
{
if (index < 0 || index >= num) return null;
var item = itemBase == null ? CreateItem() : CreateItem(itemBase);
if (item == null) return null;
item.SetItemIndex(index);
UpdateListItem(item, index, m_tpFuncItem);
return item.LoopItem;
}
/// <summary>
/// 创建Item
/// </summary>
/// <returns></returns>
public TItem CreateItem()
{
return CreateItem(typeof(TItem).Name);
}
/// <summary>
/// 创建Item
/// </summary>
/// <param name="itemName"></param>
/// <returns></returns>
public TItem CreateItem(string itemName)
{
TItem widget = null;
LoopListViewItem item = LoopRectView.AllocOrNewListViewItem(itemName);
if (item != null)
{
widget = CreateItem(item);
}
return widget;
}
/// <summary>
/// 创建Item
/// </summary>
/// <param name="prefab"></param>
/// <returns></returns>
public TItem CreateItem(GameObject prefab)
{
TItem widget = null;
LoopListViewItem item = LoopRectView.AllocOrNewListViewItem(prefab);
if (item != null)
{
widget = CreateItem(item);
}
return widget;
}
/// <summary>
/// 创建Item
/// </summary>
/// <param name="item"></param>
/// <returns></returns>
private TItem CreateItem(LoopListViewItem item)
{
TItem widget;
if (!m_itemCache.TryGetValue(item.GoId, out widget))
{
widget = CreateWidget<TItem>(item.gameObject);
widget.LoopItem = item;
m_itemCache.Add(item.GoId, widget);
}
return widget;
}
/// <summary>
/// 获取item
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public override TItem GetItem(int index)
{
for (var i = 0; i < m_itemCache.Count; i++)
{
var item = m_itemCache.GetValueByIndex(i);
if (item.GetItemIndex() == index)
{
return item;
}
}
return null;
}
/// <summary>
/// 获取itemList
/// </summary>
/// <returns></returns>
public List<TItem> GetItemList()
{
m_items.Clear();
for (int i = 0; i < m_itemCache.Count; i++)
{
m_items.Add(m_itemCache.GetValueByIndex(i));
}
return m_items;
}
/// <summary>
/// 获取当前起始索引
/// </summary>
/// <returns></returns>
public int GetItemStartIndex()
{
return LoopRectView.GetItemStartIndex();
}
/// <summary>
/// 获取Item。
/// </summary>
/// <param name="index">索引。</param>
/// <returns>TItem。</returns>
public TItem GetItemByIndex(int index)
{
return m_itemCache.GetValueByIndex(index);
}
/// <summary>
/// 刷新所有item选中状态
/// </summary>
/// <returns></returns>
public void UpdateAllItemSelect()
{
var index = selectIndex;
for (var i = 0; i < m_itemCache.Count; i++)
{
if (m_itemCache.GetValueByIndex(i) is IListSelectItem item)
{
item.SetSelected(item.GetItemIndex() == index);
}
}
}
protected override void UpdateSnapTargetItem()
{
base.UpdateSnapTargetItem();
if (LoopRectView != null && LoopRectView.ItemSnapEnable)
{
LoopRectView.SetSnapTargetItemIndex(selectIndex);
}
}
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 72b7444fb04642039aacc2db27dd002a
timeCreated: 1691679907

View File

@@ -13,6 +13,7 @@ namespace GameLogic
/// </summary>
public static void Init()
{
GameEvent.EventMgr.Init();
RegisterEventInterface_Logic.Register(GameEvent.EventMgr);
RegisterEventInterface_UI.Register(GameEvent.EventMgr);
}

View File

@@ -34,7 +34,6 @@ namespace GameLogic
object obj = Activator.CreateInstance(type, mgr.Dispatcher);
mgr.Init();
mgr.RegWrapInterface(obj.GetType().GetInterfaces()[0]?.FullName, obj);
}
}

View File

@@ -1,12 +1,12 @@
using System.Collections.Generic;
using GameBase;
using GameLogic;
using TEngine;
using UnityEngine;
public partial class GameApp
public partial class GameApp : Singleton<GameApp>
{
private List<ILogicSys> _listLogicMgr;
public override void Active()
{
CodeTypes.Instance.Init(_hotfixAssembly.ToArray());
@@ -15,13 +15,13 @@ public partial class GameApp
RegisterAllSystem();
InitSystemSetting();
}
/// <summary>
/// 设置一些通用的系统属性。
/// </summary>
private void InitSystemSetting()
{
}
/// <summary>
@@ -32,7 +32,7 @@ public partial class GameApp
//带生命周期的单例系统。
AddLogicSys(BehaviourSingleSystem.Instance);
}
/// <summary>
/// 注册逻辑系统。
/// </summary>

View File

@@ -175,11 +175,11 @@ MonoBehaviour:
m_SelectOnRight: {fileID: 0}
m_Transition: 1
m_Colors:
m_NormalColor: {r: 0.9450981, g: 0.6392157, b: 0.25490198, a: 1}
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
m_DisabledColor: {r: 0.94509804, g: 0.6392157, b: 0.25490198, a: 1}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
@@ -193,12 +193,12 @@ MonoBehaviour:
m_PressedTrigger: Pressed
m_SelectedTrigger: Selected
m_DisabledTrigger: Disabled
m_Interactable: 1
m_Interactable: 0
m_TargetGraphic: {fileID: 4296679187938450242}
m_HandleRect: {fileID: 3254196395727856927}
m_Direction: 0
m_Value: 0
m_Size: 1
m_Size: 0
m_NumberOfSteps: 0
m_OnValueChanged:
m_PersistentCalls:

View File

@@ -5,11 +5,11 @@ using Version = TEngine.Version;
namespace GameMain
{
[Window(UILayer.UI, fromResources: true, location: "AssetLoad/UILoadUpdate",fullScreen:true)]
[Window(UILayer.UI, fromResources: true, location: "AssetLoad/UILoadUpdate", fullScreen: true)]
public class UILoadUpdate : UIWindow
{
private Scrollbar m_scrollbarProgress;
#region
private Image m_imgBackGround;
private Text m_textDesc;
@@ -41,12 +41,16 @@ namespace GameMain
protected override void RegisterEvent()
{
base.RegisterEvent();
AddUIEvent(RuntimeId.ToRuntimeId("RefreshVersion"),RefreshVersion);
AddUIEvent(RuntimeId.ToRuntimeId("RefreshVersion"), RefreshVersion);
}
protected override void OnRefresh()
{
base.OnRefresh();
if (base.userDatas.Length > 0 && base.userDatas[0] != null)
{
m_textDesc.text = base.userDatas[0].ToString(); //获取更新内容由ProcedureDownloadFile -> OnDownloadProgressCallback 传递
}
}
#region

View File

@@ -7,43 +7,50 @@ using Utility = TEngine.Utility;
namespace GameMain
{
public class ProcedureDownloadFile:ProcedureBase
public class ProcedureDownloadFile : ProcedureBase
{
public override bool UseNativeDialog { get; }
private ProcedureOwner _procedureOwner;
private float _lastUpdateDownloadedSize;
private float _totalSpeed;
private int _speedSampleCount;
private float CurrentSpeed
{
get
{
float interval = GameTime.deltaTime;
float interval = Math.Max(GameTime.deltaTime, 0.01f); // 防止deltaTime过小
var sizeDiff = GameModule.Resource.Downloader.CurrentDownloadBytes - _lastUpdateDownloadedSize;
_lastUpdateDownloadedSize = GameModule.Resource.Downloader.CurrentDownloadBytes;
var speed = (float)Math.Floor(sizeDiff / interval);
return speed;
var speed = sizeDiff / interval;
// 使用滑动窗口计算平均速度
_totalSpeed += speed;
_speedSampleCount++;
return _totalSpeed / _speedSampleCount;
}
}
protected override void OnEnter(ProcedureOwner procedureOwner)
{
_procedureOwner = procedureOwner;
Log.Info("开始下载更新文件!");
UILoadMgr.Show(UIDefine.UILoadUpdate,$"开始下载更新文件...");
UILoadMgr.Show(UIDefine.UILoadUpdate, "开始下载更新文件...");
BeginDownload().Forget();
}
private async UniTaskVoid BeginDownload()
{
var downloader = GameModule.Resource.Downloader;
// 注册下载回调
downloader.OnDownloadErrorCallback = OnDownloadErrorCallback;
downloader.OnDownloadProgressCallback = OnDownloadProgressCallback;
downloader.DownloadErrorCallback = OnDownloadErrorCallback;
downloader.DownloadUpdateCallback = OnDownloadProgressCallback;
downloader.BeginDownload();
await downloader;
@@ -54,38 +61,42 @@ namespace GameMain
ChangeState<ProcedureDownloadOver>(_procedureOwner);
}
private void OnDownloadErrorCallback(string fileName, string error)
private void OnDownloadErrorCallback(DownloadErrorData downloadErrorData)
{
UILoadTip.ShowMessageBox($"Failed to download file : {fileName}", MessageShowType.TwoButton,
LoadStyle.StyleEnum.Style_Default
, () => { ChangeState<ProcedureCreateDownloader>(_procedureOwner); }, UnityEngine.Application.Quit);
UILoadTip.ShowMessageBox($"Failed to download file : {downloadErrorData.FileName}", MessageShowType.TwoButton,
LoadStyle.StyleEnum.Style_Default,
() => { ChangeState<ProcedureCreateDownloader>(_procedureOwner); }, UnityEngine.Application.Quit);
}
private void OnDownloadProgressCallback(int totalDownloadCount, int currentDownloadCount, long totalDownloadBytes, long currentDownloadBytes)
private void OnDownloadProgressCallback(DownloadUpdateData downloadUpdateData/*int totalDownloadCount, int currentDownloadCount, long totalDownloadBytes, long currentDownloadBytes*/)
{
string currentSizeMb = (currentDownloadBytes / 1048576f).ToString("f1");
string totalSizeMb = (totalDownloadBytes / 1048576f).ToString("f1");
// UILoadMgr.Show(UIDefine.UILoadUpdate,$"{currentDownloadCount}/{totalDownloadCount} {currentSizeMb}MB/{totalSizeMb}MB");
string descriptionText = Utility.Text.Format("正在更新,已更新{0},总更新{1},已更新大小{2},总更新大小{3},更新进度{4},当前网速{5}/s",
currentDownloadCount.ToString(),
totalDownloadCount.ToString(),
Utility.File.GetByteLengthString(currentDownloadBytes),
Utility.File.GetByteLengthString(totalDownloadBytes),
GameModule.Resource.Downloader.Progress,
Utility.File.GetLengthString((int)CurrentSpeed));
string currentSizeMb = (downloadUpdateData.CurrentDownloadBytes / 1048576f).ToString("f1");
string totalSizeMb = (downloadUpdateData.TotalDownloadBytes / 1048576f).ToString("f1");
float progressPercentage = GameModule.Resource.Downloader.Progress * 100;
string speed = Utility.File.GetLengthString((int)CurrentSpeed);
string line1 = Utility.Text.Format("正在更新,已更新 {0}/{1} ({2:F2}%)", downloadUpdateData.CurrentDownloadCount, downloadUpdateData.TotalDownloadCount, progressPercentage);
string line2 = Utility.Text.Format("已更新大小 {0}MB/{1}MB", currentSizeMb, totalSizeMb);
string line3 = Utility.Text.Format("当前网速 {0}/s剩余时间 {1}", speed, GetRemainingTime(downloadUpdateData.TotalDownloadBytes, downloadUpdateData.CurrentDownloadBytes, CurrentSpeed));
LoadUpdateLogic.Instance.DownProgressAction?.Invoke(GameModule.Resource.Downloader.Progress);
UILoadMgr.Show(UIDefine.UILoadUpdate,descriptionText);
UILoadMgr.Show(UIDefine.UILoadUpdate, $"{line1}\n{line2}\n{line3}");
int needTime = 0;
if (CurrentSpeed > 0)
{
needTime = (int)((totalDownloadBytes - currentDownloadBytes) / CurrentSpeed);
}
TimeSpan ts = new TimeSpan(0, 0, needTime);
string timeStr = ts.ToString(@"mm\:ss");
string updateProgress = Utility.Text.Format("剩余时间 {0}({1}/s)", timeStr, Utility.File.GetLengthString((int)CurrentSpeed));
Log.Info(updateProgress);
Log.Info($"{line1} {line2} {line3}");
}
private string GetRemainingTime(long totalBytes, long currentBytes, float speed)
{
int needTime = 0;
if (speed > 0)
{
needTime = (int)((totalBytes - currentBytes) / speed);
}
TimeSpan ts = new TimeSpan(0, 0, needTime);
return ts.ToString(@"mm\:ss");
}
}
}
}

View File

@@ -61,15 +61,13 @@ namespace GameMain
//热更新阶段文本初始化
LoadText.Instance.InitConfigData(null);
GameEvent.Send(RuntimeId.ToRuntimeId("RefreshVersion"));
EPlayMode playMode = GameModule.Resource.PlayMode;
// 编辑器模式。
if (playMode == EPlayMode.EditorSimulateMode)
{
Log.Info("Editor resource mode detected.");
ChangeState<ProcedurePreload>(procedureOwner);
ChangeState<ProcedureInitResources>(procedureOwner);
}
// 单机模式。
else if (playMode == EPlayMode.OfflinePlayMode)

View File

@@ -1,6 +1,8 @@
using System;
using System.Collections;
using Cysharp.Threading.Tasks;
using TEngine;
using YooAsset;
using ProcedureOwner = TEngine.IFsm<TEngine.IProcedureManager>;
namespace GameMain
@@ -20,7 +22,7 @@ namespace GameMain
UILoadMgr.Show(UIDefine.UILoadUpdate,"初始化资源中...");
// 注意:使用单机模式并初始化资源前,需要先构建 AssetBundle 并复制到 StreamingAssets 中,否则会产生 HTTP 404 错误
OnInitResourcesComplete().Forget();
Utility.Unity.StartCoroutine(InitResources(procedureOwner));
}
protected override void OnUpdate(ProcedureOwner procedureOwner, float elapseSeconds, float realElapseSeconds)
@@ -36,11 +38,41 @@ namespace GameMain
ChangeState<ProcedurePreload>(procedureOwner);
}
private async UniTaskVoid OnInitResourcesComplete()
/// <summary>
/// 编辑器与单机保持相同流程。
/// </summary>
/// <returns></returns>
private IEnumerator InitResources(ProcedureOwner procedureOwner)
{
await UniTask.Delay(TimeSpan.FromSeconds(1f));
// 2. 获取资源清单的版本信息
var operation1 = GameModule.Resource.UpdatePackageVersionAsync();
yield return operation1;
if (operation1.Status != EOperationStatus.Succeed)
{
OnInitResourcesError(procedureOwner);
yield break;
}
// 3. 传入的版本信息更新资源清单
var operation = GameModule.Resource.UpdatePackageManifestAsync(operation1.PackageVersion);
yield return operation;
if (operation.Status != EOperationStatus.Succeed)
{
OnInitResourcesError(procedureOwner);
yield break;
}
m_InitResourcesComplete = true;
Log.Info("Init resources complete.");
}
private void OnInitResourcesError(ProcedureOwner procedureOwner)
{
UILoadTip.ShowMessageBox($"初始化资源失败!点击确认重试</color>", MessageShowType.TwoButton,
LoadStyle.StyleEnum.Style_Retry
, () =>
{
Utility.Unity.StartCoroutine(InitResources(procedureOwner));
}, UnityEngine.Application.Quit);
}
}
}

View File

@@ -9,6 +9,7 @@ using UnityEngine;
using TEngine;
using System.Reflection;
using YooAsset;
using Cysharp.Threading.Tasks;
namespace GameMain
{
@@ -38,6 +39,12 @@ namespace GameMain
base.OnEnter(procedureOwner);
Log.Debug("HyBridCLR ProcedureLoadAssembly OnEnter");
m_procedureOwner = procedureOwner;
LoadAssembly().Forget();
}
private async UniTaskVoid LoadAssembly()
{
m_LoadAssemblyComplete = false;
m_HotfixAssemblys = new List<Assembly>();
@@ -55,7 +62,7 @@ namespace GameMain
{
m_LoadMetadataAssemblyComplete = true;
}
if (!SettingsUtils.HybridCLRCustomGlobalSettings.Enable || GameModule.Resource.PlayMode == EPlayMode.EditorSimulateMode)
{
m_MainLogicAssembly = GetMainLogicAssembly();
@@ -75,10 +82,11 @@ namespace GameMain
SettingsUtils.HybridCLRCustomGlobalSettings.AssemblyTextAssetPath,
$"{hotUpdateDllName}{SettingsUtils.HybridCLRCustomGlobalSettings.AssemblyTextAssetExtension}"));
}
Log.Debug($"LoadAsset: [ {assetLocation} ]");
m_LoadAssetCount++;
GameModule.Resource.LoadAsset<TextAsset>(assetLocation,LoadAssetSuccess);
var result = await GameModule.Resource.LoadAssetAsync<TextAsset>(assetLocation);
LoadAssetSuccess(result);
}
m_LoadAssemblyWait = true;
@@ -94,7 +102,7 @@ namespace GameMain
m_LoadAssemblyComplete = true;
}
}
protected override void OnUpdate(IFsm<IProcedureManager> procedureOwner, float elapseSeconds, float realElapseSeconds)
{
base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds);
@@ -108,7 +116,7 @@ namespace GameMain
}
AllAssemblyLoadComplete();
}
private void AllAssemblyLoadComplete()
{
ChangeState<ProcedureStartGame>(m_procedureOwner);
@@ -231,11 +239,11 @@ namespace GameMain
SettingsUtils.HybridCLRCustomGlobalSettings.AssemblyTextAssetPath,
$"{aotDllName}{SettingsUtils.HybridCLRCustomGlobalSettings.AssemblyTextAssetExtension}"));
}
Log.Debug($"LoadMetadataAsset: [ {assetLocation} ]");
m_LoadMetadataAssetCount++;
GameModule.Resource.LoadAsset<TextAsset>(assetLocation,LoadMetadataAssetSuccess);
GameModule.Resource.LoadAsset<TextAsset>(assetLocation, LoadMetadataAssetSuccess);
}
m_LoadMetadataAssemblyWait = true;
}

View File

@@ -34,7 +34,7 @@ namespace GameMain
{
//更新成功
//注意:保存资源版本号作为下次默认启动的版本!
operation.SavePackageVersion();
// operation.SavePackageVersion();
if (GameModule.Resource.PlayMode == EPlayMode.WebPlayMode ||
GameModule.Resource.UpdatableWhilePlaying)

View File

@@ -24,15 +24,20 @@ namespace GameMain
UILoadMgr.Show(UIDefine.UILoadUpdate, $"更新静态版本文件...");
//检查设备是否能够访问互联网
if (Application.internetReachability == NetworkReachability.NotReachable)
EPlayMode playMode = GameModule.Resource.PlayMode;
if (playMode == EPlayMode.HostPlayMode)
{
Log.Warning("The device is not connected to the network");
UILoadMgr.Show(UIDefine.UILoadUpdate, LoadText.Instance.Label_Net_UnReachable);
UILoadTip.ShowMessageBox(LoadText.Instance.Label_Net_UnReachable, MessageShowType.TwoButton,
LoadStyle.StyleEnum.Style_Retry,
GetStaticVersion().Forget,
() => { ChangeState<ProcedureInitResources>(procedureOwner); });
//检查设备是否能够访问互联网
if (Application.internetReachability == NetworkReachability.NotReachable)
{
Log.Warning("The device is not connected to the network");
UILoadMgr.Show(UIDefine.UILoadUpdate, LoadText.Instance.Label_Net_UnReachable);
UILoadTip.ShowMessageBox(LoadText.Instance.Label_Net_UnReachable, MessageShowType.TwoButton,
LoadStyle.StyleEnum.Style_Retry,
GetStaticVersion().Forget,
() => { ChangeState<ProcedureInitResources>(procedureOwner); });
}
}
UILoadMgr.Show(UIDefine.UILoadUpdate, LoadText.Instance.Label_RequestVersionIng);
@@ -46,7 +51,11 @@ namespace GameMain
/// </summary>
private async UniTaskVoid GetStaticVersion()
{
await UniTask.Delay(TimeSpan.FromSeconds(0.5f));
EPlayMode playMode = GameModule.Resource.PlayMode;
if (playMode == EPlayMode.HostPlayMode)
{
await UniTask.Delay(TimeSpan.FromSeconds(0.5f));
}
var operation = GameModule.Resource.UpdatePackageVersionAsync();
@@ -59,7 +68,15 @@ namespace GameMain
//线上最新版本operation.PackageVersion
GameModule.Resource.PackageVersion = operation.PackageVersion;
Log.Debug($"Updated package Version : from {GameModule.Resource.GetPackageVersion()} to {operation.PackageVersion}");
ChangeState<ProcedureUpdateManifest>(_procedureOwner);
if (playMode == EPlayMode.HostPlayMode || playMode == EPlayMode.WebPlayMode)
{
ChangeState<ProcedureUpdateManifest>(_procedureOwner);
}
else
{
ChangeState<ProcedureInitResources>(_procedureOwner);
}
}
else
{

View File

@@ -69,7 +69,23 @@ public static class EventInterfaceGenerate
EventInterfaceGenerateTag.HadGenerate = true;
// 加载程序集
Assembly assembly = typeof(GameApp).Assembly;
Assembly assembly = null;
foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
{
foreach(var type in asm.GetTypes())
{
if (type.Name == "GameApp")
{
assembly = asm;
break;
}
}
}
if(assembly == null)
{
Debug.LogError("Game App Class Not Found");
return;
}
// 获取程序集中的所有类型
Type[] types = assembly.GetTypes();
@@ -187,14 +203,20 @@ public static class EventInterfaceGenerate
var parameterInfo = parameterInfos[i];
Type type = parameterInfo.ParameterType;
string paramName = parameterInfo.Name;
if (type.FullName.StartsWith("System.Collections.Generic.List"))
{
Debug.Log("123");
}
if (i == parameterInfos.Length - 1)
{
paramStr += $"{type.FullName} {paramName}";
paramStr += $"{GetTypeName(parameterInfo)} {paramName}";
paramStr2 += $"{paramName}";
}
else
{
paramStr += $"{type.FullName} {paramName},";
paramStr += $"{GetTypeName(parameterInfo)} {paramName},";
paramStr2 += $"{paramName},";
}
}
@@ -214,6 +236,63 @@ public static class EventInterfaceGenerate
}
}
}
private static string GetTypeName(ParameterInfo parameterInfo)
{
if (parameterInfo.ParameterType.IsList() && parameterInfo.ParameterType.IsGenericType)
{
string typeName = parameterInfo.ParameterType.FullName.Split('`')[0];
return $"{typeName}<{parameterInfo.ParameterType.GenericTypeArguments[0].FullName}>";
}
else if (parameterInfo.ParameterType.IsDictionary() && parameterInfo.ParameterType.IsGenericType)
{
string typeName = parameterInfo.ParameterType.FullName.Split('`')[0];
return $"{typeName}<{parameterInfo.ParameterType.GenericTypeArguments[0].FullName},{parameterInfo.ParameterType.GenericTypeArguments[1].FullName}>";
}
else
{
return parameterInfo.ParameterType.FullName;
}
}
/// <summary>
/// 判断类型是否为可操作的列表类型
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
public static bool IsList(this Type type)
{
if (typeof (System.Collections.IList).IsAssignableFrom(type))
{
return true;
}
foreach (var it in type.GetInterfaces())
{
if (it.IsGenericType && typeof (IList<>) == it.GetGenericTypeDefinition())
return true;
}
return false;
}
public static bool IsDictionary(this Type type)
{
if (typeof (System.Collections.IDictionary).IsAssignableFrom(type))
{
return true;
}
foreach (var it in type.GetInterfaces())
{
if (it.IsGenericType && typeof (IDictionary) == it.GetGenericTypeDefinition())
return true;
}
return false;
}
}
public static class EventInterfaceGenerateTag

View File

@@ -6,10 +6,12 @@ using UnityEngine;
public class TEngineSettingsProvider : SettingsProvider
{
const string k_SettingsPathHeader = "Assets/TEngine/ResRaw/Resources/";
const string k_SettingsPath = "Assets/TEngine/ResRaw/Resources/TEngineGlobalSettings.asset";
private const string headerName = "TEngine/TEngineSettings";
private SerializedObject m_CustomSettings;
private static string m_SettingsPath = k_SettingsPath;
internal static SerializedObject GetSerializedSettings()
{
return new SerializedObject(SettingsUtils.GlobalSettings);
@@ -17,7 +19,12 @@ public class TEngineSettingsProvider : SettingsProvider
public static bool IsSettingsAvailable()
{
return File.Exists(k_SettingsPath);
var pathes = AssetDatabase.FindAssets("TEngineGlobalSettings", new string[2] { k_SettingsPathHeader,"Packages/com.tengine/" });
if (pathes.Length > 0)
{
m_SettingsPath = AssetDatabase.GUIDToAssetPath(pathes[0]);
}
return pathes.Length > 0;
}
public override void OnActivate(string searchContext, VisualElement rootElement)
@@ -29,18 +36,36 @@ public class TEngineSettingsProvider : SettingsProvider
public override void OnDeactivate()
{
base.OnDeactivate();
SaveAssetData(k_SettingsPath);
// 确保只有在有修改时才保存
if (m_CustomSettings != null && m_CustomSettings.hasModifiedProperties)
{
EditorApplication.delayCall += () => SaveAssetData(k_SettingsPath);
}
}
void SaveAssetData(string path)
{
TEngineSettings old = AssetDatabase.LoadAssetAtPath<TEngineSettings>(k_SettingsPath);
if (old == null)
{
Debug.LogError($"Failed to load TEngineSettings from path: {k_SettingsPath}");
return;
}
TEngineSettings data = ScriptableObject.CreateInstance<TEngineSettings>();
data.Set(old.FrameworkGlobalSettings, old.BybridCLRCustomGlobalSettings);
AssetDatabase.DeleteAsset(path);
AssetDatabase.CreateAsset(data, path);
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
if (AssetDatabase.DeleteAsset(path))
{
AssetDatabase.CreateAsset(data, path);
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
}
else
{
Debug.LogError($"Failed to delete existing asset at path: {path}");
}
}

View File

@@ -1,5 +1,7 @@
using System;
using System.Collections.Generic;
using UnityEditor;
using YooAsset.Editor;
namespace TEngine.Editor.Inspector
{
@@ -14,30 +16,24 @@ namespace TEngine.Editor.Inspector
"WebPlayMode (WebGL运行模式)"
};
private static readonly string[] _verifyLevelNames = new string[]
{
"Low (验证文件存在)",
"Middle (验证文件大小)",
"High (验证文件大小和CRC)"
};
private SerializedProperty m_PlayMode = null;
private SerializedProperty m_UpdatableWhilePlaying = null;
private SerializedProperty m_VerifyLevel = null;
private SerializedProperty m_Milliseconds = null;
private SerializedProperty m_ReadWritePathType = null;
private SerializedProperty m_MinUnloadUnusedAssetsInterval = null;
private SerializedProperty m_MaxUnloadUnusedAssetsInterval = null;
private SerializedProperty m_UseSystemUnloadUnusedAssets = null;
private SerializedProperty m_AssetAutoReleaseInterval = null;
private SerializedProperty m_AssetCapacity = null;
private SerializedProperty m_AssetExpireTime = null;
private SerializedProperty m_AssetPriority = null;
private SerializedProperty m_DownloadingMaxNum = null;
private SerializedProperty m_FailedTryAgain = null;
private SerializedProperty m_PackageName = null;
private int m_ResourceModeIndex = 0;
private int m_VerifyIndex = 0;
private int m_PackageNameIndex = 0;
private string[] m_PackageNames;
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
@@ -51,8 +47,6 @@ namespace TEngine.Editor.Inspector
if (EditorApplication.isPlaying && IsPrefabInHierarchy(t.gameObject))
{
EditorGUILayout.EnumPopup("Resource Mode", t.PlayMode);
EditorGUILayout.EnumPopup("VerifyLevel", t.VerifyLevel);
}
else
{
@@ -62,13 +56,6 @@ namespace TEngine.Editor.Inspector
m_ResourceModeIndex = selectedIndex;
m_PlayMode.enumValueIndex = selectedIndex;
}
int selectedVerifyIndex = EditorGUILayout.Popup("VerifyLevel", m_VerifyIndex, _verifyLevelNames);
if (selectedVerifyIndex != m_VerifyIndex)
{
m_VerifyIndex = selectedVerifyIndex;
m_VerifyLevel.enumValueIndex = selectedVerifyIndex;
}
}
m_ReadWritePathType.enumValueIndex = (int)(ReadWritePathType)EditorGUILayout.EnumPopup("Read-Write Path Type", t.ReadWritePathType);
@@ -77,6 +64,18 @@ namespace TEngine.Editor.Inspector
EditorGUI.EndDisabledGroup();
m_PackageNames = GetBuildPackageNames().ToArray();
m_PackageNameIndex = Array.IndexOf(m_PackageNames, m_PackageName.stringValue);
if (m_PackageNameIndex < 0)
{
m_PackageNameIndex = 0;
}
m_PackageNameIndex = EditorGUILayout.Popup("Package Name", m_PackageNameIndex, m_PackageNames);
if (m_PackageName.stringValue != m_PackageNames[m_PackageNameIndex])
{
m_PackageName.stringValue = m_PackageNames[m_PackageNameIndex];
}
int milliseconds = EditorGUILayout.DelayedIntField("Milliseconds", m_Milliseconds.intValue);
if (milliseconds != m_Milliseconds.intValue)
{
@@ -90,6 +89,8 @@ namespace TEngine.Editor.Inspector
}
}
EditorGUILayout.PropertyField(m_UseSystemUnloadUnusedAssets);
float minUnloadUnusedAssetsInterval =
EditorGUILayout.Slider("Min Unload Unused Assets Interval", m_MinUnloadUnusedAssetsInterval.floatValue, 0f, 3600f);
if (Math.Abs(minUnloadUnusedAssetsInterval - m_MinUnloadUnusedAssetsInterval.floatValue) > 0.01f)
@@ -225,17 +226,18 @@ namespace TEngine.Editor.Inspector
{
m_PlayMode = serializedObject.FindProperty("playMode");
m_UpdatableWhilePlaying = serializedObject.FindProperty("m_UpdatableWhilePlaying");
m_VerifyLevel = serializedObject.FindProperty("VerifyLevel");
m_Milliseconds = serializedObject.FindProperty("Milliseconds");
m_ReadWritePathType = serializedObject.FindProperty("m_ReadWritePathType");
m_MinUnloadUnusedAssetsInterval = serializedObject.FindProperty("m_MinUnloadUnusedAssetsInterval");
m_MaxUnloadUnusedAssetsInterval = serializedObject.FindProperty("m_MaxUnloadUnusedAssetsInterval");
m_UseSystemUnloadUnusedAssets = serializedObject.FindProperty("m_UseSystemUnloadUnusedAssets");
m_AssetAutoReleaseInterval = serializedObject.FindProperty("m_AssetAutoReleaseInterval");
m_AssetCapacity = serializedObject.FindProperty("m_AssetCapacity");
m_AssetExpireTime = serializedObject.FindProperty("m_AssetExpireTime");
m_AssetPriority = serializedObject.FindProperty("m_AssetPriority");
m_DownloadingMaxNum = serializedObject.FindProperty("m_DownloadingMaxNum");
m_FailedTryAgain = serializedObject.FindProperty("m_FailedTryAgain");
m_PackageName = serializedObject.FindProperty("packageName");
RefreshModes();
RefreshTypeNames();
@@ -244,12 +246,25 @@ namespace TEngine.Editor.Inspector
private void RefreshModes()
{
m_ResourceModeIndex = m_PlayMode.enumValueIndex > 0 ? m_PlayMode.enumValueIndex : 0;
m_VerifyIndex = m_VerifyLevel.enumValueIndex > 0 ? m_VerifyLevel.enumValueIndex : 0;
}
private void RefreshTypeNames()
{
serializedObject.ApplyModifiedProperties();
}
/// <summary>
/// 获取构建包名称列表,用于下拉可选择
/// </summary>
/// <returns></returns>
private List<string> GetBuildPackageNames()
{
List<string> result = new List<string>();
foreach (var package in AssetBundleCollectorSettingData.Setting.Packages)
{
result.Add(package.PackageName);
}
return result;
}
}
}

View File

@@ -136,7 +136,6 @@ namespace TEngine.Editor
buildParameters.BuildinFileRoot = AssetBundleBuilderHelper.GetStreamingAssetsRoot();
buildParameters.BuildPipeline = buildPipeline.ToString();
buildParameters.BuildTarget = buildTarget;
buildParameters.BuildMode = EBuildMode.IncrementalBuild;
buildParameters.PackageName = "DefaultPackage";
buildParameters.PackageVersion = packageVersion;
buildParameters.VerifyBuildingResult = true;
@@ -218,6 +217,17 @@ namespace TEngine.Editor
AssetDatabase.Refresh();
BuildImp(BuildTargetGroup.iOS, BuildTarget.iOS, $"{Application.dataPath}/../Build/IOS/XCode_Project");
}
[MenuItem("TEngine/Quick Build/一键打包WebGL", false, 91)]
public static void AutomationBuildWebGL()
{
BuildTarget target = EditorUserBuildSettings.activeBuildTarget;
BuildDLLCommand.BuildAndCopyDlls(target);
AssetDatabase.Refresh();
BuildInternal(target, Application.dataPath + "/../Builds/WebGL", packageVersion: GetBuildPackageVersion());
AssetDatabase.Refresh();
BuildImp(BuildTargetGroup.WebGL, BuildTarget.WebGL, $"{Application.dataPath}/../Builds/WebGL");
}
public static void BuildImp(BuildTargetGroup buildTargetGroup, BuildTarget buildTarget, string locationPathName)
{

View File

@@ -16,7 +16,7 @@ public class FileOffsetEncryption : IEncryptionServices
}
int offset = 32;
byte[] fileData = File.ReadAllBytes(fileInfo.FilePath);
byte[] fileData = File.ReadAllBytes(fileInfo.FileLoadPath);
var encryptedData = new byte[fileData.Length + offset];
Buffer.BlockCopy(fileData, 0, encryptedData, offset, fileData.Length);
@@ -39,7 +39,7 @@ public class FileStreamEncryption : IEncryptionServices
}
var fileData = File.ReadAllBytes(fileInfo.FilePath);
var fileData = File.ReadAllBytes(fileInfo.FileLoadPath);
for (int i = 0; i < fileData.Length; i++)
{
fileData[i] ^= BundleStream.KEY;

View File

@@ -92,9 +92,10 @@ namespace TEngine.Editor.UI
te.SelectAll();
te.Copy();
}
UnityEngine.Debug.Log($"脚本已生成到剪贴板请自行Ctl+V粘贴");
}
private static void Ergodic(Transform root, Transform transform, ref StringBuilder strVar, ref StringBuilder strBind, ref StringBuilder strOnCreate,
public static void Ergodic(Transform root, Transform transform, ref StringBuilder strVar, ref StringBuilder strBind, ref StringBuilder strOnCreate,
ref StringBuilder strCallback, bool isUniTask)
{
for (int i = 0; i < transform.childCount; ++i)

View File

@@ -0,0 +1,73 @@
using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
#region
//作者:Saber
#endregion
namespace TEngine.Editor.UI
{
public class TEUIHelper
{
public static string Generate(bool includeListener, bool isUniTask = false, Transform root = null, string nameSpace = "",string className="")
{
if (root != null)
{
StringBuilder strVar = new StringBuilder();
StringBuilder strBind = new StringBuilder();
StringBuilder strOnCreate = new StringBuilder();
StringBuilder strCallback = new StringBuilder();
ScriptGenerator.Ergodic(root, root, ref strVar, ref strBind, ref strOnCreate, ref strCallback, isUniTask);
//object[] args = new object[] { root, root, strVar, strBind, strOnCreate, strCallback, isUniTask };
//typeof(TEngine.Editor.UI.ScriptGenerator).GetMethod("Ergodic",System.Reflection.BindingFlags.NonPublic| System.Reflection.BindingFlags.Static).Invoke(null,args);
//strVar = args[2] as StringBuilder;
//strBind = args[3] as StringBuilder;
//strOnCreate = args[4] as StringBuilder;
//strCallback = args[5] as StringBuilder;
StringBuilder strFile = new StringBuilder();
if (includeListener)
{
#if ENABLE_TEXTMESHPRO
strFile.Append("using TMPro;\n");
#endif
if (isUniTask)
{
strFile.Append("using Cysharp.Threading.Tasks;\n");
}
}
strFile.Append("using UnityEngine;\n");
strFile.Append("using UnityEngine.UI;\n");
strFile.Append("using TEngine;\n\n");
nameSpace = string.IsNullOrEmpty(nameSpace) ? SettingsUtils.GetUINameSpace() : nameSpace;
strFile.Append($"namespace {nameSpace}\n");
strFile.Append("{\n");
//strFile.Append("\t[Window(UILayer.UI)]\n");
strFile.Append("\tpartial class " + className + "\n");
strFile.Append("\t{\n");
// 脚本工具生成的代码
strFile.Append("\t\t#region 脚本工具生成的代码\n");
strFile.Append(strVar);
strFile.Append("\t\tprotected override void ScriptGenerator()\n");
strFile.Append("\t\t{\n");
strFile.Append(strBind);
strFile.Append(strOnCreate);
strFile.Append("\t\t}\n");
strFile.Append("\t\t#endregion");
strFile.Append("\n\t}");
strFile.Append("\n}");
return strFile.ToString();
}
return string.Empty;
}
}
}

Some files were not shown because too many files have changed in this diff Show More