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

news/2024/5/10 10:05:04

文章目录

  • 前言
  • 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.mrgr.cn/p/85240580

相关文章

[转帖]PCIe7.0宣布即将2025推出

https://zhuanlan.zhihu.com/p/532935941 jiu导言 在2022年的PCI-SIG的开发者大会上,PCI-SIG总裁庆祝了PCI-SIG成立30周年并宣布PCIe技术的下一代技术展望,并且计划在2025年向成员发布PCIe7.0标准。而在未来3年中即将推出的PCIe7.0再次提供速度提升(相比较PCIe6.0翻倍,X16双…

SystemServer 启动流程

SystemServer 启动流程 一、介绍SystemServer 是 Android 进入 Launcher 前的最后准备,顾名思义,它提供了众多由 Java 语言编写的服务 在 Zygote 自启动过程中,参数 bool startSystemServer 为真的话,那么在 ZygoteInit.java/main() 就会调用函数 forkSystemServer() 生成 …

Python爬虫学习完整版

一、什么是爬虫 网络爬虫&#xff0c;是一种按照一定规则&#xff0c;自动抓取互联网信息的程序或者脚本。由于互联网数据的多样性和资源的有限性&#xff0c;根据用户需求定向抓取相关网页并分析也成为如今主流的爬取策略。 1 爬虫可以做什么 你可以爬取网络上的的图片&#…

[转帖]Arm更新Neoverse产品路线图:N3/V3内核曝光,能效及AI性能大涨

https://new.qq.com/rain/a/20240222A0495O00 +关注2月22日,半导体IP大厂Arm宣布推出新一代 Arm Neoverse 技术。其中包括,通过性能效率更优异的 N 系列新 IP 扩展 Arm Neoverse 计算子系统 (CSS) 产品路线图。与 Neoverse CSS N2 相比,Neoverse CSS N3 的每瓦性能可提高 20…

js 回调 callback

<html> <head> <title>按钮点击事件示例</title> <script> function a(callback) { console.log("执行函数a!"); console.log("调用回调函数"); callback(); // 调用回调函数 }function b(){ console.log("回…

【AI漏洞】人工而后智能

注&#xff1a;公众号暂时不再使用了 本文主要内容&#xff1a; 1、主题&#xff1a;AI漏洞 2、过程&#xff1a;测试步骤 3、笔者&#xff1a;寄语 &#xff08;重点&#xff1a;本文只做技术研究&#xff0c;请遵守相关法律法规&#xff0c;发现自身单位有漏洞请及时修复&…

openssl AF_ALG引擎使用

cmd AF_ALG是Linux提供的一种虚拟接口&#xff0c;用于访问内核中的加密算法。在Linux中&#xff0c;可以使用AF_ALG接口配合加密算法框架&#xff08;Crypto API&#xff09;来进行加密操作。 以下是一个使用AF_ALG和openssl进行加密操作的例子&#xff1a; # 加密 openssl…

前端学习之用css和html做一个仿淘宝的导航栏

代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>仿淘宝界面案例</title><style>/* 最外层盒子 */.container{width: 270px;height: 385px;border: 1px solid rgb(255, 208, 0);bord…

基于云计算的前端资源管理系统的设计与实现

hello宝子们...我们是艾斯视觉擅长ui设计和前端开发10年经验&#xff01;希望我的分享能帮助到您&#xff01;如需帮助可以评论关注私信我们一起探讨&#xff01;致敬感谢感恩&#xff01; 随着互联网的快速发展&#xff0c;前端资源管理成为了一个重要的课题。本文旨在设计并实…

阿里云账号注册流程_2024年最新阿里云账户注册和实名认证流程

阿里云账号怎么注册&#xff1f;阿里云账号支持手机号注册、阿里云APP注册、淘宝、支付宝和钉钉多种注册方式&#xff0c;账号注册后需要通过实名认证才可以购买或使用云产品&#xff0c;使用淘宝、支付宝或钉钉注册方式可以免去实名认证步骤&#xff0c;阿里云百科aliyunbaike…

计算机网络(二)物理层

物理层 一、通信基础1.奈氏准则、香农定理2.编码与调制3.电路交换、报文交换、分组交换 二、 传输介质、设备1.导向性传输介质&#xff1a;1.1双绞线1.2 同轴电缆1.3光纤 2.非导向性传输介质&#xff1a; 一、通信基础 信道带宽&#xff1a;信道能通过的最高频率和最低频率之差…

MobileVIT原理详解篇

&#x1f34a;作者简介&#xff1a;秃头小苏&#xff0c;致力于用最通俗的语言描述问题 &#x1f34a;专栏推荐&#xff1a;深度学习网络原理与实战 &#x1f34a;近期目标&#xff1a;写好专栏的每一篇文章 &#x1f34a;支持小苏&#xff1a;点赞&#x1f44d;&#x1f3fc;、…

台灯护眼灯哪个牌子好?明基、书客、爱德华医生旗舰款护眼灯推荐

今日&#xff0c;我为大家深入评测了数款旗舰护眼台灯&#xff0c;目的在于帮助大家避开选购误区&#xff0c;为我们的双眼营造一个既健康又安全的照明环境。每一款台灯都经过严格的实测数据对比&#xff0c;从而揭示出它们各自的优劣。无论是从照明效果、舒适性还是使用寿命等…

记一次 .NET某防伪验证系统 崩溃分析

一:背景 1. 讲故事 昨晚给训练营里面的一位朋友分析了一个程序崩溃的故障,因为看小伙子昨天在群里问了一天也没搞定,干脆自己亲自上阵吧,抓取的dump也是我极力推荐的用 procdump 注册 AEDebug 的方式,省去了很多沟通成本。 二:WinDbg分析 1. 为什么会崩溃 windbg有一个非…

MappedByteBuffer VS FileChannel:从内核层面对比两者的性能差异

本文基于 Linux 内核 5.4 版本进行讨论自上篇文章《从 Linux 内核角度探秘 JDK MappedByteBuffer》 发布之后,很多读者朋友私信我说,文章的信息量太大了,其中很多章节介绍的内容都是大家非常想要了解,并且是频繁被搜索的内容,所以根据读者朋友的建议,笔者决定将一些重要的…

SpringCloud(三)统一网关 -- GateWay

gateway官网:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/网关的作用: 1、对用户请求做身份认证、权限校验 2、将用户请求路由到微服务,并实现负载均衡 3、对用户请求做限流搭建网关服务 基本使用只配置 1、2 步就可以 …

【机器学习】包裹式特征选择之序列前向选择法

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

pytorch如何向tensor结尾添加元素或维度--torch.cat()、torch.unsqueeze()的用法

目录 示例1 矢量后增加元素 示例2 tensor维度增加1 示例3 另一种替代unsqueeze的方法 示例1 矢量后增加元素 使用torch.cat()函数 ptorch.Tensor([1,5,0]) ptorch.cat((p, torch.Tensor([4])), 0) 结果&#xff1a; 这里&#xff0c;cat的第一个输入变量用()包绕&#xf…

阿里云-零基础入门NLP【基于深度学习的文本分类3-BERT】

文章目录 学习过程赛题理解学习目标赛题数据数据标签评测指标解题思路BERT代码 学习过程 20年当时自身功底是比较零基础(会写些基础的Python[三个科学计算包]数据分析)&#xff0c;一开始看这块其实挺懵的&#xff0c;不会就去问百度或其他人&#xff0c;当时遇见困难挺害怕的…

【Linux】从零开始认识进程 — 中下篇

送给大家一句话&#xff1a; 人一切的痛苦&#xff0c;本质上都是对自己无能的愤怒。而自律&#xff0c;恰恰是解决人生痛苦的根本途径。—— 王小波 从零认识进程 1 进程优先级1.1 什么是优先级1.2 为什么要有优先级1.3 Linux优先级的特点 && 查看方式1.4 其他概念 2…