Godot 学习笔记(5):彻底的项目工程化,解决GodotProjectDir is null+工程化范例
文章目录
- 前言
- GodotProjectDir is null
- 解决方法
- 解决警告问题
- 根本解决代码问题
- 测试引用
- 其实其它库的输出路径无所谓。
- 工程化范例
- 环境
- 命名规范
- Nuget
- 项目结构
- 架构代码
- ISceneModel
- IOC服务
- 测试
- GD_Extension 通用扩展
- TestUtils
- GD_Program
- TestService
- MainSceneModel
- Godot对应的脚本实体
- 测试
- 总结
前言
Godot 项目工程化上有一朵乌云,我看Godot的Visual Studio 项目的时候,发现如果是手动新建项目导入Godot包,会导致编译的warning,这个虽然不影响正常运行,但是有warining还是不不爽,这次彻底解决他。
GodotProjectDir is null
出现这个问题的原因是,我想分项目开发

然后会报warning

所以我之前的项目封装,是放在一个文件家里的,非常的丑陋

解决方法
先把这三个先装上




解决警告问题
GitHub上面找了一圈,找到了解决方案
C# Godot project with MSTest - Error: Generator ‘ScriptPathAttributeGenerator’ failed to generate source. #87753

这个是解决警告问题。
<PropertyGroup><IsGodotToolsProject>true</IsGodotToolsProject>
</PropertyGroup>
根本解决代码问题
添加输出路径
$(GodotProjectDir).godot\mono\temp\bin\



<PropertyGroup><GodotProjectDir>../Godot/</GodotProjectDir></PropertyGroup>

测试引用
外面这里做一个做简单的测试





其实其它库的输出路径无所谓。
我们看这两个项目的输出路径

1>------ 已启动全部重新生成: 项目: ClassLibrary1, 配置: Debug Any CPU ------
已还原 D:\workspace\program\Godot Game\Train\Test18\Godot\Test18.csproj (用时 12 毫秒)。
已还原 D:\workspace\program\Godot Game\Train\Test18\ClassLibrary1\ClassLibrary1.csproj (用时 16 毫秒)。
1>ClassLibrary1 -> D:\workspace\program\Godot Game\Train\Test18\Godot\.godot\mono\temp\bin\Debug\net6.0\ClassLibrary1.dll
2>------ 已启动全部重新生成: 项目: Test18, 配置: Debug Any CPU ------
2>Test18 -> D:\workspace\program\Godot Game\Train\Test18\Godot\.godot\mono\temp\bin\Debug\Test18.dll
========== “全部重新生成”: 2 成功,0 失败,0已跳过 ==========
========== 重新生成 于 0:09 完成,耗时 01.830 秒 ==========
其实只要Godot的输出路径是对的就可以了



工程化范例
既然已经成功可以项目分离了,我就做个我心中的工程化范例好了
环境
- Godot 4.2.1
- .net core 8.0(需要手动更改)
- window10
- visual studio 2022
命名规范


Nuget

项目结构

依赖关系,从底层开始
Godot_Extension->Godot_Program->Godot
架构代码
架构代码主要是在GD_Program里面。因为IOC容器时在GD_Program里面。
ISceneModel
/// <summary>
/// SceneModel的基类
/// </summary>
public abstract class ISceneModel
{/// <summary>/// 挂载场景,强制Node2D/// </summary>public Node2D? Sence { get; set; }/// <summary>/// 打包场景,用于生成/// </summary>public PackedScene? PackedScene { get; set; }/// <summary>/// 重载Ready事件/// </summary>public abstract void Ready();/// <summary>/// 重载Process事件/// </summary>/// <param name="delta"></param>public abstract void Process(double delta);/// <summary>/// 方便加载场景/// </summary>/// <param name="sceneName"></param>public virtual void SetPackedScene(string sceneName){var targetName = sceneName.Replace("Scene", "");var url = $"res://Scenes//{targetName}.tscn";GD.Print($"加载PackedScene,{sceneName}:{url}");PackedScene = ResourceLoader.Load<PackedScene>(url);}}
IOC服务
public class Program{/// <summary>/// IOC容器/// </summary>public static IServiceProvider Services = ConfigureServices();/// <summary>/// Configures the services for the application./// </summary>private static IServiceProvider ConfigureServices(){var builder = new ServiceCollection();AddServices(builder);AddSceneModel(builder);return builder.BuildServiceProvider();}/// <summary>/// 添加服务,应以Singleton形式添加/// </summary>/// <param name="service"></param>public static void AddServices(ServiceCollection builder){builder.AddSingleton<TestService>();}/// <summary>/// 添加SceneModel,应以Transient添加/// </summary>/// <param name="service"></param>public static void AddSceneModel(ServiceCollection builder){//比如//builder.AddTransient<MainSceneModel>();}}
测试
GD_Extension 通用扩展
TestUtils
测试类
public class TestUtils{public TestUtils(){}public void Test(){GD.Print("我是Utils方法");}}
GD_Program
TestService
public class TestService
{public TestService() { }public void Test(){GD.Print("我是TestService方法");}
}
MainSceneModel
public class MainSceneModel : ISceneModel
{private TestService testService;private TestUtils testUtils = new TestUtils();public MainSceneModel(TestService testService){this.testService = testService;}public override void Process(double delta){}public override void Ready(){GD.Print("Hello Godot!");//在Ready中测试IOCtestService.Test();testUtils.Test();}
}
Godot对应的脚本实体
public partial class MainScene : Node2D
{public MainSceneModel Model { get; set; }public MainScene(){Model = Program.Services.GetService<MainSceneModel>();Model.Sence = this;Model.SetPackedScene(nameof(MainScene));}public override void _Ready(){Model.Ready();base._Ready();}public override void _Process(double delta){base._Process(delta);}
}
测试


总结
看来确实是设置IsGodotToolsProject就可以用了,这样我们终于能标准化开发Godot项目了
相关文章:
Godot 学习笔记(5):彻底的项目工程化,解决GodotProjectDir is null+工程化范例
文章目录 前言GodotProjectDir is null解决方法解决警告问题根本解决代码问题测试引用其实其它库的输出路径无所谓。 工程化范例环境命名规范Nuget项目结构架构代码ISceneModelIOC服务 测试GD_Extension 通用扩展TestUtils GD_ProgramTestServiceMainSceneModel Godot对应的脚本…...
算法打卡day23|回溯法篇03|Leetcode 39. 组合总和、40.组合总和II、131.分割回文串
算法题 Leetcode 39. 组合总和 题目链接:39. 组合总和 大佬视频讲解:组合总和视频讲解 个人思路 这道组合题主要是有总和的限制,当递归和超过了总和就return,递归时加上回溯去遍历数组。 解法 回溯法 把组合问题抽象为如下树形结构 如上…...
Google研究者们提出了VLOGGER模型
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
Python从入门到精通秘籍十九
一、Python之union 联合类型注释 当谈论Python中的联合类型注释时,通常会提到Union类型。Union是typing模块中定义的一个泛型类,用于表示多个可能的类型。 Union的语法如下: Union[type1, type2, ...]其中type1, type2, … 是要组成联合类…...
解决:您还有0天的时间继续使用internet download manager
通过修改注册表来白嫖的IDM方法 1、新建txt文件复制代码(命名为idm.reg) 2、代码如下 Windows Registry Editor Version 5.00[-HKEY_CURRENT_USER\Software\Classes\CLSID\{7B8E9164-324D-4A2E-A46D-0165FB2000EC}] [-HKEY_CURRENT_USER\Software\Clas…...
操作系统目录
北航操作系统 chapter 1 北航操作系统 chapter3-1 内存管理 北航操作系统chapter3-2 内存管理 北航操作系统chapter3-3 页式管理 北航操作系统chapter3-4 段式管理 北航操作系统chapter3-5 虚拟内存管理 操作系统chapter4-1 进程与线程 北航操作系统-chapter4.2 同步与互斥…...
常用的Node.js命令集锦
当使用Node.js开发时,以下是一些常用的Node.js命令集锦: npm init 用于初始化一个新的Node.js项目,并创建一个package.json文件来管理项目的依赖和元数据。 npm install [package-name] 用于安装指定的Node.js包,可以通过--save选…...
2021年XX省赛职业院校技能大赛”高职组 计算机网络应用赛项 网络构建模块竞赛真题
“2021年XX省赛职业院校技能大赛”高职组 计算机网络应用赛项 网络构建模块竞赛真题 目录 一.考试说明 1 二.模块B网络构建 2 (一)任务描述 2 (二)任务清单 9 一.考试说明 本模块比赛时间为…...
80386 ATT汇编语法
文章目录 gcc的预处理,不进行编译、汇编或链接预处理编译汇编 8.8.2 AT&T语法与英特尔语法8.8.3操作码命名8.8.4寄存器命名8.8.5操作码前缀8.8.6内存引用8.8.7跳转指令的处理8.8.8浮点8.8.9写入16位代码8.8.10笔记 gcc的预处理,不进行编译、汇编或链…...
如何在Linux系统使用宝塔面板搭建Inis博客并发布至公网【内网穿透】
文章目录 前言1. Inis博客网站搭建1.1. Inis博客网站下载和安装1.2 Inis博客网站测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道(云端设置)2.3.Cpolar稳定隧道(本地设置) 3. 公网访问测试总…...
【漏洞复现】netgear路由器 boarddataww 存在RCE漏洞
免责声明:文章来源互联网收集整理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该…...
什么是原型链
1、原型链的本质 是一个链表,当使用一个构造函数时,就会返回一个实例,在这个实例上找某个属性未找到时,则会顺着proto属性指向它的原型,去原型上找,如果原型也没有的话,则会顺着原型的原型找&a…...
什么是虚拟线程?
1、典型回答 Java 中的虚拟线程,也叫做协程或“轻量级线程”,它诞生于JDK 19(预览 API),正式发布于 JDK 21,它是一种在 Java 虚拟机(JVM)层面实现的逻辑线程,不直接和操作系统的物理线程一一对应,因此它可…...
node.js是什么怎么用常用方法
什么是node.js Node.js是一个基于Chrome V8 JavaScript引擎的服务器端运行环境。它允许使用JavaScript来开发高性能的网络应用程序。Node.js采用事件驱动、非阻塞式I/O模型,使其能够处理大量并发请求而不会出现阻塞。 Node.js最初是由Ryan Dahl于2009年创建的&…...
pikachu靶场第十四关——XSS(跨站脚本)之js输出(附代码审计)
源代码: //这里讲输入动态的生成到了js中,形成xss //javascript里面是不会对tag和字符实体进行解释的,所以需要进行js转义//讲这个例子主要是为了让你明白,输出点在js中的xss问题,应该怎么修? //这里如果进行html的实体编码,虽然可以解决XSS的问题,但是实体编码后…...
AD实用设置教程
目录 一、“多边形敷铜” 设置 “最小间隔” 二、放置的 “过孔” 敷铜 “全连接”...
webpack为什么要使用loader,如何手写loader
webpack是一个打包工具,即webpack会将一切文件视为模块,但是webpack在打包的时候只是认识JS文件或者JSON文件,并不认识CSS文件,png图片等,如果想让webpack能够在打包的时候识别其他文件,就必须要使用loader…...
【银河商学】大蓝短视频学习04——找对标账号
为什么要找对标账号? 标准答案,少走弯路秒上热搜,快速起号预知变现,扬长避短 找什么样的对标账号? 成熟 粉丝量 > 50万持续更新,多年屹立不倒 举例账号 三百者也 模仿 二百者也 易做 简单可量产 有潜…...
Java练手游戏--俄罗斯方块
Java基础小练手游戏项目:俄罗斯方块简单版 使用Java实现俄罗斯方块大概思路: 界面设计: 使用Java Swing或JavaFX创建游戏窗口和用户界面。创建一个主窗口类(如GameFrame.java),负责设置窗口大小、标题等属…...
基础篇Redis
基础篇Redis 1.Redis简单介绍 Redis是一种键值型的NoSql数据库,这里有两个关键字: 键值型NoSql 其中键值型,是指Redis中存储的数据都是以key.value对的形式存储,而value的形式多种多样,可以是字符串.数值.甚至json…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
