Godot.NET C# 工程化开发(1):通用Nuget 导入+ 模板文件导出,包含随机数生成,日志管理,数据库连接等功能

文章目录

  • 前言
  • Github项目地址,包含模板文件
  • 后期思考补充
  • 项目设置
    • 编写失误
    • 环境
    • visual studio 配置
      • 详细的配置看我这篇文章
  • Nuget 推荐
    • NewtonSoft 成功
    • Bogus 成功
      • Github文档地址
      • 随机生成
      • 构造器生成
      • 构造器+接口(推荐)
    • 文件夹设置
    • Nlog 成功!
      • Nlog.config
      • NlogHelper.cs
      • Nloghelper使用
      • 测试
    • FreeSql 以Sqlite为例
      • FreeSql官方文档
      • sqlite3 安装,CodeFrist则不需要安装。我这里用CodeFrist
      • 生成Sqlite数据库文件,这里我取名为sqliteDb.db
      • Nuget引入,FreeSql核心和FreeSql的Sqlite支持
      • FreeSqlHelper CodeFrist模式
        • T_ModelBase 数据库基类+Bogus随机生成
        • T_Person,数据库插入类,我习惯用T开头带表数据库实体
      • 连接,插入,查询测试使用
  • GD_Extension项目打包,用于复用
    • Icon封面准备
    • visual studio 导出
  • Github项目地址,包含模板文件
  • 总结

前言

我们学编程,不要重复造工具。我之所以使用C# 开发Godot ,而不是Unity。很大的原因就是Godot.NET 支持Nuget的导入,因为Nuget是.NET Core 的第三方库。我也将Godot 的Visual Studio 项目的.NET 版本强制升级到的.NET Core 8.0版本,目前还没有任何问题。

Github项目地址,包含模板文件

Gclove2000/GodotNet_Csharp_IOC_SimpleTemplate

后期思考补充

我将项目分成3层,从上到下是

  • Godot:只是单纯挂载脚本
  • GD_Program:负责游戏逻辑
  • GD_Extension:通用的工具类

但是我后面想了一下,游戏逻辑也有部分是可以通用的,所以我感觉我的三层构造应该是存在过度封装了。两层封装说不定好一些。我后面打算先用两层封装好一点。等后面项目复杂度上来之后,再细分好了。

项目设置

编写失误

我写到后面的时候发现,Interfaces应当放在GD_Extension中。读者记得修改
在这里插入图片描述

环境

  • window 10
  • .net core 8.0
  • godot 4.2.1
  • visual studio 2022

visual studio 配置

  • GD_Extesion:Godot工具类,后面用于导出
    • Assests:资源文件夹
    • Utils:工具类
    • Interfaces:接口类
  • GD_Program:Godot运行逻辑
    • SceneModels:场景脚本实际运行类,IOC装配生成
    • Services:服务类
    • Program.cs:IOC容器位置
  • Godot:Godot引擎生成解决方案
    • Scene:挂载脚本,只用于建立脚本连接关系

在这里插入图片描述

详细的配置看我这篇文章

Godot 学习笔记(5):彻底的项目工程化,解决GodotProjectDir is null+工程化范例

Nuget 推荐

Nuget介绍
Newtonsoft.Json高性能Json序列化库
Bogus随机测试数据生成,比如随机数据,随机人民,地名,手机号,账号,密码
Microsoft.Extensions.DependencyInjection微软IOC框架,个人推荐
Autofac第三方IOC 框架,性能也不错
Nlog日志管理
FreeSql数据库ORM框架,个人推荐
SqlSugar数据库ORM框架,一般来说够用了,游戏开发也不是高频并发操作
MiniExcelExcel ORM框架,简易操作。建议使用CSV
Microsoft.AspNetCore.SignalR.Common微软开发即时通讯框架,用于解决多人联网
Grpc谷歌开发的即使通讯框架,用于解决多人联网

NewtonSoft 成功

在这里插入图片描述

//以匿名对象为例
GD.Print(JsonConvert.SerializeObject(new
{Name =  "小王",Age = "24"
}));

在这里插入图片描述

Bogus 成功

在这里插入图片描述

Github文档地址

Bugous Github文档地址

在这里插入图片描述

随机生成

//以随机数为例
var faker = new Faker();
for(var i =  0; i < 10; i++)
{GD.Print($"Bogus,int 0-10:[{faker.Random.Int(0, 10)}]");
}

在这里插入图片描述

构造器生成

public class MyStudent
{public int Id { get; set; }public string? Name { get; set; }public int Age { get; set; }/// <summary>/// 构建faker构造器/// </summary>public static Faker<MyStudent> Faker = new Faker<MyStudent>().RuleFor(t=>t.Id,f=>f.IndexFaker).RuleFor(t=>t.Name,f=>f.Name.FindName()).RuleFor(t=>t.Age,f=>f.Random.Int(10,30));}
//以构造器为例
for (var i = 0; i < 10; i++)
{var stu = MyStudent.Faker.Generate();GD.Print($"Bogus:[{JsonConvert.SerializeObject(stu)}]");
}

在这里插入图片描述

构造器+接口(推荐)

个人建议,上个接口,更规范一点

public interface IModelFaker<T> where T : class
{public T FakerOne();public IEnumerable<T> FakeMany(int num);
}
public class MyStudent : IModelFaker<MyStudent>
{public int Id { get; set; }public string? Name { get; set; }public int Age { get; set; }/// <summary>/// 构建faker构造器/// </summary>private Faker<MyStudent> faker = new Faker<MyStudent>().RuleFor(t => t.Id, f => f.IndexFaker).RuleFor(t => t.Name, f => f.Name.FindName()).RuleFor(t => t.Age, f => f.Random.Int(10, 30));public MyStudent FakerOne(){return faker.Generate();}public IEnumerable<MyStudent> FakeMany(int num){return faker.Generate(num);}
}

文件夹设置

因为后面会涉及到文件夹的设置问题,我这里简单说明一下
在这里插入图片描述
添加配置
在这里插入图片描述

Visual Studio C# 项目生成时复制项目资源目录到生成目录

Nlog 成功!

在这里插入图片描述

Nlog.config

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ><targets><!--将Debug导出为每小时一个--><target name="debug"xsi:type="File"fileName="${basedir}/Logs/${date:format=yyyy}/${date:format=MM}/${date:format=dd}/${date:format=HH}.log"layout="${date:format=yyyy-MM-dd HH\:mm\:ss} [${uppercase:${level}}] : ${message}" /><!--将Error导出为每天一个,而且存放在一个Error文件夹中--><target name="error"xsi:type="File"fileName="${basedir}/Logs/${date:format=yyyy}/${date:format=MM}/Error/${date:format=dd}.log"layout="${date:format=yyyy-MM-dd HH\:mm\:ss} [${uppercase:${level}}] : ${message}" /></targets><rules><logger name="*"minlevel="Debug"writeTo="debug" /><logger name="*"minlevel="Error"writeTo="error" /></rules>
</nlog>

NlogHelper.cs

Godot的输出比较特别,需要特别处理一下

public class NlogHelper
{private Logger logger;public NlogHelper(){var url = string.Format("{0}Assests/NLog.config", AppDomain.CurrentDomain.BaseDirectory.ToString());GD.Print($"Nlog加载完毕,url地址为[{url}]");LogManager.Configuration = new XmlLoggingConfiguration(url);logger = NLog.LogManager.GetCurrentClassLogger();}public void Debug(string msg){GD.Print(msg);logger.Debug(msg);}public void Info(string msg){GD.Print($"[info]:{msg}");logger.Info(msg);}public void Error(string msg){GD.PrintErr(msg);GD.PushError(msg);logger.Error(msg);}public void Warning(string msg){GD.Print($"[warning]:{msg}");GD.PushWarning(msg);logger.Warn(msg);}
}

Nloghelper使用

在这里插入图片描述
在这里插入图片描述

测试

nlogHelper.Debug("Debug");
nlogHelper.Info("Info");
nlogHelper.Warning("Warning");
nlogHelper.Error("Error");

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

FreeSql 以Sqlite为例

FreeSql官方文档

FreeSql官方文档

在这里插入图片描述

sqlite3 安装,CodeFrist则不需要安装。我这里用CodeFrist

SQLite 安装

生成Sqlite数据库文件,这里我取名为sqliteDb.db

sqlite3 sqliteDb.db
.open sqliteDb.db

在这里插入图片描述

Nuget引入,FreeSql核心和FreeSql的Sqlite支持

在这里插入图片描述
在这里插入图片描述

FreeSqlHelper CodeFrist模式

C# FreeSql使用,基于Sqlite的DB Frist和Code First测试

T_ModelBase 数据库基类+Bogus随机生成
/// <summary>
/// 基类
/// </summary>
public abstract class T_ModelBase
{/// <summary>/// 主键自增/// </summary>[Column(IsPrimary =true,IsIdentity =true)]public long Id { get; set; }/// <summary>/// 创建时间/// </summary>public DateTime CreateTime { get; set; } = DateTime.Now;/// <summary>/// 更新时间/// </summary>public DateTime UpdateTime { get; set; } = DateTime.Now;/// <summary>/// 假删除/// </summary>public bool IsDelete { get; set; } = false;public DateTime DeleteTime { get; set; }
}
T_Person,数据库插入类,我习惯用T开头带表数据库实体
public class T_Person : T_ModelBase, IModelFaker<T_Person>
{public int Age { get; set; }public string Name { get; set; }private Faker<T_Person> faker = new Faker<T_Person>().RuleFor(t => t.Id, f => f.IndexFaker).RuleFor(t => t.CreateTime, f => f.Date.Between(new DateTime(2024, 1, 1), DateTime.Now)).RuleFor(t => t.Name, f => f.Name.FindName()).RuleFor(t => t.Age, f => f.Random.Int(10, 30));public IEnumerable<T_Person> FakeMany(int num){return faker.Generate(num);}public T_Person FakerOne(){return faker.Generate();}
}

连接,插入,查询测试使用

var isConnect = freeSqlHelper.SqliteDb.Ado.ExecuteConnectTest(10);
GD.Print($"数据库连接状态:[{isConnect}]");var insertLists = new T_Person().FakeMany(10);var insertName = freeSqlHelper.SqliteDb.Insert(insertLists).ExecuteAffrows();
GD.Print($"数据库插入[{insertName}]行数据");var selectLists = freeSqlHelper.SqliteDb.Queryable<T_Person>().OrderByDescending(t=>t.Id).Take(10).ToList();foreach (var item in selectLists)
{GD.Print(JsonConvert.SerializeObject(item));
}

在这里插入图片描述
在这里插入图片描述

GD_Extension项目打包,用于复用

我写到后面的时候发现,Interfaces应当放在GD_Extension中。读者记得修改

在这里插入图片描述

Icon封面准备

【VisualStudio 】VisualStudio2022 项目模板

准备一个Godot Icon的图片,用于封面展示
在这里插入图片描述

visual studio 导出

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Github项目地址,包含模板文件

Gclove2000/GodotNet_Csharp_IOC_SimpleTemplate

总结

我这里就是简单引入了几个通用的Nuget,这个我后期是会日常去维护的。这个就是我们的脚手架了。而且我在GD_Extension中尽量少的使用Godot的Api。基本只使用了Godot Api 的输出语句。所以这个随着Godot 版本的更新,基本不需要大改。这个以后就是我们宝贵的Godot资源库了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/288977.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++初阶:STL容器list的使用与初版自实现

目录 1. list的接口与使用1.1 默认成员函数1.2 迭代器与容量相关成员函数1.3 存储数据操作相关成员函数1.4 其他list操作成员函数 2. list的自实现2.1 list的自实现功能2.2 list的结点结构2.3 list的迭代器2.3 list的结构2.4 list迭代器的运算符重载2.5 list的成员函数 3. cons…

专题二_滑动窗口(1)

目录 209. 长度最小的子数组 解析 题解 3. 无重复字符的最长子串 解析 题解 1004. 最大连续1的个数 III 解析 题解 209. 长度最小的子数组 209. 长度最小的子数组 - 力扣&#xff08;LeetCode&#xff09; 解析 题解 class Solution { public:int minSubArrayLen(int…

Medium 级别 DOM 型 XSS 攻击演示(附链接)

环境准备 DVWA 靶场https://eclecticism.blog.csdn.net/article/details/135834194?spm1001.2014.3001.5502 测试 打开 DVWA 靶场并登录&#xff0c;找到 DOM 型 XSS 页面&#xff08;笔者这里是 Medium 级别&#xff09; 跟 Low 级别一样&#xff0c;直接上手 <script…

vue多语言包i18n

1.安装 如果是vue2直接安装8.2.1版本&#xff0c;否则会出现版本不匹配的错误 npm install vue-i18n8.2.1 --save2.文件编辑 在src目录下创建文件 en.js export const h {system: "Background management system",loginOut:"LoginOut",LayoutSet:Layout …

双通道内存@DDR5多通道内存

文章目录 多通道内存DDR4及以前的内存的双通道DDR5往后的双通道和多通道半位宽4通道组合 其他组合测试 DDR5介绍概览重要Features特点 总结 多通道内存 DDR4及以前的内存的双通道 双通道内存是一种内存架构设计&#xff0c;通过在主板上配置两个或多个独立且同时工作的内存控制…

MySQL高阶SQL语句(二)

文章目录 MySQL高阶SQL语句&#xff08;二&#xff09;一、MySQL常用查询1、子查询1.1 语法1.1.1 结合select语句查询1.1.2 结合insert语句查询1.1.3 结合update语句查询1.1.4 结合delete语句查询1.1.5 在in前面添加not1.1.6 exists关键字 2、别名 二、MySQL视图1、视图介绍1.1…

【uniapp】uniapp实现免密登录

文章目录 一、概要二、整体架构流程三、技术名词解释四 、技术细节1.存取token有效期&#xff1f;2.使用setStorageSync而不使用setStorage&#xff1f;3.使用onLaunch而不使用全局路由&#xff1f; 一、概要 打开一个网页或小程序的时候&#xff0c;我们有时候会自动进入主页…

那些王道书里的题目-----计算机网络篇

注&#xff1a;仅记录个人认为有启发的题目 p155 34.下列四个地址块中&#xff0c;与地址块 172.16.166.192/26 不重叠&#xff0c;且与172.16.166.192/26聚合后的地址块不会引入多余地址的是&#xff08;&#xff09; A.172.16.166.192/27 B.172.16.166.128/26 …

MySQL高级sql语句

目录 一、子查询 1.1查询分数大于80的记录 1.2将test3里的记录全部删除&#xff0c;重新插入class表的记录 ​编辑1.3将meixi的分数改为20 1.4删除分数大于80的记录 1.5删除分数不是大于等于80的记录 1.6查询如果存在分数等于80的记录则计算class的字段数 2.子查询&…

cuda python课程中“使用 Numba 的 CUDA Python 的自定义核函数和内存管理“一个大坑

总觉得自己的算法没问题&#xff0c;最终还是测试结果不符。 错误出现在一个很顺眼的位置。 解决方案 在最终测验阶段有一个看起来没问题不需要任何修改的Cell&#xff0c;就是这一句&#xff0c;看起来没什么毛病 d_histogram_out cuda.device_array_like(histogram_out)需…

Go通道机制与应用详解

目录 一、概述二、Go通道基础通道&#xff08;Channel&#xff09;简介创建和初始化通道通道与协程&#xff08;Goroutine&#xff09;的关联nil通道的特性 三、通道类型与操作通道类型1. 无缓冲通道 (Unbuffered Channels)2. 有缓冲通道 (Buffered Channels) 通道操作1. 发送操…

预期为文件结尾。json [行2,列1]

报错背景 在huggingface上传数据集后&#xff0c;Dataset Viewer无法显示&#xff0c;报错&#xff1a; The dataset viewer is not available for this split. Cannot extract the features (columns) for the split train of the config default of the dataset. Error cod…

HCIP作业

实验要求&#xff1a; 1、R6为ISP&#xff0c;接口IP地址均为公有地址&#xff0c;该设备只能配置IP地址&#xff0c;之后不能再对其进行任何配置&#xff1b; 2、R1-R5为局域网&#xff0c;私有IP地址192.168.1.0/24&#xff0c;请合理分配&#xff1b; 3、R1、R2、R4&#x…

Jenkins常用插件安装及全局配置

Jenkins常用插件安装及全局配置 前言 ​ Jenkins是一个流行的持续集成工具&#xff0c;通过安装适用的插件&#xff0c;可以扩展Jenkins的功能&#xff0c;并与其他工具和系统集成。本文将介绍一些常用的Jenkins插件以及安装和配置的步骤。通过安装和配置这些常用插件&#xf…

鸿蒙开发之ArkUI组件常用组件图片和文本

ArkUI即方舟开发框架是HarmonyOS应用的UI开发提供了完整的基础设施&#xff0c;包括简洁的UI语法、丰富的UI功能&#xff08;组件、布局、动画以及交互事件&#xff09;&#xff0c;以及实时界面预览工具等&#xff0c;可以支持开发者进行可视化界面开发。 开发文档地址 &…

Docker安装各种组件

列举镜像 docker images // 列举镜像 搜索镜像 docker search jdk 下载镜像&#xff1a; docker pull java 查看镜像&#xff1a; docker images 启动镜像&#xff1a; docker run -it --name jdk1.8 -d java:latest /bin/bash 查看容器&#xff1a; docker ps 查看…

STM32之HAL开发——系统定时器(SysTick)

系统定时器&#xff08;SysTick&#xff09;介绍 SysTick—系统定时器是属于 CM3 内核中的一个外设&#xff0c;内嵌在 NVIC 中。系统定时器是一个 24bit的向下递减的计数器&#xff0c;计数器每计数一次的时间为 1/SYSCLK&#xff0c;一般我们设置系统时钟 SYSCLK等于 72M。当…

ChatGPT智能聊天系统源码v2.7.6全开源Vue前后端+后端PHP

测试环境:Linux系统CentOS7.6、宝塔、PHP7.4、MySQL5.6,根目录public,伪静态thinkPHP,开启ssl证书 具有文章改写、广告营销文案、编程助手、办公达人、知心好友、家庭助手、出行助手、社交平台内容、视频脚本创作、AI绘画、思维导图等功能 ai通道:文心一言、MiniMax、智…

Qt中QIcon图标设置(标题、菜单栏、工具栏、状态栏图标)

1 exe程序图标概述 在 Windows 操作系统中&#xff0c;程序图标一般会涉及三个地方&#xff1b; &#xff08;1&#xff09; 可执行程序&#xff08;以及对应的快捷方式&#xff09;的图标 &#xff08;2&#xff09; 程序界面标题栏图标 &#xff08;3&#xff09;程序在任务…

知攻善防应急靶场-Linux(1)

前言&#xff1a; 堕落了三个月&#xff0c;现在因为被找实习而困扰&#xff0c;着实自己能力不足&#xff0c;从今天开始 每天沉淀一点点 &#xff0c;准备秋招 加油 注意&#xff1a; 本文章参考qax的网络安全应急响应和知攻善防实验室靶场&#xff0c;记录自己的学习过程&am…