You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
jkpete 2ed83eaa9b fixed doc and add findData 1 month ago
Example fixed doc and add findData 1 month ago
Font First commit 5 months ago
addons/EGFramework fixed doc and add findData 1 month ago
.gitattributes First commit 5 months ago
.gitignore First commit 5 months ago
EGFramework.csproj rewrite egSave Module 2 months ago
EGFramework.sln First commit 5 months ago
LICENSE fixed license author 5 months ago
ReadMe.md add sqlite test code 2 months ago
icon.svg First commit 5 months ago
icon.svg.import fixed Action3D Example 4 months ago
project.godot add ByteSave as EGFileStream 2 months ago

ReadMe.md

EGFramework 使用手册


引言

EGFramework全称Everyone's Godot framework,基于Godot开源引擎,使用C#编写,目前仅兼容Godot4.2 - .NET,部分兼容Godot3.5 - .NET,是完全开源的组件式,功能分布的框架,使用时可以自己根据需求安装对应的Module来实现对应的功能,同样也可以裁剪对应的Module来删减对应的功能。

ModuleEGFramework的核心组成部分,也是EGFramework中重要的扩展依据。详细可以查看第二部分-Module。

关于Godot引擎(摘自Godot Engine (4.x) 简体中文文档

Godot 引擎是一款功能丰富的跨平台游戏引擎,可以通过统一的界面创建 2D 和 3D 游戏。它提供了一套全面的通用工具,因此用户可以专注于制作游戏,而无需重新发明轮子。游戏可以一键导出到多个平台,包括主流的桌面平台(Linux、macOS、Windows)、移动平台(Android、iOS)、基于 Web 的平台以及主机平台。

Godot 在 宽松的 MIT 许可证 下完全自由且开源,没有附加条件、没有抽成、什么都没有。用户的游戏乃至引擎的每一行代码,都归用户自己所有。Godot 的开发完全独立且由社区驱动,允许用户为满足需求重塑引擎。它受到不以盈利为目标的 Godot 基金会支持。

一、准备工作

1.下载开发环境

本章节所有环境均在开源IDE VSCodeGodot4.2 - .NET 的环境下进行,请确保已经下载好VSCodeGodot4.2 - .NET,如果您有购买Rider或者其他编码工具可以根据自己的喜好来替代VSCode。

2.VSCode 插件安装

打开VSCode, 按下Ctrl+Shift+X,在搜索栏里面搜索C# Tools for Godot,安装该插件,因为该插件可能依赖于C#插件,同时需要安装C#插件。

同上,搜索并安装NuGet Package Manager GUI插件,用于Nuget包的安装与管理。

3.Nuget包的安装

打开VSCode,按下Ctrl+Shift+P,在搜索栏里面搜索Nuget Package ManagerGUI,选择右侧Install New Pakage ,依次安装以下依赖包:

  • System.IO.Ports(仅EGSerialPort 使用)

  • Newtonsoft.Json(使用场合较多)

  • Microsoft.Data.Sqlite(仅EGSQLite使用)

  • System.Text.Encoding.CodePages(ProtocolTools目录下均有使用)

注意:这些Nuget包仅为目前框架版本所用,后续可能会有新的Nuget包导入,会在此处列出。

4.删除不需要的Module(可选)

如果您只想使用部分功能,或者不想安装对应的Nuget包依赖,可以直接删除对应的Module脚本文件。

无需担心,除了部分Module存在相关依赖,大部分Module是支持直接删除的。

5.EG插件库简介

5.1 EGSave篇


Sqlite数据持久化扩展:

注意:本功能需要依赖安装 Microsoft.Data.Sqlite Nuget扩展,将以下代码放入*.csproj 工程文件中,或者通过Nuget安装上述包。

<PackageReference Include="Microsoft.Data.Sqlite" Version="8.0.1" />

使用案例(保存数据=>保存单一数据,目前来看该功能仍需改进):

    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。

二、框架简介

由于该框架使用了较多的Nuget包实现相关的功能,所以安装较为繁琐,同时因为用到较多的扩展方法,提示词可能比较冗余。您可以通过删除对应的Module来定制化自己的框架,也可以新增自己的Module来扩展自己的框架。

本框架所使用的一切Nuget包均满足MIT开源协议,如果使用的Nuget包牵扯有其他协议请联系作者QQ:1031139173,会删除对应的Module功能保证该框架满足MIT协议。

协议文件均存放在目录addons\EGFramework\License_Third_Part下面

1.使用框架

添加using,并继承接口IEGFramework,即可使用该框架了。

以下以一个EGSave的例子,来展示一下框架的存档功能,其他详细用法可以参阅查看Manual-EGSave对应的部分。

using Godot;
using static Godot.GD;
using System.Collections.Generic;
using EGFramework;

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;
}

2.直接使用Module

继承接口IEGFramework时,可以直接通过this.GetModule这个扩展方法直接获取该模块。上面的代码可以通过直接调用的方式改写成如下:

using Godot;
using static Godot.GD;
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);
    }
}
public class DataTest{
    public string PlayerName;
    public int Hp;
}

3.扩展框架(编写Module)

编写框架时,要用到IModule这个接口,任何继承了该接口的类均视为Module,可以被上面的方法Get到。

同时我们提供了一个简单的实现接口的抽象类EGModule,继承该类等同于实现接口IModule。

注意的是,因为C#仅支持单继承,如果您需要继承其他工具类或者是Godot的对应类,您应该使用接口而不是抽象类,具体用法可以参考ProtocolTools.EGProtocolSchedule这个类,它通过一个Node的生命周期的_Process()方法实现了特定线程中的消息拾取到主线程的功能。

一个简单的单例对象扩展可以写成如下:

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>();
        }
    }

}