|
|
|
@ -5,8 +5,10 @@
@@ -5,8 +5,10 @@
|
|
|
|
|
# 引言 |
|
|
|
|
|
|
|
|
|
> `EGFramework`全称Everyone's Godot framework,基于`Godot`开源引擎,使用C#编写,目前仅兼容`Godot4.3 - .NET`,部分兼容`Godot3.5 - .NET`,是完全开源的组件式,功能分布的框架,使用时可以自己根据需求安装对应的`Module`来实现对应的功能,同样也可以裁剪对应的`Module`来删减对应的功能。 |
|
|
|
|
> |
|
|
|
|
> `Module` 是`EGFramework`的核心组成部分,也是`EGFramework`中重要的扩展依据。详细可以查看第二部分-Module。 |
|
|
|
|
> |
|
|
|
|
> `Module` 是`EGFramework`的核心组成部分,也是`EGFramework`中重要的扩展依据。 |
|
|
|
|
> |
|
|
|
|
> 目前该框架可能还有很多欠缺与不足,最终目的是做一个方便可靠好用的通讯&存储&资源生成&界面生成框架、用户无需过多学习、开箱即用。 |
|
|
|
|
|
|
|
|
|
# 关于Godot引擎(摘自[Godot Engine (4.x) 简体中文文档](https://docs.godotengine.org/zh-cn/4.x/about/introduction.html)) |
|
|
|
|
|
|
|
|
@ -20,7 +22,7 @@
@@ -20,7 +22,7 @@
|
|
|
|
|
|
|
|
|
|
## 1.下载开发环境 |
|
|
|
|
|
|
|
|
|
本章节所有环境均在开源IDE `VSCode`,`Godot4.2 - .NET` 的环境下进行,请确保已经下载好`VSCode`,`Godot4.2 - .NET`,如果您有购买Rider或者其他编码工具可以根据自己的喜好来替代VSCode。 |
|
|
|
|
本章节所有环境均在开源IDE `VSCode`,`Godot4.3 - .NET` 的环境下进行,请确保已经下载好`VSCode`,`Godot4.3 - .NET`,<b>本项目Godot版本可能并非最新</b>,但作者会尽可能的升级至最新版的Godot,在此之间请按照如下方式进行框架的集成工作,如果您有购买Rider或者其他编码工具可以根据自己的喜好来替代VSCode。 |
|
|
|
|
|
|
|
|
|
## 2.VSCode 插件安装 |
|
|
|
|
|
|
|
|
@ -30,15 +32,29 @@
@@ -30,15 +32,29 @@
|
|
|
|
|
|
|
|
|
|
## 3.Nuget包的安装 |
|
|
|
|
|
|
|
|
|
打开VSCode,按下`Ctrl+Shift+P`,在搜索栏里面搜索`Nuget Package ManagerGUI`,选择右侧`Install New Pakage` ,依次安装以下依赖包: |
|
|
|
|
|
|
|
|
|
- System.IO.Ports(仅EGSerialPort 使用) |
|
|
|
|
|
|
|
|
|
- Newtonsoft.Json(使用场合较多) |
|
|
|
|
打开VSCode,将如下部分替换或增加至您名称为*.csproj后缀的工程文件下。 |
|
|
|
|
|
|
|
|
|
- Microsoft.Data.Sqlite(仅EGSQLite使用) |
|
|
|
|
```xml |
|
|
|
|
<ItemGroup> |
|
|
|
|
<PackageReference Include="System.IO.Ports" Version="8.0.0" /> |
|
|
|
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> |
|
|
|
|
<PackageReference Include="Microsoft.Data.Sqlite" Version="8.0.1" /> |
|
|
|
|
<PackageReference Include="System.Text.Encoding.CodePages" Version="8.0.0" /> |
|
|
|
|
<PackageReference Include="WebDav.Client" Version="2.8.0" /> |
|
|
|
|
<PackageReference Include="MQTTnet" Version="4.3.3.952" /> |
|
|
|
|
<PackageReference Include="Makaretu.Dns.Multicast" Version="0.27.0" /> |
|
|
|
|
<PackageReference Include="Microsoft.Extensions.Configuration.Ini" Version="8.0.0" /> |
|
|
|
|
<PackageReference Include="LiteDB" Version="5.0.21" /> |
|
|
|
|
<PackageReference Include="BACnet" Version="2.0.4" /> |
|
|
|
|
<PackageReference Include="MySql.Data" Version="9.1.0" /> |
|
|
|
|
<PackageReference Include="Dapper" Version="2.1.35" /> |
|
|
|
|
<PackageReference Include="SSH.NET" Version="2024.2.0" /> |
|
|
|
|
<PackageReference Include="StackExchange.Redis" Version="2.8.31" /> |
|
|
|
|
<PackageReference Include="FluentFTP" Version="52.1.0" /> |
|
|
|
|
</ItemGroup> |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
- System.Text.Encoding.CodePages(ProtocolTools目录下均有使用) |
|
|
|
|
首次编译确保计算机可以联网,并可以连接该网站[NuGet Gallery | Home](https://www.nuget.org/) |
|
|
|
|
|
|
|
|
|
注意:这些Nuget包仅为目前框架版本所用,后续可能会有新的Nuget包导入,会在此处列出。 |
|
|
|
|
|
|
|
|
@ -48,88 +64,74 @@
@@ -48,88 +64,74 @@
|
|
|
|
|
|
|
|
|
|
无需担心,除了部分Module存在相关依赖,大部分Module是支持直接删除的。 |
|
|
|
|
|
|
|
|
|
## 5.EG插件库简介 |
|
|
|
|
## 5.EGFramework构成一栏 |
|
|
|
|
|
|
|
|
|
目前已有的EGFramework功能组件。标记是目前已编写完成,未标记是未编写完成或未测试。 |
|
|
|
|
|
|
|
|
|
### 5.1 EGSave篇 |
|
|
|
|
- [x] ProtocolTools&ProtocolExtension |
|
|
|
|
- [x] SaveTools |
|
|
|
|
- [x] OtherTools |
|
|
|
|
- [x] Extension |
|
|
|
|
- [x] NodeExtension(仅Godot下可用) |
|
|
|
|
- [ ] GenerateTools |
|
|
|
|
- [ ] UITools |
|
|
|
|
|
|
|
|
|
### 5.1 消息篇(EGMessage-ProtocolTools) |
|
|
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
|
|
#### Sqlite数据持久化扩展: |
|
|
|
|
#### 通讯支持 |
|
|
|
|
|
|
|
|
|
注意:本功能需要依赖安装 `Microsoft.Data.Sqlite` Nuget扩展,将以下代码放入*.csproj 工程文件中,或者通过Nuget安装上述包。 |
|
|
|
|
- [x] TCPClient |
|
|
|
|
- [x] TCPServer |
|
|
|
|
- [x] UDP(Listen&Send) |
|
|
|
|
- [x] SerialPort |
|
|
|
|
- [x] Ssh |
|
|
|
|
- [x] WebSocketClient |
|
|
|
|
- [x] Bacnet |
|
|
|
|
- [x] MQTT |
|
|
|
|
- [ ] HttpClient |
|
|
|
|
- [ ] HttpServer |
|
|
|
|
|
|
|
|
|
```xml |
|
|
|
|
<PackageReference Include="Microsoft.Data.Sqlite" Version="8.0.1" /> |
|
|
|
|
``` |
|
|
|
|
#### 异步处理支持 |
|
|
|
|
|
|
|
|
|
使用案例(保存数据=>保存单一数据,目前来看该功能仍需改进): |
|
|
|
|
- [x] FileStream |
|
|
|
|
- [x] Process |
|
|
|
|
|
|
|
|
|
```csharp |
|
|
|
|
public partial class EGSaveTest : Node,IEGFramework |
|
|
|
|
{ |
|
|
|
|
public override void _Ready() |
|
|
|
|
{ |
|
|
|
|
TestSqlite(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void TestSqlite(){ |
|
|
|
|
// string result = this.EGSqlite().CreateTable<SqliteBackpackItem>(); |
|
|
|
|
this.EGSqlite().SaveData(new SqliteBackpackItem{ |
|
|
|
|
ItemID = 10, |
|
|
|
|
ItemCount = 1, |
|
|
|
|
BackpackID = 1, |
|
|
|
|
}); |
|
|
|
|
GD.Print(this.EGSqlite().ExceptionMsg); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
public struct SqliteBackpackItem{ |
|
|
|
|
public int ItemID; |
|
|
|
|
public int ItemCount; |
|
|
|
|
public int BackpackID; |
|
|
|
|
} |
|
|
|
|
``` |
|
|
|
|
### 5.2 存储篇(EGMessage-ProtocolTools) |
|
|
|
|
|
|
|
|
|
结构类要求:保存字段不能使用 {get;set;},所有数据会自动生成自增序列的ID,字段名称不能为ID。 |
|
|
|
|
#### 键值对象存储支持 |
|
|
|
|
|
|
|
|
|
# 二、框架简介 |
|
|
|
|
- [x] Json |
|
|
|
|
- [x] Redis |
|
|
|
|
- [ ] Byte |
|
|
|
|
|
|
|
|
|
由于该框架使用了较多的Nuget包实现相关的功能,所以安装较为繁琐,同时因为用到较多的扩展方法,提示词可能比较冗余。您可以通过删除对应的Module来定制化自己的框架,也可以新增自己的Module来扩展自己的框架。 |
|
|
|
|
#### 数据存储支持 |
|
|
|
|
|
|
|
|
|
本框架所使用的一切Nuget包均满足MIT开源协议,如果使用的Nuget包牵扯有其他协议请联系作者QQ:1031139173,会删除对应的Module功能保证该框架满足MIT协议。 |
|
|
|
|
- [x] Csv |
|
|
|
|
- [x] LiteDB |
|
|
|
|
- [x] MySQL(Dapper) |
|
|
|
|
- [x] Sqlite(Dapper) |
|
|
|
|
- [x] Dapper |
|
|
|
|
|
|
|
|
|
协议文件均存放在目录addons\EGFramework\License_Third_Part下面 |
|
|
|
|
#### 文件存储支持 |
|
|
|
|
|
|
|
|
|
## 1.使用框架 |
|
|
|
|
- [x] FTP |
|
|
|
|
- [x] LocalFile |
|
|
|
|
- [ ] Sftp |
|
|
|
|
- [ ] WebDav |
|
|
|
|
|
|
|
|
|
添加using,并继承接口IEGFramework,即可使用该框架了。 |
|
|
|
|
# 二、框架简介 |
|
|
|
|
|
|
|
|
|
以下以一个EGSave的例子,来展示一下框架的存档功能,其他详细用法可以参阅查看Manual-EGSave对应的部分。 |
|
|
|
|
由于该框架使用了较多的Nuget包实现相关的功能,所以安装较为繁琐,同时因为用到较多的扩展方法,提示词可能比较冗余。您可以通过删除对应的Module来定制化自己的框架,也可以新增自己的Module来扩展自己的框架。 |
|
|
|
|
|
|
|
|
|
```csharp |
|
|
|
|
using Godot; |
|
|
|
|
using static Godot.GD; |
|
|
|
|
using System.Collections.Generic; |
|
|
|
|
using EGFramework; |
|
|
|
|
如果使用的Nuget包牵扯有侵犯您的许可,请联系作者Mail:1031139173@qq.com,作者尽可能第一时间删除对应的Module功能。 |
|
|
|
|
|
|
|
|
|
public partial class EGTest : Node,IEGFramework{ |
|
|
|
|
DataTest dataTest = this.EGSave().GetDataByFile<DataTest>(); |
|
|
|
|
if (dataTest == null) |
|
|
|
|
{ |
|
|
|
|
dataTest = new DataTest(); |
|
|
|
|
dataTest.PlayerName = "Player1"; |
|
|
|
|
dataTest.Hp = 100; |
|
|
|
|
this.EGSave().SetDataToFile(dataTest); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
public class DataTest{ |
|
|
|
|
public string PlayerName; |
|
|
|
|
public int Hp; |
|
|
|
|
} |
|
|
|
|
``` |
|
|
|
|
第三方许可文件均存放在目录addons\EGFramework\License_Third_Part下面 |
|
|
|
|
|
|
|
|
|
## 2.直接使用Module |
|
|
|
|
## 1.使用框架 |
|
|
|
|
|
|
|
|
|
继承接口IEGFramework时,可以直接通过this.GetModule这个扩展方法直接获取该模块。上面的代码可以通过直接调用的方式改写成如下: |
|
|
|
|
添加using,并继承接口IEGFramework,即可使用该框架了。 |
|
|
|
|
|
|
|
|
|
```csharp |
|
|
|
|
using Godot; |
|
|
|
@ -138,14 +140,7 @@ using System.Collections.Generic;
@@ -138,14 +140,7 @@ using System.Collections.Generic;
|
|
|
|
|
using EGFramework; |
|
|
|
|
|
|
|
|
|
public partial class EGTest : Node,IEGFramework{ |
|
|
|
|
DataTest dataTest = this.GetModule<EGSave>().GetDataByFile<DataTest>(); |
|
|
|
|
if (dataTest == null) |
|
|
|
|
{ |
|
|
|
|
dataTest = new DataTest(); |
|
|
|
|
dataTest.PlayerName = "Player1"; |
|
|
|
|
dataTest.Hp = 100; |
|
|
|
|
this.GetModule<EGSave>().SetDataToFile(dataTest); |
|
|
|
|
} |
|
|
|
|
this.EGSave(); |
|
|
|
|
} |
|
|
|
|
public class DataTest{ |
|
|
|
|
public string PlayerName; |
|
|
|
@ -153,80 +148,4 @@ public class DataTest{
@@ -153,80 +148,4 @@ public class DataTest{
|
|
|
|
|
} |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
## 3.扩展框架(编写Module) |
|
|
|
|
|
|
|
|
|
编写框架时,要用到IModule这个接口,任何继承了该接口的类均视为Module,可以被上面的方法Get到。 |
|
|
|
|
|
|
|
|
|
同时我们提供了一个简单的实现接口的抽象类EGModule,继承该类等同于实现接口IModule。 |
|
|
|
|
|
|
|
|
|
注意的是,因为C#仅支持单继承,如果您需要继承其他工具类或者是Godot的对应类,您应该使用接口而不是抽象类,具体用法可以参考ProtocolTools.EGProtocolSchedule这个类,它通过一个Node的生命周期的_Process()方法实现了特定线程中的消息拾取到主线程的功能。 |
|
|
|
|
|
|
|
|
|
一个简单的单例对象扩展可以写成如下: |
|
|
|
|
|
|
|
|
|
```csharp |
|
|
|
|
using System; |
|
|
|
|
using System.Collections.Generic; |
|
|
|
|
|
|
|
|
|
namespace EGFramework |
|
|
|
|
{ |
|
|
|
|
public interface IEGObject |
|
|
|
|
{ |
|
|
|
|
void RegisterObject<T>(T object_); |
|
|
|
|
T GetObject<T>() where T : class,new(); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
public class EGObject : EGModule,IEGObject |
|
|
|
|
{ |
|
|
|
|
private IOCContainer ObjectContainer = new IOCContainer(); |
|
|
|
|
public override void Init() |
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public TObject GetObject<TObject>() where TObject : class,new() |
|
|
|
|
{ |
|
|
|
|
if (!ObjectContainer.self.ContainsKey(typeof(TObject))) |
|
|
|
|
{ |
|
|
|
|
this.RegisterObject(new TObject()); |
|
|
|
|
} |
|
|
|
|
return ObjectContainer.Get<TObject>(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void RegisterObject<TObject>(TObject object_) |
|
|
|
|
{ |
|
|
|
|
ObjectContainer.Register(object_); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public bool ContainsObject<TObject>(){ |
|
|
|
|
return ObjectContainer.self.ContainsKey(typeof(TObject)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public static class CanGetObjectExtension |
|
|
|
|
{ |
|
|
|
|
public static T EGGetObject<T>(this IEGFramework self) where T : class,new() |
|
|
|
|
{ |
|
|
|
|
return EGArchitectureImplement.Interface.GetModule<EGObject>().GetObject<T>(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
public static class CanRegisterObjectExtension |
|
|
|
|
{ |
|
|
|
|
public static void EGRegisterObject<T>(this IArchitecture self,T object_) where T : class,new() |
|
|
|
|
{ |
|
|
|
|
self.GetModule<EGObject>().RegisterObject(object_); |
|
|
|
|
} |
|
|
|
|
public static void EGRegisterObject<T>(this IEGFramework self,T object_) where T : class,new() |
|
|
|
|
{ |
|
|
|
|
EGArchitectureImplement.Interface.GetModule<EGObject>().RegisterObject(object_); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public static class CanContainsObjectExtension{ |
|
|
|
|
public static bool EGContainsObject<T>(this IEGFramework self) |
|
|
|
|
{ |
|
|
|
|
return EGArchitectureImplement.Interface.GetModule<EGObject>().ContainsObject<T>(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
``` |
|
|
|
|