Compare commits

..

9 Commits

Author SHA1 Message Date
ALEXTANGXIAO
1e195ed3b4 TE6 打飞机Demo
TE6 打飞机Demo
2025-04-26 23:23:39 +08:00
ALEX
aaf7ddbee8 Update README.md 2025-01-16 09:23:51 +08:00
ALEXTANG
32d4e47184 提交Odin,防止报错 2024-05-10 17:05:19 +08:00
ALEXTANG
a2255b80cd 更新demo
更新demo
2024-03-18 15:35:15 +08:00
ALEXTANG
17a5d7425c 更新Demo
更新Demo
2023-12-20 12:14:27 +08:00
ALEXTANG
f64bb37706 更新Demo
更新Demo
2023-12-20 12:08:25 +08:00
ALEXTANG
5cf6b8c034 Update main.unity 2023-07-07 23:01:33 +08:00
ALEXTANG
0397d0f01e Update
Update
2023-05-13 20:31:11 +08:00
ALEXTANG
7bf081269c Demo
Demo
2023-05-13 11:57:11 +08:00
2641 changed files with 233688 additions and 73147 deletions

View File

@@ -1,29 +0,0 @@
# 介绍- Introduce
### TEngine
<a style="text-decoration:none">
<img src="https://img.shields.io/badge/Unity%20Ver-2021.3.20++-blue.svg?style=flat-square" alt="status" />
</a>
<a style="text-decoration:none">
<img src="https://img.shields.io/github/license/ALEXTANGXIAO/TEngine" alt="license" />
</a>
<a style="text-decoration:none">
<img src="https://img.shields.io/github/last-commit/ALEXTANGXIAO/TEngine" alt="last" />
</a>
<a style="text-decoration:none">
<img src="https://img.shields.io/github/issues/ALEXTANGXIAO/TEngine" alt="issue" />
</a>
<a style="text-decoration:none">
<img src="https://img.shields.io/github/languages/top/ALEXTANGXIAO/TEngine" alt="topLanguage" />
</a>
TEngine是一套用于Unity框架解决方案用于帮助研发团队快速进行开发。
### 开箱即用
开箱即用、用法简洁,即用即上手.高可读性和详细的文档说明帮助你更快更好的进行游戏开发。您不需要关心框架的底层分离独自实现您的GamePlay。
### 性能强大
TEngine 底层使用基于UniTask的异步以及事件分发可插件定制化把复杂游戏简单化切以高性能、低耦合度实现。
### 高内聚低耦合
内嵌了The Best 次时代热更新解决方案<a href="https://github.com/focus-creative-games/hybridclr"><strong>HybridCLR</strong></a>、百万DAU验证的资源解决方案<a href="https://github.com/tuyoogame/YooAsset"><strong>YooAsset</strong></a>、你的游戏最佳配置解决方案<a href="https://github.com/focus-creative-games/luban"><strong>Luban</strong></a>

View File

@@ -1,58 +0,0 @@
# 快速开始- Quickly Start
快速上手
本教程引导从空项目开始体验TEngine。出于简化起见只演示目标平台为Windows的情况。
请在Standalone平台上正确跑通热更新流程后再自行尝试Android、iOS平台的热更新它们的流程非常相似。
### 1.使用Unity2021.3.20f1c1打开项目工程。
### 2.默认选择顶部栏目EditorMode编辑器下的模拟模式并点击Launcher开始运行
![image](src/1-1.png)
### 3.Editor编辑器下运行成功
![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打包并且运行热更新示例工程。
### 遇到问题请查看HybridlCLR的<a href="https://hybridclr.doc.code-philosophy.com/docs/help/commonerrors"><strong>常见错误(commonerrors)</strong></a>
### 系统需求
默认版本Unity2021.3.20f1c1
支持版本: Unity2019.4 & Unity2020.3 & Unity2021.3 & Unity2022.3
支持平台: Windows、OSX、Android、iOS、WebGL
开发环境: .NET4.x
### 目录结构
```
Assets
├── AssetRaw 资源目录
├── Atlas 图集目录
├── GameScripts 热更程序集目录
├── Scenes 主场景目录
└── 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程序集
```

View File

@@ -1,84 +0,0 @@
# TEngine
## TEngine-Runtime
### AOT内核基于Gameframework,最简化以及商业化适配。
![image](src/2-1.png)
## AOT游戏框架模块基类。
#### 框架思路为面向接口编程如Resource资源模块开发白皮书为先定义IResourceManager的接口规范然后编写ResourceManager继承框架具体实现(GameFrameworkModule)以及实现接口。最后实现调用层GameFrameworkModuleBase调用层可以拓展编辑器供开发者自定义模块参数。
``` csharp
/// <summary>
/// 游戏框架模块抽象类。GameFrameworkModule为具体框架模块实现。
/// </summary>
internal abstract class GameFrameworkModule
{
/// <summary>
/// 获取游戏框架模块优先级。
/// </summary>
/// <remarks>优先级较高的模块会优先轮询,并且关闭操作会后进行。</remarks>
internal virtual int Priority => 0;
/// <summary>
/// 游戏框架模块轮询。
/// </summary>
/// <param name="elapseSeconds">逻辑流逝时间,以秒为单位。</param>
/// <param name="realElapseSeconds">真实流逝时间,以秒为单位。</param>
internal abstract void Update(float elapseSeconds, float realElapseSeconds);
/// <summary>
/// 关闭并清理游戏框架模块。
/// </summary>
internal abstract void Shutdown();
}
//=====================================================================//
/// <summary>
/// 游戏框架模块抽象类。GameFrameworkModuleBase 为Mono调用层。
/// </summary>
public abstract class GameFrameworkModuleBase : MonoBehaviour
{
/// <summary>
/// 游戏框架模块初始化。
/// </summary>
protected virtual void Awake()
{
GameEntry.RegisterModule(this);
}
}
```
## 热更域程序集设计与说明
```
Assets/GameScripts
├── Editor 编辑器程序集
├── HotFix 游戏热更程序集目录 [Folder]
| ├── GameBase 游戏基础框架程序集 [Dll]
| ├── GameProto 游戏配置协议程序集 [Dll]
| ├── BattleCore 游戏核心战斗程序集 [Dll]
| └── GameLogic 游戏业务逻辑程序集 [Dll]
| ├── GameApp.cs 热更主入口
| └── GameApp_RegisterSystem.cs 热更主入口注册系统
└── Runtime Runtime程序集
```
游戏内主要玩法逻辑包括UI会在GameLogic中编写GameBase则存放一些通用性的逻辑GameProto存放与服务区交互的协议以及配置表逻辑BattleCore为帧同步分离的逻辑层做预留。若有项目需求完全可以进行自定义增删HotFix程序集。
PS注意增删程序集后需要同步到HybridClr的Setting面板以及TEngineSetting的面板。TEngineSettings面板有按钮可以从HybridClr中同步AOT与热更程序集。
## 常用模块接口
<strong>[3-1-资源模块](./3-1-资源模块.md)<strong>
<strong>[3-2-事件模块](./3-2-事件模块.md)<strong>
<strong>[3-3-内存池模块](./3-3-内存池模块.md)<strong>
<strong>[3-4-对象池模块](./3-4-对象池模块.md)<strong>
<strong>[3-5-UI模块](./3-5-UI模块.md)<strong>
<strong>[3-6-配置表模块](./3-6-配置表模块.md)<strong>
<strong>[3-7-流程模块](./3-7-流程模块.md)<strong>
<strong>[3-8-网络模块](./3-8-网络模块.md)<strong>

View File

@@ -1,200 +0,0 @@
## 3-1.资源模块 - ResourceModule
#### 资源模块默认使用Addressable可寻址定位。(!注意需要打包的资源不可以重名)
资源模块运行模式有EditorSimulateMode、OfflinePlayMode以及HostPlayMode
编辑器模式下以顶部导航栏的选项卡为优先选项打包后以Scene场景中ResourceModule脚本的Enum选项卡为优先选项(打包后不会走EditorSimulateMode)
Scene窗口Resource对象可以设置一些资源模块的常用设置比如打包后的资源模式、资源校验等级以及自动卸载资源间隔等。
![image](src/3-1-1.png)
Menu窗口TEngineSetting可以设置一些资源模块的热更新设置比如资源服务器地址以及在线参数等。备注在Luban目录下有一个基于Node的静态文件服务器可以把在线参数以及AB放入用于做热更新测试。
![image](src/3-1-2.png)
## 重要拓展概念
* AssetReference (资源引用标识) 通用加载资源的时候绑定一个引用标识使你无需关心手动Dispose资源句柄。
* AssetGroup资源组数据进行资源分组绑定管理内存中的生命周期资源生命周期托管给资源组的根节点进行Dispose。
* LruCacheTable (Least Recently Used Cache缓存表)
* ArcCacheTable (Adaptive Replacement Cache缓存表)
## 加载资源示范
注意资源模块默认使用Addressable可寻址定位。传入资源名字无需后缀即可
``` csharp
//同步加载。
GameModule.Resource.LoadAsset<SkillDisplayData>(location);
//异步加载。
GameModule.Resource.LoadAssetAsync<SkillDisplayData>(location, OnLoadSuccess);
private void OnLoadSuccess(AssetOperationHandle assetOperationHandle){}
//使用UniTask异步加载。
await GameModule.Resource.LoadAssetAsync<SkillDisplayData>(location,CancellationToken.None);
```
## 常用接口
remark资源模块初始化的生命周期已经在流程模块实现了具体有需求可以自定义开发。
``` csharp
/// <summary>
/// 获取当前资源包版本。
/// </summary>
/// <returns>资源包版本。</returns>
public string GetPackageVersion();
/// <summary>
/// 异步更新最新包的版本。
/// </summary>
/// <param name="appendTimeTicks">请求URL是否需要带时间戳。</param>
/// <param name="timeout">超时时间。</param>
/// <returns>请求远端包裹的最新版本操作句柄。</returns>
public UpdatePackageVersionOperation UpdatePackageVersionAsync(bool appendTimeTicks = false, int timeout = 60);
/// <summary>
/// 向网络端请求并更新清单
/// </summary>
/// <param name="packageVersion">更新的包裹版本</param>
/// <param name="autoSaveVersion">更新成功后自动保存版本号,作为下次初始化的版本。</param>
/// <param name="timeout">超时时间默认值60秒</param>
public UpdatePackageManifestOperation UpdatePackageManifestAsync(string packageVersion, bool autoSaveVersion = true, int timeout = 60);
/// <summary>
/// 创建资源下载器,用于下载当前资源版本所有的资源包文件。
/// </summary>
public ResourceDownloaderOperation CreateResourceDownloader();
/// <summary>
/// 清理包裹未使用的缓存文件。
/// </summary>
public ClearUnusedCacheFilesOperation ClearUnusedCacheFilesAsync();
/// <summary>
/// 清理沙盒路径。
/// </summary>
public void ClearSandbox();
/// <summary>
/// 强制执行释放未被使用的资源。
/// </summary>
/// <param name="performGCCollect">是否使用垃圾回收。</param>
public void ForceUnloadUnusedAssets(bool performGCCollect);
/// <summary>
/// 检查资源是否存在。
/// </summary>
/// <param name="assetName">要检查资源的名称。</param>
/// <returns>检查资源是否存在的结果。</returns>
public HasAssetResult HasAsset(string assetName);
/// 同步加载资源。
/// </summary>
/// <param name="assetName">要加载资源的名称。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns>
T LoadAsset<T>(string assetName) where T : Object;
/// <summary>
/// 同步加载资源。
/// </summary>
/// <param name="assetName">要加载资源的名称。</param>
/// <param name="parent">父节点位置。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns>
T LoadAsset<T>(string assetName, Transform parent) where T :Object;
/// <summary>
/// 同步加载资源。
/// </summary>
/// <param name="handle">资源操作句柄。</param>
/// <param name="assetName">要加载资源的名称。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns>
T LoadAsset<T>(string assetName,out AssetOperationHandle handle) where T : Object;
/// <summary>
/// 同步加载资源。
/// </summary>
/// <param name="assetName">要加载资源的名称。</param>
/// <param name="handle">资源操作句柄。</param>
/// <param name="parent">父节点位置。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns>
T LoadAsset<T>(string assetName, Transform parent,out AssetOperationHandle handle) where T :Object;
/// <summary>
/// 异步加载资源。
/// </summary>
/// <param name="assetName">要加载资源的名称。</param>
/// <param name="cancellationToken">取消操作Token。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>异步资源实例。</returns>
UniTask<T> LoadAssetAsync<T>(string assetName,CancellationToken cancellationToken) where T : Object;
/// <summary>
/// 异步加载游戏物体。
/// </summary>
/// <param name="assetName">要加载的游戏物体名称。</param>
/// <param name="cancellationToken">取消操作Token。</param>
/// <returns>异步游戏物体实例。</returns>
UniTask<UnityEngine.GameObject> LoadGameObjectAsync(string assetName,CancellationToken cancellationToken);
/// <summary>
/// 同步加载资源并获取句柄。
/// </summary>
/// <param name="assetName">要加载资源的名称。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>同步加载资源句柄。</returns>
AssetOperationHandle LoadAssetGetOperation<T>(string assetName) where T : Object;
/// <summary>
/// 异步加载资源并获取句柄。
/// </summary>
/// <param name="assetName">要加载资源的名称。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>异步加载资源句柄。</returns>
AssetOperationHandle LoadAssetAsyncHandle<T>(string assetName) where T : Object;
/// <summary>
/// 同步加载子资源对象
/// </summary>
/// <typeparam name="TObject">资源类型</typeparam>
/// <param name="location">资源的定位地址</param>
public SubAssetsOperationHandle LoadSubAssetsSync<TObject>(string location) where TObject : UnityEngine.Object;
/// <summary>
/// 异步加载子资源对象
/// </summary>
/// <typeparam name="TObject">资源类型</typeparam>
/// <param name="location">资源的定位地址</param>
public SubAssetsOperationHandle LoadSubAssetsAsync<TObject>(string location) where TObject : UnityEngine.Object;
/// <summary>
/// 同步加载子资源对象
/// </summary>
/// <param name="assetInfo">资源信息。</param>
public SubAssetsOperationHandle LoadSubAssetsSync(AssetInfo assetInfo);
/// <summary>
/// 异步加载场景。
/// </summary>
/// <param name="location">场景的定位地址</param>
/// <param name="sceneMode">场景加载模式</param>
/// <param name="activateOnLoad">加载完毕时是否主动激活</param>
/// <param name="priority">优先级</param>
/// <returns>异步加载场景句柄。</returns>
SceneOperationHandle LoadSceneAsync(string location, LoadSceneMode sceneMode = LoadSceneMode.Single, bool activateOnLoad = true, int priority = 100);
/// <summary>
/// 异步加载场景
/// </summary>
/// <param name="assetInfo">场景的资源信息</param>
/// <param name="sceneMode">场景加载模式</param>
/// <param name="activateOnLoad">加载完毕时是否主动激活</param>
/// <param name="priority">优先级</param>
/// <returns>异步加载场景句柄。</returns>
SceneOperationHandle LoadSceneAsync(AssetInfo assetInfo, LoadSceneMode sceneMode = LoadSceneMode.Single, bool activateOnLoad = true, int priority = 100);
```

View File

@@ -1,69 +0,0 @@
# 3-2.事件模块 - GameEvent
高效且无GC的事件系统GameEvent可以指定事件ID/事件String监听和分发事件。通过事件来驱动模块如战斗的角色身上的事件流、UI和网络以及Model的数据流、开发中的绝大部分情况都可以通过事件来进行驱动。(配合UI模块或者拓展的战斗模块实现MVE[Model - View - Event]事件驱动架构)
事件模块支持string和int作为事件Id但推荐是使用int因为可以避免事件字典的哈希碰撞。这里实现了StringId.StringToHash的方法来定义事件ID达到事件系统的最佳性能。
<strong>UI模块的事件和UI生命周期存在绑定销毁UI时可以自动移除UI所监听的事件,开发过程中只需要关心添加事件避免了关闭UI但没有移除事件监听的问题角色模块也可以参考实现。(AddUIEvent)</strong>
``` csharp
public static readonly int Hellp = StringId.StringToHash("Hellp.Hellp");
class A
{
public A()
{
//添加事件监听string
GameEvent.AddEventListener("TEngine很好用",TodoSomeThings);
//添加事件监听int 事件ID
GameEvent.AddEventListener(Hellp,TodoSomeThings2);
}
}
class B
{
private void SaySomeThings()
{
//发送事件流
GameEvent.Send("TEngine很好用");
GameEvent.Send(Hellp);
}
}
【举个例子游戏中血量扣除的时候服务器发来了一个减少Hp的消息包
我们可以在收到这个消息包的时候发送一个事件流在玩家头顶的HP进度
条组件/左上角Hp的UI血条组件添加一个监听事件各个模块负责自己监听后的逻辑】
Server -> SendMessage(ReduceHP)
class ClientHandle
{
private void HandleMessage(MainPack mainpack)
{
...
HpPack hpPack = mainpack.hpPack;
int playerId = mainpack.playerId;
var player = PlayerMgr.Instance.GetPlayer(playerId);
if(player != null){
player.Event.Send("Hpchange",hpPack); //局部的事件管理器
GameEvent.Send("Hpchange",hpPack); //全局事件中心
}
}
}
class PlayerHp
{
public ECSEventCmpt Event { get; set; }
PlayerHp(){
Event.AddEventListener<HpPack>(Hellp,HandleUpChange);
}
}
[Window(UILayer.UI)]
class BattleMainUI: UIWindow
{
public override void RegisterEvent()
{
AddUIEvent<HpPack>(Hellp,HandleUpChange);
}
public void HandleUpChange(HpPack pack){}
}
```

View File

@@ -1,23 +0,0 @@
# 3-3.内存池模块 - MemoryPool
内存池更为轻量化,相对于对象池更适合一些更抽象碎片化的内存对象。
Scene窗口MemoryPool对象可以设置内存池检查防止回收问题与内存泄漏问题。
![image](src/3-3-1.png)
使用案例
``` csharp
/// <summary>
/// 资源组数据。
/// <remarks>DisposeGroup。</remarks>
/// </summary>
public class AssetGroup : IMemory
{
public void Clear(){}
}
//内存池中获取/生成内存对象。
AssetGroup assetGroup = MemoryPool.Acquire<AssetGroup>();
//释放内存对象还给内存池。
MemoryPool.Release(assetGroup);
```

View File

@@ -1,64 +0,0 @@
# 3-4.对象池模块 - ObjectModule
对象池较中量级,在客户端开发中是一个经常使用的技术,技术点我相信大家都懂,这里不过多讨论。
使用案例
``` csharp
/// <summary>
/// Actor对象。
/// </summary>
public class Actor : ObjectBase
{
/// <summary>
/// 释放对象。
/// </summary>
/// <param name="isShutdown">是否是关闭对象池时触发。</param>
protected override void Release(bool isShutdown){}
/// <summary>
/// 创建Actor对象。
/// </summary>
/// <param name="actorName">对象名称。</param>
/// <param name="target">对象持有实例。</param>
/// <returns></returns>
public static Actor Create(string name, object target)
{
var actor = MemoryPool.Acquire<Actor>();
actor.Initialize(name, target);
return actor;
}
}
/// <summary>
/// Actor对象池。
/// </summary>
private IObjectPool<Actor> _actorPool;
void Start()
{
//创建允许单次获取的对象池。
_actorPool = GameModule.ObjectPool.CreateSingleSpawnObjectPool<Actor>(Utility.Text.Format("Actor Instance Pool ({0})", name));
}
/// <summary>
/// 创建Actor对象。
/// </summary>
/// <param name="actorName">对象名称。</param>
/// <param name="target">对象持有实例。</param>
/// <returns>Actor对象实例</returns>
public Actor CreateActor(string actorName, GameObject target)
{
Actor ret = null;
if (_actorPool.CanSpawn())
{
ret = _actorPool.Spawn();
}
else
{
ret = Actor.Create(actorName, target);
_actorPool.Register(ret,true);
}
return ret;
}
```

View File

@@ -1,126 +0,0 @@
# 3-5.UI模块 - UIModule
一个游戏70%都是UI剩下30%才是GamePlay所以有一套简洁强大的商业化UI模块以及UI开发工作流将是项目的一大利器能够提高至少一倍的开发效率。(配合事件模块实现MVE[Model - View - Event]事件驱动架构)
UI脚本为纯C#实现脱离Mono的生命周期由UIModule的帧更新驱动并管理UI的生命周期。
IUIBehaviour为UI通用行为接口、UIBase为UI基类、UIWindow为UI窗口基类UIWidget为UI组件基类。
## 前期配置:
注意m_item节点为特殊节点表示是UI下的UIWidget组件不会继续往下遍历生成UI代码。若需要这个UIWidget组件m_item的代码则在m_item右键生成这个组件的UI脚本。
Scene窗口下右键ScriptGenerator菜单下About目录有默认UI命名前缀规范。
![image](src/3-5-1.png)
有自定义需求可以在TEngineSetting下进行自定义。
![image](src/3-5-2.png)
### 开发工作流:
1.遵守前期默认配置或者自定义配置进行UI编排
![image](src/3-5-3.png)
2.在UI的根节点右键ScriptGenerator生成UI代码到剪贴板上注-使用-UniTask的生成代码可以做异步事件流驱动的UI。
![image](src/3-5-4.png)
3.自行创建UI脚本到需要的目录下并复制UI脚本。
## 举例示范
``` csharp
// 同步打开面板
GameModule.UI.ShowUI<GameMainUI>([nullable]userData);
// 异步打开面板
GameModule.UI.ShowUIAsync<GameMainUI>([nullable]userData);
namespace GameLogic
{
/// <summary>
/// BattleMainUI面板
/// <remarks>UIWindow需要以下特性UILayer可以自行定义fullScreen表示为全屏面板会停止和隐藏这个面板堆栈后面的面板。</remarks>
/// </summary>
[Window(UILayer.Bottom,fullScreen:true)]
class BattleMainUI : UIWindow
{
private TouchMove m_touchView;
#region 脚本工具生成的代码
private RectTransform m_rectContainer;
private GameObject m_itemTouch;
private Button m_btnLeaveBattle;
private GameObject m_goTopInfo;
private Button m_btnPause;
public override void ScriptGenerator()
{
m_rectContainer = FindChildComponent<RectTransform>("m_rectContainer");
m_itemTouch = FindChild("m_rectContainer/m_itemTouch").gameObject;
m_btnLeaveBattle = FindChildComponent<Button>("m_btnLeaveBattle");
m_goTopInfo = FindChild("m_goTopInfo").gameObject;
m_btnPause = FindChildComponent<Button>("m_goTopInfo/m_btnPause");
m_btnLeaveBattle.onClick.AddListener(OnClickLeaveBattleBtn);
m_btnPause.onClick.AddListener(OnClickPauseBtn);
}
#endregion
#region 事件
private void OnClickPauseBtn()
{
BattleSys.Instance.Pause = !BattleSys.Instance.Pause;
}
private void OnClickLeaveBattleBtn()
{
BattleSys.Instance.StopBattle(isBattleEnd:false,isWin:false);
}
#endregion
//注册事件举例
public override void RegisterEvent()
{
//通过AddUIEvent这样注册事件会把事件的生命周期绑定给面板面板销毁的时候自动移除监听。
AddUIEvent(ActorLogicEventDefined.OnMainPlayerBagDataChange, RefreshUI);
}
public override void BindMemberProperty()
{
//特殊的m_item节点的域不属于父级UIWindows所以如注意所说需要同样创建这个UIWidget的脚本并生成代码过去。 可以如下创建或者走type、path创建。
m_touchView = CreateWidget<TouchMove>(m_itemTouch);
}
......
}
}
namespace GameLogic
{
/// <summary>
/// 移动操作UIWidget。
/// </summary>
class TouchMove : UIWidget, IUICtrlMove
{
public override void BindMemberProperty()
{
}
//注意Update只有在重写了此方法才会驱动这个Widget或者面板的Update。
public override void OnUpdate()
{
TProfiler.BeginSample("CheckMoveTouchFinger");
CheckMoveTouchFinger();
TProfiler.EndSample();
TProfiler.BeginSample("UpdateTouchMovePos");
UpdateTouchMovePos();
TProfiler.EndSample();
TProfiler.BeginSample("UpdateKeyMove");
UpdateKeyMove();
TProfiler.EndSample();
}
......
}
}
```
## UI进阶
UI面板需要标记UIWindowAttribute以标识层级(可以自行定义)和是否全屏。全屏面板则会把下层面板的Visible设置为false。
![image](src/3-5-5.png)

View File

@@ -1,55 +0,0 @@
# 3-6.配置表模块 - ConfigLoader
接入最佳游戏配置解决方案 - <a href="https://github.com/focus-creative-games/luban"><strong>Luban</strong></a>
<a href="https://luban.doc.code-philosophy.com/#/manual/traits"><strong>Luban文档 </strong></a>
### 在TEngine中Luban工具集位于以下目录
![image](src/3-6-1.png)
TEngine内置默认使用懒加载配置也支持基于UniTask的异步加载同步加载包括服务器的Task异步加载使用对应转表的bat即可。
### 介绍
luban是你的最佳游戏配置解决方案。
luban高效地处理游戏开发中常见的excel、json、xml之类的数据检查数据错误生成c#等各种语言的代码导出成bytes或json等多种格式。
luban统一了游戏配置开发工作流极大提升了策划和程序的工作效率。
核心特性
强大的数据解析和转换能力 {excel(csv,xls,xlsx)、json、bson、xml、yaml、lua、unity ScriptableObject} => {binary、json、bson、xml、lua、yaml、erlang、 custom format}
增强的excel格式可以简洁地配置出像简单列表、子结构、结构列表以及任意复杂的深层次的嵌套结构。
完备的类型系统支持OOP类型继承搭配excel、json、lua、xml等格式数据灵活优雅表达行为树、技能、剧情、副本之类复杂GamePlay数据
支持生成c#、java、go、c++、lua、python、javascript、typescript、erlang、rust、gdscript 代码
支持生成 protobuf(schema + binary + json)、flatbuffers(schema + json)、msgpack(binary)
强大的数据校验能力。ref引用检查、path资源路径、range范围检查等等
完善的本地化支持。静态文本值本地化、动态文本值本地化、时间本地化、main-patch多地区版本
强大灵活的自定义能力,支持自定义代码模板和数据模板
通用型生成和缓存工具。也可以用于生成协议、数据库之类的代码,甚至可以用作对象缓存服务。
---
使用案例
``` csharp
/// <summary>
/// 道具配置表管理器。
/// </summary>
public class ItemConfigMgr: Singleton<ItemConfigMgr>
{
/// <summary>
/// 道具Table。
/// </summary>
private TbItem TbItem => ConfigLoader.Instance.Tables.TbItem;
/// <summary>
/// 获取道具配置表。
/// </summary>
/// <param name="itemId">道具Id。</param>
/// <returns>道具配置表。</returns>
public ItemConfig GetItemConfig(int itemId)
{
TbItem.DataMap.TryGetValue(itemId, out var config);
return config;
}
}
```

View File

@@ -1,24 +0,0 @@
# 7.流程模块 - ProcedureModule
### ProcedureLaunch - 流程启动
### ProcedureSplash - 流程闪屏
### ProcedureInitPackage - 流程初始化Package
### ProcedureInitResources - 流程初始化Resources
### ProcedureUpdateVersion - 流程更新版本Version
### ProcedureUpdateManifest - 流程更新Mainfest清单
### ProcedureCreateDownloader - 流程创建下载器
### ProcedureDownloadFile - 流程下载文件
### ProcedureDownloadOver - 流程下载文件结束
### ProcedureClearCache - 流程清理缓存
### ProcedureLoadAssembly - 流程加载进入热更新程序集

View File

@@ -1,2 +0,0 @@
# 8.网络模块 - Network
待补充

View File

@@ -1,16 +0,0 @@
# TEngine各平台下运行
### 日志记录编辑器下运行
![image](src/Editor-RunSuccessed.png)
---
### Win64位包运行
![image](src/Win64-RunSuccessed.png)
---
### 安卓真机运行
![image](src/Android-RunSuccessed.png)
### IOS真机运行
![image](src/Iphone-RunSuccessed.png)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 222 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 181 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 315 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 236 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 302 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 308 KiB

View File

@@ -1,49 +0,0 @@
using Luban;
using GameBase;
using GameConfig;
using TEngine;
using UnityEngine;
/// <summary>
/// 配置加载器。
/// </summary>
public class ConfigSystem : Singleton<ConfigSystem>
{
private bool _init = false;
private Tables _tables;
public Tables Tables
{
get
{
if (!_init)
{
Load();
}
return _tables;
}
}
/// <summary>
/// 加载配置。
/// </summary>
public void Load()
{
_tables = new Tables(LoadByteBuf);
_init = true;
}
/// <summary>
/// 加载二进制配置。
/// </summary>
/// <param name="file">FileName</param>
/// <returns>ByteBuf</returns>
private ByteBuf LoadByteBuf(string file)
{
var textAssets = GameModule.Resource.LoadAsset<TextAsset>(file);
byte[] ret = textAssets.bytes;
return new ByteBuf(ret);
}
}

View File

@@ -1,55 +0,0 @@
using Luban;
{{namespace_with_grace_begin __namespace}}
public partial class {{__name}}
{
#region The Tables
{{~for table in __tables ~}}
{{~if table.comment != '' ~}}
/// <summary>
/// {{escape_comment table.comment}}
/// </summary>
{{~end~}}
private {{table.full_name}} m_{{table.name}};
public {{table.full_name}} {{format_property_name __code_style table.name}}
{
get
{
if (m_{{table.name}} == null)
{
m_{{table.name}} = new {{table.full_name}}(defaultLoader("{{table.output_data_file}}"));
m_{{table.name}}.ResolveRef(this);
}
return m_{{table.name}};
}
set
{
m_{{table.name}} = value;
m_{{table.name}}.ResolveRef(this);
}
}
{{~end~}}
#endregion
System.Func<string, ByteBuf> defaultLoader;
public {{__name}}(System.Func<string, ByteBuf> loader)
{
SetDefaultLoader(loader);
Init();
}
public void SetDefaultLoader(System.Func<string, ByteBuf> loader)
{
defaultLoader = null;
defaultLoader = loader;
}
//public partial void Init();
public void Init(){}
}
{{namespace_with_grace_end __namespace}}

Binary file not shown.

View File

@@ -1,17 +0,0 @@
<module name="">
<bean name="vector2" valueType="1" sep=",">
<var name="x" type="float"/>
<var name="y" type="float"/>
</bean>
<bean name="vector3" valueType="1" sep=",">
<var name="x" type="float"/>
<var name="y" type="float"/>
<var name="z" type="float"/>
</bean>
<bean name="vector4" valueType="1" sep=",">
<var name="x" type="float"/>
<var name="y" type="float"/>
<var name="z" type="float"/>
<var name="w" type="float"/>
</bean>
</module>

View File

@@ -1,17 +0,0 @@
set WORKSPACE=../..
set LUBAN_DLL=%WORKSPACE%\Tools\Luban\Luban.dll
set CONF_ROOT=.
set DATA_OUTPATH=%WORKSPACE%/UnityProject/Assets/AssetRaw/Configs/bytes/
set CODE_OUTPATH=%WORKSPACE%/UnityProject/Assets/GameScripts/HotFix/GameProto/GameConfig/
xcopy /s /e /i /y "%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%
pause

View File

@@ -1,18 +0,0 @@
set WORKSPACE=../..
set LUBAN_DLL=%WORKSPACE%\Tools\Luban\Luban.dll
set CONF_ROOT=.
set DATA_OUTPATH=%WORKSPACE%/UnityProject/Assets/AssetRaw/Configs/bytes/
set CODE_OUTPATH=%WORKSPACE%/UnityProject/Assets/GameScripts/HotFix/GameProto/GameConfig/
xcopy /s /e /i /y "%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%
pause

View File

@@ -1,15 +0,0 @@
set WORKSPACE=../../
set LUBAN_DLL=%WORKSPACE%/Tools/Luban/Luban.dll
set CONF_ROOT=.
set DATA_OUTPATH=%WORKSPACE%/Server/GameConfig
set 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%
pause

View File

@@ -1,22 +0,0 @@
{
"groups":
[
{"names":["c"], "default":true},
{"names":["s"], "default":true},
{"names":["e"], "default":true}
],
"schemaFiles":
[
{"fileName":"Defines", "type":""},
{"fileName":"Datas/__tables__.xlsx", "type":"table"},
{"fileName":"Datas/__beans__.xlsx", "type":"bean"},
{"fileName":"Datas/__enums__.xlsx", "type":"enum"}
],
"dataDir": "Datas",
"targets":
[
{"name":"server", "manager":"Tables", "groups":["s"], "topModule":"GameConfig"},
{"name":"client", "manager":"Tables", "groups":["c"], "topModule":"GameConfig"},
{"name":"all", "manager":"Tables", "groups":["c,s,e"], "topModule":"GameConfig"}
]
}

View File

@@ -100,6 +100,3 @@ Assets
#### <a href="https://github.com/focus-creative-games/hybridclr"><strong>HybridCLR</strong></a> - 特性完整、零成本、高性能、低内存的近乎完美的Unity全平台原生c#热更方案
#### <a href="https://github.com/qq362946/Fantasy"><strong>Fantasy</strong></a> - Fantasy是一套源于ETServer但极为简洁性能更强更好上手的一套商业级服务器框架。
## <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>

View File

@@ -1,8 +0,0 @@
node_modules
*.swap
.idea
.DS_Store
*.log
.vscode
*-lock.json
AssetsRoot

View File

@@ -1,42 +0,0 @@
## 使用node搭建静态资源服务器
### 安装
```bash
npm install yumu-static-server -g
```
### 使用
```bash
server # 会在当前目录下启动一个静态资源服务器默认端口为8080
server -p[port] 3000 # 会在当前目录下启动一个静态资源服务器端口为3000
server -i[index] index.html # 设置文件夹在默认加载的文件
server -c[charset] UTF-8 # 设置文件默认加载的字符编码
server -cors # 开启文件跨域
server -h[https] # 开启https服务
server --openindex # 是否打开默认页面
server --no-openbrowser # 关闭自动打开浏览器
```
### 基本功能
1. 启动静态资源服务器
2. 端口可配置
3. 字符编码可配置
4. 文件夹下默认加载文件可配置
5. 是否跨域可配置
6. 开启https服务
### TODO
- [x] 引入handlerbars编译模板
- [x] 支持文件是否跨域
- [x] 支持https服务

View File

@@ -1,26 +0,0 @@
const StaticServer = require('../src/static-server');
const options = require('yargs')
.option('p', { alias: 'port', describe: '设置服务启动的端口号', type: 'number' })
.option('i', { alias: 'index', describe: '设置默认打开的主页', type: 'string' })
.option('c', { alias: 'charset', describe: '设置文件的默认字符集', type: 'string' })
.option('o', { alias: 'openindex', describe: '是否打开默认页面', type: 'boolean' })
.option('h', { alias: 'https', describe: '是否启用https服务', type: 'boolean' })
.option('cors', { describe: '是否开启文件跨域', type: 'boolean' })
.option('openbrowser', { describe: '是否默认打开浏览器', type: 'boolean' })
// 默认参数
.default('openbrowser', true)
// .default('https', true)
.default('port', 8080)
.default('index', 'index.html')
.default('openindex', 'index.html')
.default('charset', 'UTF-8')
.help()
.alias('?', 'help')
.argv;
const server = new StaticServer(options);
server.start();

View File

@@ -1,3 +0,0 @@
#!/usr/bin/env node
module.exports = require('./bin/app.js');

View File

@@ -1 +0,0 @@
npm install yumu-static-server -g

View File

@@ -1,30 +0,0 @@
{
"name": "static-server",
"version": "0.0.1",
"description": "使用node搭建静态资源服务器",
"main": "index.js",
"scripts": {
"dev": "supervisor bin/app.js",
"start": "npm run dev"
},
"bin": {
"server": "index.js"
},
"author": "Alex",
"license": "ISC",
"keywords": [
"static-server",
"server"
],
"dependencies": {
"chalk": "^2.3.2",
"handlebars": "^4.0.11",
"mime": "^2.2.0",
"open": "^7.1.0",
"pem": "^1.12.5",
"yargs": "^6.6.0"
},
"devDependencies": {
"supervisor": "^0.12.0"
}
}

View File

@@ -1,12 +0,0 @@
const path = require('path');
const mime = require('mime');
const lookup = (pathName) => {
let ext = path.extname(pathName);
ext = ext.split('.').pop();
return mime.getType(ext) || mime.getType('txt');
}
module.exports = {
lookup
};

View File

@@ -1,334 +0,0 @@
const http = require('http');
const https = require('https');
const path = require('path');
const fs = require('fs');
const url = require('url');
const zlib = require('zlib');
const chalk = require('chalk');
const os = require('os');
const open = require("open");
const Handlebars = require('handlebars');
const pem = require('pem');
const mime = require('./mime');
const Template = require('./templates');
const _defaultTemplate = Handlebars.compile(Template.page_dafault);
const _404TempLate = Handlebars.compile(Template.page_404);
const hasTrailingSlash = url => url[url.length - 1] === '/';
const ifaces = os.networkInterfaces();
class StaticServer {
constructor(options) {
this.port = options.port;
this.indexPage = options.index;
this.openIndexPage = options.openindex;
this.openBrowser = options.openbrowser;
this.charset = options.charset;
this.cors = options.cors;
this.protocal = options.https ? 'https' : 'http';
this.zipMatch = '^\\.(css|js|html)$';
}
/**
* 响应错误
*
* @param {*} err
* @param {*} res
* @returns
* @memberof StaticServer
*/
respondError(err, res) {
res.writeHead(500);
return res.end(err);
}
/**
* 响应404
*
* @param {*} req
* @param {*} res
* @memberof StaticServer
*/
respondNotFound(req, res) {
res.writeHead(404, {
'Content-Type': 'text/html'
});
const html = _404TempLate();
res.end(html);
}
respond(pathName, req, res) {
fs.stat(pathName, (err, stat) => {
if (err) return respondError(err, res);
this.responseFile(stat, pathName, req, res);
});
}
/**
* 判断是否需要解压
*
* @param {*} pathName
* @returns
* @memberof StaticServer
*/
shouldCompress(pathName) {
return path.extname(pathName).match(this.zipMatch);
}
/**
* 解压文件
*
* @param {*} readStream
* @param {*} req
* @param {*} res
* @returns
* @memberof StaticServer
*/
compressHandler(readStream, req, res) {
const acceptEncoding = req.headers['accept-encoding'];
if (!acceptEncoding || !acceptEncoding.match(/\b(gzip|deflate)\b/)) {
return readStream;
} else if (acceptEncoding.match(/\bgzip\b/)) {
res.setHeader('Content-Encoding', 'gzip');
return readStream.pipe(zlib.createGzip());
}
}
/**
* 响应文件路径
*
* @param {*} stat
* @param {*} pathName
* @param {*} req
* @param {*} res
* @memberof StaticServer
*/
responseFile(stat, pathName, req, res) {
// 设置响应头
res.setHeader('Content-Type', `${mime.lookup(pathName)}; charset=${this.charset}`);
res.setHeader('Accept-Ranges', 'bytes');
// 添加跨域
if (this.cors) res.setHeader('Access-Control-Allow-Origin', '*');
let readStream;
readStream = fs.createReadStream(pathName);
if (this.shouldCompress(pathName)) { // 判断是否需要解压
readStream = this.compressHandler(readStream, req, res);
}
readStream.pipe(res);
}
/**
* 响应重定向
*
* @param {*} req
* @param {*} res
* @memberof StaticServer
*/
respondRedirect(req, res) {
const location = req.url + '/';
res.writeHead(301, {
'Location': location,
'Content-Type': 'text/html'
});
const html = _defaultTemplate({
htmlStr: `Redirecting to <a href='${location}'>${location}</a>`,
showFileList: false
})
res.end(html);
}
/**
* 响应文件夹路径
*
* @param {*} pathName
* @param {*} req
* @param {*} res
* @memberof StaticServer
*/
respondDirectory(pathName, req, res) {
const indexPagePath = path.join(pathName, this.indexPage);
// 如果文件夹下存在index.html则默认打开
if (this.openIndexPage && fs.existsSync(indexPagePath)) {
this.respond(indexPagePath, req, res);
} else {
fs.readdir(pathName, (err, files) => {
if (err) {
respondError(err, res);
}
const requestPath = url.parse(req.url).pathname;
const fileList = [];
files.forEach(fileName => {
let itemLink = path.join(requestPath, fileName);
let isDirectory = false;
const stat = fs.statSync(path.join(pathName, fileName));
if (stat && stat.isDirectory()) {
itemLink = path.join(itemLink, '/');
isDirectory = true;
}
fileList.push({
link: itemLink,
name: fileName,
isDirectory
});
});
// 排序,目录在前,文件在后
fileList.sort((prev, next) => {
if (prev.isDirectory && !next.isDirectory) {
return -1;
}
return 1;
});
res.writeHead(200, {
'Content-Type': 'text/html'
});
const html = _defaultTemplate({
requestPath,
fileList,
showFileList: true
})
res.end(html);
});
}
}
/**
* 路由处理
*
* @param {*} pathName
* @param {*} req
* @param {*} res
* @memberof StaticServer
*/
routeHandler(pathName, req, res) {
const realPathName = pathName.split('?')[0];
fs.stat(realPathName, (err, stat) => {
this.logGetInfo(err, pathName);
if (!err) {
const requestedPath = url.parse(req.url).pathname;
// 检查url
// 如果末尾有'/',且是文件夹,则读取文件夹
// 如果是文件夹,但末尾没'/',则重定向至'xxx/'
// 如果是文件,则判断是否是压缩文件,是则解压,不是则读取文件
if (hasTrailingSlash(requestedPath) && stat.isDirectory()) {
this.respondDirectory(realPathName, req, res);
} else if (stat.isDirectory()) {
this.respondRedirect(req, res);
} else {
this.respond(realPathName, req, res);
}
} else {
this.respondNotFound(req, res);
}
});
}
/**
* 打印ip地址
*
* @memberof StaticServer
*/
logUsingPort() {
const me = this;
console.log(`${chalk.yellow(`Starting up your server\nAvailable on:`)}`);
Object.keys(ifaces).forEach(function (dev) {
ifaces[dev].forEach(function (details) {
if (details.family === 'IPv4') {
console.log(` ${me.protocal}://${details.address}:${chalk.green(me.port)}`);
}
});
});
console.log(`${chalk.cyan(Array(50).fill('-').join(''))}`);
}
/**
* 打印占用端口
*
* @param {*} oldPort
* @param {*} port
* @memberof StaticServer
*/
logUsedPort(oldPort, port) {
const me = this;
console.log(`${chalk.red(`The port ${oldPort} is being used, change to port `)}${chalk.green(me.port)} `);
}
/**
* 打印https证书友好提示
*
* @memberof StaticServer
*/
logHttpsTrusted() {
console.log(chalk.green('Currently is using HTTPS certificate (Manually trust it if necessary)'));
}
/**
* 打印路由路径输出
*
* @param {*} isError
* @param {*} pathName
* @memberof StaticServer
*/
logGetInfo(isError, pathName) {
if (isError) {
console.log(chalk.red(`404 ${pathName}`));
} else {
console.log(chalk.cyan(`200 ${pathName}`));
}
}
startServer(keys) {
const me = this;
let isPostBeUsed = false;
const oldPort = me.port;
const protocal = me.protocal === 'https' ? https : http;
const options = me.protocal === 'https' ? { key: keys.serviceKey, cert: keys.certificate } : null;
const callback = (req, res) => {
const pathName = path.join(process.cwd(), path.normalize(decodeURI(req.url)));
me.routeHandler(pathName, req, res);
};
const params = [callback];
if (me.protocal === 'https') params.unshift(options);
const server = protocal.createServer(...params).listen(me.port);
server.on('listening', function () { // 执行这块代码说明端口未被占用
if (isPostBeUsed) {
me.logUsedPort(oldPort, me.port);
}
me.logUsingPort();
if (me.openBrowser) {
open(`${me.protocal}://127.0.0.1:${me.port}`);
}
});
server.on('error', function (err) {
if (err.code === 'EADDRINUSE') { // 端口已经被使用
isPostBeUsed = true;
me.port = parseInt(me.port) + 1;
server.listen(me.port);
} else {
console.log(err);
}
})
}
start() {
const me = this;
if (this.protocal === 'https') {
pem.createCertificate({ days: 1, selfSigned: true }, function (err, keys) {
if (err) {
throw err
}
me.logHttpsTrusted();
me.startServer(keys);
})
} else {
me.startServer();
}
}
}
module.exports = StaticServer;

View File

@@ -1,44 +0,0 @@
module.exports = `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta http-equiv="X-UA-Compatible" content="ie=edge"/>
<title>node静态服务器</title>
<style>
.not-found-content {
display: flex;
justify-content: center;
min-height: 500px;
align-items: center;
}
.not-found-content .img-notfound {
margin-right: 50px;
}
.not-found-content h3 {
color: #333;
font-size: 24px;
margin: 20px 0;
font-weight: 400;
line-height: 24px;
}
.not-found-content p {
color: #666;
font-size: 16px;
line-height: 20px;
margin-bottom: 7px;
}
</style>
</head>
<body>
<div class="not-found-content">
<img src="https://img.alicdn.com/tfs/TB1txw7bNrI8KJjy0FpXXb5hVXa-260-260.png" class="img-notfound" alt="not found">
<div class="prompt">
<h3>抱歉,你访问的路径不存在</h3>
<p>您要找的页面没有找到,请返回<a class="link-font" href="/">首页</a>继续浏览</p>
</div>
</div>
</body>
</html>
`

View File

@@ -1,93 +0,0 @@
module.exports = `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>node静态服务器</title>
<style>
html, body, ul, li, p{
padding: 0;
margin: 0;
}
html, body {
padding: 0;
margin: 0;
width: 100%;
height: 100%;
}
.app {
padding: 20px 50px 0;
min-height: calc(100% - 70px);
overflow: hidden;
color: #333;
}
.directory li {
list-style: circle;
margin-left: 20px;
}
.directory li p {
line-height: 1.7;
margin: 14px 0;
}
.directory li p a{
color: #333;
font-weight: 400;
text-decoration: none;
}
.directory li p span{
color: #3dcccc;
}
.directory li p a:hover {
color: red;
}
.footer {
text-align: center;
height: 50px;
font-size: 12px;
}
.footer span {
display: block;
line-height: 24px;
}
.footer .bold {
font-weight: 600;
}
.footer a {
color: #333;
}
.footer a:hover {
color: red;
}
</style>
</head>
<body>
<div class="app">
<h3>当前目录:<span>{{requestPath}}</span></h3>
{{#if showFileList}}
<ul class="directory">
{{#each fileList}}
<li>
<p>
{{#if isDirectory }}
<span>「目录」</span>
{{else}}
<span>「文件」</span>
{{/if}}
<a href='{{link}}'>{{name}}</a>
</p>
</li>
{{/each}}
</ul>
{{else}}
{{htmlStr}}
{{/if}}
</div>
<div class="footer">
<span>Github地址: <a target="_blank" href="https://github.com/WisestCoder/static-server">https://github.com/WisestCoder/static-server</a></span>
<span class="bold">By <a target="_blank" href="https://github.com/WisestCoder">WisestCoder</a></span>
</div>
</body>
</html>
`;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -1,7 +0,0 @@
const page_dafault = require('./default');
const page_404 = require('./404');
module.exports = {
page_dafault,
page_404
};

View File

@@ -1 +0,0 @@
server -p 8081 -cors

View File

@@ -1 +0,0 @@
使用luban-next, 请前往Tools/build-luban编译或者自行导入

View File

@@ -1,5 +0,0 @@
rd /s /q Luban
dotnet build ../../luban/src/Luban/Luban.csproj -c Release -o Luban
pause

View File

@@ -1,5 +0,0 @@
#!/bin/bash
[ -d Luban ] && rm -rf Luban
dotnet build ../../luban/src/Luban/Luban.csproj -c Release -o Luban

View File

@@ -0,0 +1,52 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!612988286 &4096168566840163508
SpriteAtlasAsset:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: UIRaw_Atlas_Battle
m_MasterAtlas: {fileID: 0}
m_ImporterData:
serializedVersion: 2
textureSettings:
serializedVersion: 2
anisoLevel: 0
compressionQuality: 0
maxTextureSize: 0
textureCompression: 0
filterMode: 1
generateMipMaps: 0
readable: 0
crunchedCompression: 0
sRGB: 1
platformSettings:
- serializedVersion: 3
m_BuildTarget: iPhone
m_MaxTextureSize: 2048
m_ResizeAlgorithm: 0
m_TextureFormat: 49
m_TextureCompression: 1
m_CompressionQuality: 100
m_CrunchedCompression: 0
m_AllowsAlphaSplitting: 0
m_Overridden: 1
m_AndroidETC2FallbackOverride: 0
m_ForceMaximumCompressionQuality_BC6H_BC7: 0
packingSettings:
serializedVersion: 2
padding: 2
blockOffset: 1
allowAlphaSplitting: 0
enableRotation: 1
enableTightPacking: 0
enableAlphaDilation: 0
secondaryTextureSettings: {}
variantMultiplier: 1
packables:
- {fileID: 21300000, guid: b76b8b216adf64f4bbdb78f7977f0310, type: 3}
bindAsDefault: 1
isAtlasV2: 1
cachedData: {fileID: 0}
m_IsVariant: 0

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 736bc06e2873e08418fef3194a34eeaf
SpriteAtlasImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,59 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!612988286 &4096168566840163508
SpriteAtlasAsset:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: UIRaw_Atlas_arrows
m_MasterAtlas: {fileID: 0}
m_ImporterData:
serializedVersion: 2
textureSettings:
serializedVersion: 2
anisoLevel: 0
compressionQuality: 0
maxTextureSize: 0
textureCompression: 0
filterMode: 1
generateMipMaps: 0
readable: 0
crunchedCompression: 0
sRGB: 1
platformSettings:
- serializedVersion: 3
m_BuildTarget: iPhone
m_MaxTextureSize: 2048
m_ResizeAlgorithm: 0
m_TextureFormat: 49
m_TextureCompression: 1
m_CompressionQuality: 100
m_CrunchedCompression: 0
m_AllowsAlphaSplitting: 0
m_Overridden: 1
m_AndroidETC2FallbackOverride: 0
m_ForceMaximumCompressionQuality_BC6H_BC7: 0
packingSettings:
serializedVersion: 2
padding: 2
blockOffset: 1
allowAlphaSplitting: 0
enableRotation: 1
enableTightPacking: 0
enableAlphaDilation: 0
secondaryTextureSettings: {}
variantMultiplier: 1
packables:
- {fileID: 21300000, guid: 9871e4d5e19cea6419d057b79ce1a1a8, type: 3}
- {fileID: 21300000, guid: b1e9e5e05f0067f469e748e46985c269, type: 3}
- {fileID: 21300000, guid: 6d7b5d72581e8ca48b333e83a25d1514, type: 3}
- {fileID: 21300000, guid: e05004e4bcd8b3e49bb0cbaab0215760, type: 3}
- {fileID: 21300000, guid: a9ef9e2f50f97a84bbd269b5f7cc5ea4, type: 3}
- {fileID: 21300000, guid: 5d663ef25d3d5514a8d099e72353244b, type: 3}
- {fileID: 21300000, guid: e9b8cd94ede145942a15f9e164af30a9, type: 3}
- {fileID: 21300000, guid: 36909c7c187739945aecb80f7c59fa4c, type: 3}
bindAsDefault: 1
isAtlasV2: 1
cachedData: {fileID: 0}
m_IsVariant: 0

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 30b2151baa80324468b12076c6025e5c
SpriteAtlasImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,55 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!612988286 &4096168566840163508
SpriteAtlasAsset:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: UIRaw_Atlas_bars
m_MasterAtlas: {fileID: 0}
m_ImporterData:
serializedVersion: 2
textureSettings:
serializedVersion: 2
anisoLevel: 0
compressionQuality: 0
maxTextureSize: 0
textureCompression: 0
filterMode: 1
generateMipMaps: 0
readable: 0
crunchedCompression: 0
sRGB: 1
platformSettings:
- serializedVersion: 3
m_BuildTarget: iPhone
m_MaxTextureSize: 2048
m_ResizeAlgorithm: 0
m_TextureFormat: 49
m_TextureCompression: 1
m_CompressionQuality: 100
m_CrunchedCompression: 0
m_AllowsAlphaSplitting: 0
m_Overridden: 1
m_AndroidETC2FallbackOverride: 0
m_ForceMaximumCompressionQuality_BC6H_BC7: 0
packingSettings:
serializedVersion: 2
padding: 2
blockOffset: 1
allowAlphaSplitting: 0
enableRotation: 1
enableTightPacking: 0
enableAlphaDilation: 0
secondaryTextureSettings: {}
variantMultiplier: 1
packables:
- {fileID: 21300000, guid: ba523fd85bea1e448944fe8cabed4b59, type: 3}
- {fileID: 21300000, guid: 20960a9e1f7b68c4f80d5078f5964057, type: 3}
- {fileID: 21300000, guid: be40ff228ca528248b495d5025a1e327, type: 3}
- {fileID: 21300000, guid: fcabe002e685bc147918c97e9538d17f, type: 3}
bindAsDefault: 1
isAtlasV2: 1
cachedData: {fileID: 0}
m_IsVariant: 0

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 7180c75b26a0aa046b5743fbddb78c45
SpriteAtlasImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,57 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!612988286 &4096168566840163508
SpriteAtlasAsset:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: UIRaw_Atlas_buttons
m_MasterAtlas: {fileID: 0}
m_ImporterData:
serializedVersion: 2
textureSettings:
serializedVersion: 2
anisoLevel: 0
compressionQuality: 0
maxTextureSize: 0
textureCompression: 0
filterMode: 1
generateMipMaps: 0
readable: 0
crunchedCompression: 0
sRGB: 1
platformSettings:
- serializedVersion: 3
m_BuildTarget: iPhone
m_MaxTextureSize: 2048
m_ResizeAlgorithm: 0
m_TextureFormat: 49
m_TextureCompression: 1
m_CompressionQuality: 100
m_CrunchedCompression: 0
m_AllowsAlphaSplitting: 0
m_Overridden: 1
m_AndroidETC2FallbackOverride: 0
m_ForceMaximumCompressionQuality_BC6H_BC7: 0
packingSettings:
serializedVersion: 2
padding: 2
blockOffset: 1
allowAlphaSplitting: 0
enableRotation: 1
enableTightPacking: 0
enableAlphaDilation: 0
secondaryTextureSettings: {}
variantMultiplier: 1
packables:
- {fileID: 21300000, guid: fcab35236e33438448805a9211b0cc19, type: 3}
- {fileID: 21300000, guid: 8a6f536f4b2392f40afb62df609f6e40, type: 3}
- {fileID: 21300000, guid: 67c34bb955c72e6419b7528e10e73c53, type: 3}
- {fileID: 21300000, guid: 03cbfa7fbded80a479f24add4a997757, type: 3}
- {fileID: 21300000, guid: 379c45e0c5ba5e54e8df03f52e4c7680, type: 3}
- {fileID: 21300000, guid: 3b8db7241fc8ff54e9dea6fc64cfd7e5, type: 3}
bindAsDefault: 1
isAtlasV2: 1
cachedData: {fileID: 0}
m_IsVariant: 0

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: d6c291e122fdd1b4f8338aa5a955cc67
SpriteAtlasImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,53 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!612988286 &4096168566840163508
SpriteAtlasAsset:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: UIRaw_Atlas_window
m_MasterAtlas: {fileID: 0}
m_ImporterData:
serializedVersion: 2
textureSettings:
serializedVersion: 2
anisoLevel: 0
compressionQuality: 0
maxTextureSize: 0
textureCompression: 0
filterMode: 1
generateMipMaps: 0
readable: 0
crunchedCompression: 0
sRGB: 1
platformSettings:
- serializedVersion: 3
m_BuildTarget: iPhone
m_MaxTextureSize: 2048
m_ResizeAlgorithm: 0
m_TextureFormat: 49
m_TextureCompression: 1
m_CompressionQuality: 100
m_CrunchedCompression: 0
m_AllowsAlphaSplitting: 0
m_Overridden: 1
m_AndroidETC2FallbackOverride: 0
m_ForceMaximumCompressionQuality_BC6H_BC7: 0
packingSettings:
serializedVersion: 2
padding: 2
blockOffset: 1
allowAlphaSplitting: 0
enableRotation: 1
enableTightPacking: 0
enableAlphaDilation: 0
secondaryTextureSettings: {}
variantMultiplier: 1
packables:
- {fileID: 21300000, guid: 06edc4e02f9c48647adfed0a778cb8aa, type: 3}
- {fileID: 21300000, guid: 78e3daf76621d66448e594d6993adbd8, type: 3}
bindAsDefault: 1
isAtlasV2: 1
cachedData: {fileID: 0}
m_IsVariant: 0

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: acf10131b937dab4c86d63939aecd2ab
SpriteAtlasImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

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

View File

@@ -0,0 +1,29 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_Name: fx_bolt_cyan_mat
m_Shader: {fileID: 10720, guid: 0000000000000000f000000000000000, type: 0}
m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _MainTex:
m_Texture: {fileID: 2800000, guid: 6e3730451fa077346abd4ac642ea71d8, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Floats:
- _InvFade: 1
m_Colors:
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _TintColor: {r: 0.5, g: 0.5, b: 0.5, a: 0.5}

View File

@@ -0,0 +1,6 @@
fileFormatVersion: 2
guid: 63fe6ff9ab9e1433f8db4ebd940f2442
NativeFormatImporter:
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,29 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_Name: fx_bolt_orange_mat
m_Shader: {fileID: 10720, guid: 0000000000000000f000000000000000, type: 0}
m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _MainTex:
m_Texture: {fileID: 2800000, guid: fd3cbf51780694849b9b019b36a3938e, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Floats:
- _InvFade: 1
m_Colors:
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _TintColor: {r: 0.5, g: 0.5, b: 0.5, a: 0.5}

View File

@@ -0,0 +1,6 @@
fileFormatVersion: 2
guid: 8e27380ee68aa4a219b4db9018e7da31
NativeFormatImporter:
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,29 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_Name: fx_enemyShip_engines_mat
m_Shader: {fileID: 10720, guid: 0000000000000000f000000000000000, type: 0}
m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _MainTex:
m_Texture: {fileID: 2800000, guid: eabb37cb6d738b443b398b701a64cd88, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Floats:
- _InvFade: 1
m_Colors:
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _TintColor: {r: 0.5, g: 0.5, b: 0.5, a: 0.5}

View File

@@ -0,0 +1,6 @@
fileFormatVersion: 2
guid: 1b4bad6cea5a94611b21f9757fe41444
NativeFormatImporter:
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,53 @@
fileFormatVersion: 2
guid: 6e3730451fa077346abd4ac642ea71d8
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 2
mipmaps:
mipMapMode: 0
enableMipMap: 1
linearTexture: 0
correctGamma: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: .25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 0
cubemapConvolution: 0
cubemapConvolutionSteps: 8
cubemapConvolutionExponent: 1.5
seamlessCubemap: 0
textureFormat: -1
maxTextureSize: 128
textureSettings:
filterMode: 1
aniso: 0
mipBias: -1
wrapMode: 1
nPOTScale: 1
lightmap: 0
rGBM: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: .5, y: .5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaIsTransparency: 0
textureType: -1
buildTargetSettings: []
spriteSheet:
sprites: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,53 @@
fileFormatVersion: 2
guid: fd3cbf51780694849b9b019b36a3938e
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 2
mipmaps:
mipMapMode: 0
enableMipMap: 1
linearTexture: 0
correctGamma: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: .25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 0
cubemapConvolution: 0
cubemapConvolutionSteps: 8
cubemapConvolutionExponent: 1.5
seamlessCubemap: 0
textureFormat: -1
maxTextureSize: 128
textureSettings:
filterMode: 1
aniso: 0
mipBias: -1
wrapMode: 1
nPOTScale: 1
lightmap: 0
rGBM: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: .5, y: .5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaIsTransparency: 0
textureType: -1
buildTargetSettings: []
spriteSheet:
sprites: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,39 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_Name: part_blast_mat
m_Shader: {fileID: 200, guid: 0000000000000000f000000000000000, type: 0}
m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _DecalTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 2800000, guid: 3e504a46a8fcec34db3c4776530c6eb2, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _Mask:
m_Texture: {fileID: 2800000, guid: fe79948256c8b8e44a175b9ec97c6f07, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Floats:
- _InvFade: 1
- _ScrollSpeed: 10
m_Colors:
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmisColor: {r: 0.2, g: 0.2, b: 0.2, a: 0}
- _TintColor: {r: 1, g: 1, b: 1, a: 0.49803922}

View File

@@ -0,0 +1,6 @@
fileFormatVersion: 2
guid: 1cfe02ffd0b74854ea5bcd1a3c63ac3c
NativeFormatImporter:
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,53 @@
fileFormatVersion: 2
guid: eabb37cb6d738b443b398b701a64cd88
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 2
mipmaps:
mipMapMode: 0
enableMipMap: 1
linearTexture: 0
correctGamma: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: .25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 0
cubemapConvolution: 0
cubemapConvolutionSteps: 8
cubemapConvolutionExponent: 1.5
seamlessCubemap: 0
textureFormat: -1
maxTextureSize: 128
textureSettings:
filterMode: 1
aniso: 0
mipBias: -1
wrapMode: 1
nPOTScale: 1
lightmap: 0
rGBM: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: .5, y: .5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaIsTransparency: 0
textureType: -1
buildTargetSettings: []
spriteSheet:
sprites: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -0,0 +1,53 @@
fileFormatVersion: 2
guid: 3e504a46a8fcec34db3c4776530c6eb2
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 2
mipmaps:
mipMapMode: 0
enableMipMap: 1
linearTexture: 0
correctGamma: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: .25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 0
cubemapConvolution: 0
cubemapConvolutionSteps: 8
cubemapConvolutionExponent: 1.5
seamlessCubemap: 0
textureFormat: -1
maxTextureSize: 128
textureSettings:
filterMode: 1
aniso: 0
mipBias: -1
wrapMode: 1
nPOTScale: 1
lightmap: 0
rGBM: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: .5, y: .5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaIsTransparency: 0
textureType: -1
buildTargetSettings: []
spriteSheet:
sprites: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,29 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_Name: part_glow_mat
m_Shader: {fileID: 200, guid: 0000000000000000f000000000000000, type: 0}
m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _MainTex:
m_Texture: {fileID: 10300, guid: 0000000000000000f000000000000000, type: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Floats:
- _InvFade: 1
m_Colors:
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _TintColor: {r: 0.82089555, g: 0.82089555, b: 0.82089555, a: 0.5019608}

View File

@@ -0,0 +1,6 @@
fileFormatVersion: 2
guid: 0ed73dc47f4cb38489020d05e9f02c99
NativeFormatImporter:
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,53 @@
fileFormatVersion: 2
guid: 0963e6c65b2b1f74d9f455e21901e2dc
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 2
mipmaps:
mipMapMode: 0
enableMipMap: 1
linearTexture: 0
correctGamma: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: .25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 0
cubemapConvolution: 0
cubemapConvolutionSteps: 8
cubemapConvolutionExponent: 1.5
seamlessCubemap: 0
textureFormat: -1
maxTextureSize: 128
textureSettings:
filterMode: 1
aniso: 0
mipBias: -1
wrapMode: 1
nPOTScale: 1
lightmap: 0
rGBM: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: .5, y: .5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaIsTransparency: 0
textureType: -1
buildTargetSettings: []
spriteSheet:
sprites: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,29 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_Name: part_jet_core_mat
m_Shader: {fileID: 10720, guid: 0000000000000000f000000000000000, type: 0}
m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _MainTex:
m_Texture: {fileID: 2800000, guid: 0963e6c65b2b1f74d9f455e21901e2dc, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Floats:
- _InvFade: 1
m_Colors:
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _TintColor: {r: 0.5, g: 0.5, b: 0.5, a: 0.5}

View File

@@ -0,0 +1,6 @@
fileFormatVersion: 2
guid: c58c9afddbd36d14d837fa218d772996
NativeFormatImporter:
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,53 @@
fileFormatVersion: 2
guid: 2cb5eef4d7d7bf6459dd13a3f8d90246
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 2
mipmaps:
mipMapMode: 0
enableMipMap: 1
linearTexture: 0
correctGamma: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: .25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 0
cubemapConvolution: 0
cubemapConvolutionSteps: 8
cubemapConvolutionExponent: 1.5
seamlessCubemap: 0
textureFormat: -1
maxTextureSize: 128
textureSettings:
filterMode: 1
aniso: 0
mipBias: -1
wrapMode: 1
nPOTScale: 1
lightmap: 0
rGBM: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: .5, y: .5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaIsTransparency: 0
textureType: -1
buildTargetSettings: []
spriteSheet:
sprites: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,29 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_Name: part_jet_flare_mat
m_Shader: {fileID: 200, guid: 0000000000000000f000000000000000, type: 0}
m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _MainTex:
m_Texture: {fileID: 2800000, guid: 2cb5eef4d7d7bf6459dd13a3f8d90246, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Floats:
- _InvFade: 0.46607143
m_Colors:
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _TintColor: {r: 0.17647058, g: 0.17647058, b: 0.17647058, a: 0.5019608}

View File

@@ -0,0 +1,6 @@
fileFormatVersion: 2
guid: a7b030cffa2dc44478c14e49a22771c2
NativeFormatImporter:
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,53 @@
fileFormatVersion: 2
guid: 04dbc0581071c254ea6564b2ff06ff9b
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 2
mipmaps:
mipMapMode: 0
enableMipMap: 1
linearTexture: 0
correctGamma: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: .25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 0
cubemapConvolution: 0
cubemapConvolutionSteps: 8
cubemapConvolutionExponent: 1.5
seamlessCubemap: 0
textureFormat: -1
maxTextureSize: 128
textureSettings:
filterMode: 1
aniso: 0
mipBias: -1
wrapMode: 1
nPOTScale: 1
lightmap: 0
rGBM: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: .5, y: .5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaIsTransparency: 0
textureType: -1
buildTargetSettings: []
spriteSheet:
sprites: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,29 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_Name: part_shockwave_mat
m_Shader: {fileID: 10720, guid: 0000000000000000f000000000000000, type: 0}
m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _MainTex:
m_Texture: {fileID: 2800000, guid: 04dbc0581071c254ea6564b2ff06ff9b, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Floats:
- _InvFade: 1
m_Colors:
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _TintColor: {r: 1, g: 1, b: 1, a: 0.5019608}

View File

@@ -0,0 +1,6 @@
fileFormatVersion: 2
guid: 1d46a17a95a444c08830612bc1146d1d
NativeFormatImporter:
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,37 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_Name: part_spark_blue_mat
m_Shader: {fileID: 200, guid: 0000000000000000f000000000000000, type: 0}
m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DecalTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 2800000, guid: 1478894bc9a1ed241b05b0862a7b8bce, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Floats:
- _InvFade: 1
m_Colors:
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _TintColor: {r: 0.4742647, g: 0.79153156, b: 0.9485294, a: 0.5019608}

View File

@@ -0,0 +1,6 @@
fileFormatVersion: 2
guid: b0c7cf51d3fecb446ab93bf854419715
NativeFormatImporter:
userData:
assetBundleName:
assetBundleVariant:

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