Browse Source

add sqlite test code

master
jkpete 2 months ago
parent
commit
670d07b391
  1. 17
      Example/SystemExamples/ItemList/ItemList.CSV.import
  2. 3
      Example/SystemExamples/ItemList/ItemList.json
  3. 5
      Example/SystemExamples/ItemList/ItemList.txt
  4. 6
      Example/UsingTest/Scene/TestEGFramework.tscn
  5. 30
      Example/UsingTest/Script/EGSaveTest.cs
  6. 66
      ReadMe.md
  7. 2
      addons/EGFramework/Module/SQL/EGSqlite.cs
  8. 15
      addons/EGFramework/Module/SaveTools/EGTable.cs
  9. 2
      project.godot

17
Example/SystemExamples/ItemList/ItemList.CSV.import

@ -0,0 +1,17 @@
[remap]
importer="csv_translation"
type="Translation"
uid="uid://dhb625wmjnlwy"
[deps]
files=["res://Example/SystemExamples/ItemList/ItemList.en.translation", "res://Example/SystemExamples/ItemList/ItemList.es.translation", "res://Example/SystemExamples/ItemList/ItemList.ja.translation"]
source_file="res://Example/SystemExamples/ItemList/ItemList.CSV"
dest_files=["res://Example/SystemExamples/ItemList/ItemList.en.translation", "res://Example/SystemExamples/ItemList/ItemList.es.translation", "res://Example/SystemExamples/ItemList/ItemList.ja.translation"]
[params]
compress=true
delimiter=0

3
Example/SystemExamples/ItemList/ItemList.json

@ -0,0 +1,3 @@
{
}

5
Example/SystemExamples/ItemList/ItemList.txt

@ -0,0 +1,5 @@
keys,en,es,ja
GREET,"Hello, friend!","Hola, amigo!",こんにちは
ASK,How are you?,Cómo está?,元気ですか
BYE,Goodbye,Adiós,さようなら
QUOTE,"""Hello"" said the man.","""Hola"" dijo el hombre.",「こんにちは」男は言いました

6
Example/UsingTest/Scene/TestEGFramework.tscn

@ -1,6 +1,6 @@
[gd_scene load_steps=2 format=3 uid="uid://dfa86yq8m28rk"] [gd_scene load_steps=2 format=3 uid="uid://dfa86yq8m28rk"]
[ext_resource type="Script" path="res://Example/UsingTest/Script/EGTest.cs" id="1_s8hm3"] [ext_resource type="Script" path="res://Example/UsingTest/Script/EGSaveTest.cs" id="1_eij2h"]
[node name="TestEgFramework" type="Control"] [node name="TestEgFramework" type="Control"]
layout_mode = 3 layout_mode = 3
@ -9,7 +9,7 @@ anchor_right = 1.0
anchor_bottom = 1.0 anchor_bottom = 1.0
grow_horizontal = 2 grow_horizontal = 2
grow_vertical = 2 grow_vertical = 2
script = ExtResource("1_s8hm3") script = ExtResource("1_eij2h")
[node name="Timer" type="Timer" parent="."] [node name="Timer" type="Timer" parent="."]
autostart = true autostart = true
@ -23,5 +23,3 @@ offset_bottom = 164.0
layout_mode = 0 layout_mode = 0
offset_right = 50.0 offset_right = 50.0
offset_bottom = 50.0 offset_bottom = 50.0
[connection signal="pressed" from="Button1" to="." method="OnButton1Click"]

30
Example/UsingTest/Script/EGSaveTest.cs

@ -0,0 +1,30 @@
using Godot;
using System;
namespace EGFramework.Examples.Test{
public partial class EGSaveTest : Node,IEGFramework
{
public override void _Ready()
{
base._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);
// var properties = typeof(SqliteBackpackItem).GetFields();
// Godot.GD.Print(properties.Count() + " Readed ");
}
}
public struct SqliteBackpackItem{
public int ItemID;
public int ItemCount;
public int BackpackID;
}
}

66
ReadMe.md

@ -16,26 +16,18 @@
> >
> Godot 在 [宽松的 MIT 许可证](https://docs.godotengine.org/zh-cn/4.x/about/complying_with_licenses.html#doc-complying-with-licenses) 下完全自由且开源,没有附加条件、没有抽成、什么都没有。用户的游戏乃至引擎的每一行代码,都归用户自己所有。Godot 的开发完全独立且由社区驱动,允许用户为满足需求重塑引擎。它受到不以盈利为目标的 [Godot 基金会](https://godot.foundation/)支持。 > Godot 在 [宽松的 MIT 许可证](https://docs.godotengine.org/zh-cn/4.x/about/complying_with_licenses.html#doc-complying-with-licenses) 下完全自由且开源,没有附加条件、没有抽成、什么都没有。用户的游戏乃至引擎的每一行代码,都归用户自己所有。Godot 的开发完全独立且由社区驱动,允许用户为满足需求重塑引擎。它受到不以盈利为目标的 [Godot 基金会](https://godot.foundation/)支持。
# 一、准备工作 # 一、准备工作
## 1.下载开发环境 ## 1.下载开发环境
本章节所有环境均在开源IDE `VSCode`,`Godot4.2 - .NET` 的环境下进行,请确保已经下载好`VSCode`,`Godot4.2 - .NET`,如果您有购买Rider或者其他编码工具可以根据自己的喜好来替代VSCode。 本章节所有环境均在开源IDE `VSCode`,`Godot4.2 - .NET` 的环境下进行,请确保已经下载好`VSCode`,`Godot4.2 - .NET`,如果您有购买Rider或者其他编码工具可以根据自己的喜好来替代VSCode。
## 2.VSCode 插件安装 ## 2.VSCode 插件安装
打开VSCode, 按下`Ctrl+Shift+X`,在搜索栏里面搜索`C# Tools for Godot`,安装该插件,因为该插件可能依赖于`C#`插件,同时需要安装`C#`插件。 打开VSCode, 按下`Ctrl+Shift+X`,在搜索栏里面搜索`C# Tools for Godot`,安装该插件,因为该插件可能依赖于`C#`插件,同时需要安装`C#`插件。
同上,搜索并安装`NuGet Package Manager GUI`插件,用于Nuget包的安装与管理。 同上,搜索并安装`NuGet Package Manager GUI`插件,用于Nuget包的安装与管理。
## 3.Nuget包的安装 ## 3.Nuget包的安装
打开VSCode,按下`Ctrl+Shift+P`,在搜索栏里面搜索`Nuget Package ManagerGUI`,选择右侧`Install New Pakage` ,依次安装以下依赖包: 打开VSCode,按下`Ctrl+Shift+P`,在搜索栏里面搜索`Nuget Package ManagerGUI`,选择右侧`Install New Pakage` ,依次安装以下依赖包:
@ -50,15 +42,54 @@
注意:这些Nuget包仅为目前框架版本所用,后续可能会有新的Nuget包导入,会在此处列出。 注意:这些Nuget包仅为目前框架版本所用,后续可能会有新的Nuget包导入,会在此处列出。
## 4.删除不需要的Module(可选) ## 4.删除不需要的Module(可选)
如果您只想使用部分功能,或者不想安装对应的Nuget包依赖,可以直接删除对应的Module脚本文件。 如果您只想使用部分功能,或者不想安装对应的Nuget包依赖,可以直接删除对应的Module脚本文件。
无需担心,除了部分Module存在相关依赖,大部分Module是支持直接删除的。 无需担心,除了部分Module存在相关依赖,大部分Module是支持直接删除的。
## 5.EG插件库简介
### 5.1 EGSave篇
---
#### Sqlite数据持久化扩展:
注意:本功能需要依赖安装 `Microsoft.Data.Sqlite` Nuget扩展,将以下代码放入*.csproj 工程文件中,或者通过Nuget安装上述包。
```xml
<PackageReference Include="Microsoft.Data.Sqlite" Version="8.0.1" />
```
使用案例(保存数据=>保存单一数据,目前来看该功能仍需改进):
```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;
}
```
结构类要求:保存字段不能使用 {get;set;},所有数据会自动生成自增序列的ID,字段名称不能为ID。
# 二、框架简介 # 二、框架简介
@ -68,8 +99,6 @@
协议文件均存放在目录addons\EGFramework\License_Third_Part下面 协议文件均存放在目录addons\EGFramework\License_Third_Part下面
## 1.使用框架 ## 1.使用框架
添加using,并继承接口IEGFramework,即可使用该框架了。 添加using,并继承接口IEGFramework,即可使用该框架了。
@ -96,12 +125,8 @@ public class DataTest{
public string PlayerName; public string PlayerName;
public int Hp; public int Hp;
} }
``` ```
## 2.直接使用Module ## 2.直接使用Module
继承接口IEGFramework时,可以直接通过this.GetModule这个扩展方法直接获取该模块。上面的代码可以通过直接调用的方式改写成如下: 继承接口IEGFramework时,可以直接通过this.GetModule这个扩展方法直接获取该模块。上面的代码可以通过直接调用的方式改写成如下:
@ -128,8 +153,6 @@ public class DataTest{
} }
``` ```
## 3.扩展框架(编写Module) ## 3.扩展框架(编写Module)
编写框架时,要用到IModule这个接口,任何继承了该接口的类均视为Module,可以被上面的方法Get到。 编写框架时,要用到IModule这个接口,任何继承了该接口的类均视为Module,可以被上面的方法Get到。
@ -150,14 +173,14 @@ namespace EGFramework
{ {
void RegisterObject<T>(T object_); void RegisterObject<T>(T object_);
T GetObject<T>() where T : class,new(); T GetObject<T>() where T : class,new();
} }
public class EGObject : EGModule,IEGObject public class EGObject : EGModule,IEGObject
{ {
private IOCContainer ObjectContainer = new IOCContainer(); private IOCContainer ObjectContainer = new IOCContainer();
public override void Init() public override void Init()
{ {
} }
public TObject GetObject<TObject>() where TObject : class,new() public TObject GetObject<TObject>() where TObject : class,new()
@ -178,7 +201,7 @@ namespace EGFramework
return ObjectContainer.self.ContainsKey(typeof(TObject)); return ObjectContainer.self.ContainsKey(typeof(TObject));
} }
} }
public static class CanGetObjectExtension public static class CanGetObjectExtension
{ {
public static T EGGetObject<T>(this IEGFramework self) where T : class,new() public static T EGGetObject<T>(this IEGFramework self) where T : class,new()
@ -206,5 +229,4 @@ namespace EGFramework
} }
} }
``` ```

2
addons/EGFramework/Module/SQL/EGSqlite.cs

@ -81,6 +81,7 @@ namespace EGFramework{
string sqlCommand = "CREATE TABLE " + typeof(TData).Name; string sqlCommand = "CREATE TABLE " + typeof(TData).Name;
sqlCommand += "(\"ID\" INTEGER NOT NULL UNIQUE,"; sqlCommand += "(\"ID\" INTEGER NOT NULL UNIQUE,";
var properties = typeof(TData).GetFields(); var properties = typeof(TData).GetFields();
Godot.GD.Print(properties.Count() + " Readed ");
foreach(var property in properties){ foreach(var property in properties){
if(property.FieldType == typeof(int) || property.FieldType == typeof(bool) || property.FieldType.IsEnum){ if(property.FieldType == typeof(int) || property.FieldType == typeof(bool) || property.FieldType.IsEnum){
sqlCommand += "\"" + property.Name + "\" INTEGER" + " NOT NULL,"; sqlCommand += "\"" + property.Name + "\" INTEGER" + " NOT NULL,";
@ -92,6 +93,7 @@ namespace EGFramework{
} }
} }
sqlCommand += "PRIMARY KEY(\"ID\" AUTOINCREMENT))"; sqlCommand += "PRIMARY KEY(\"ID\" AUTOINCREMENT))";
Godot.GD.Print(sqlCommand);
SqliteCommand createCommand = new SqliteCommand(sqlCommand,SqliteConn); SqliteCommand createCommand = new SqliteCommand(sqlCommand,SqliteConn);
result = result + createCommand.ExecuteNonQuery().ToString(); result = result + createCommand.ExecuteNonQuery().ToString();
} }

15
addons/EGFramework/Module/SaveTools/EGTable.cs

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace EGFramework
{
public class EGTable : EGModule
{
public override void Init()
{
}
}
}

2
project.godot

@ -12,7 +12,7 @@ config_version=5
config/name="EGFramework" config/name="EGFramework"
config/tags=PackedStringArray("official") config/tags=PackedStringArray("official")
run/main_scene="res://Example/Action3D/MainGame.tscn" run/main_scene="res://Example/UsingTest/Scene/TestEGFramework.tscn"
config/features=PackedStringArray("4.2", "C#", "GL Compatibility") config/features=PackedStringArray("4.2", "C#", "GL Compatibility")
config/icon="res://icon.svg" config/icon="res://icon.svg"

Loading…
Cancel
Save