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项目了

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

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

相关文章

STM32存储左右互搏 SPI总线FATS文件读写SD/MicroSD/TF卡

STM32存储左右互搏 SPI总线FATS文件读写SD/MicroSD/TF卡 SD/MicroSD/TF卡是基于FLASH的一种常见非易失存储单元&#xff0c;由接口协议电路和FLASH构成。市面上由不同尺寸和不同容量的卡&#xff0c;手机领域用的TF卡实际就是MicroSD卡&#xff0c;尺寸比SD卡小&#xff0c;而…

Leo赠书活动-21期 《一篇讲明白 Hadoop 生态的三大部件》

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 赠书活动专栏 ✨特色专栏&#xff1a;…

【算法刷题】链表笔试题解析(1)

一、链表分割 题目描述&#xff1a; 链接&#xff1a;链表分割 题目分析&#xff1a; 这题直接处理并不好做&#xff0c;我们可以构建前后两个链表&#xff0c;将小于x值的结点放在链表a内&#xff0c;将其它结点放在链表b内&#xff0c;这样将原链表遍历完后&#xff0c;原链…

Day23 代码随想录(1刷) 二叉树

669. 修剪二叉搜索树 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即&#xff0c;如果没有被移除&#xff0c;原有的父代…

PHP图床程序优化版:图片外链服务、图床API服务、图片CDN加速与破解防盗链

图片免费上传 支持本地储存、FTP储存、第三方云储存&#xff08;阿里云 OSS、腾讯云 COS、七牛云等&#xff09;。 图片外链加速 一键转换第三方网站的图片外链地址为图床可分享的图片地址&#xff08;支持CDN&#xff09;。 图片解析服务 直接将第三方外链图片地址显示为…

oracle docker安装

修改下载的Image的REPOSITORY和TAG属性 修改下载的Image的REPOSITORY和TAG属性&#xff1a;docker tag <IMAGE ID> <REPOSITORY NAME> docker tag 3fa112fd3642 aliyun/oracle_11g 参考网址 使用docker images时&#xff0c;可能会出现REPOSITORY和TAG均为none的镜…

【教程】iOS 手机抓包工具介绍及教程

&#x1f4f1; 最近又发现APP Store一款宝藏软件&#xff0c;克魔助手抓包工具&#xff0c;app刚上架&#xff0c;功能不断迭代中&#xff0c;目前18软妹币实惠价可享受终身版&#xff01;现在是下手的最好时机。 引言 移动端开发中&#xff0c;抓包工具已成为必备的工具之一…

shell脚本发布nginx vue2 项目示例

nginx、git、node.js安装略过。 使git pull或者git push不需要输入密码操作方法 非docker安装nginx&#xff01;&#xff01;&#xff01; 姊妹篇&#xff08;docker安装nginx&#xff09;&#xff1a;shell脚本发布docker-nginx vue2 项目示例 pro_build.sh 注意&#xff1…

Linux基础IO(操作系统层面理解文件)

目录 一、认识 open 函数 1.1 理解文件 1.2 open 函数 1.3 函数选项和宏 二、 open 函数的返回值 三、 fd 的本质 3.1 各部分内容及关系 3.2 如何确定进程对应文件 四、Linux 一切皆文件&#xff1f; 一、认识 open 函数 在C语言中学习文件操作时&#xff0c;我们学…

基于SpringBoot和Vue的课程作业管理系统的设计与实现

今天要和大家聊的是一款基于SpringBoot和Vue的课程作业管理系统的设计与实现。 &#xff01;&#xff01;&#xff01; 有需要的小伙伴可以通过文章末尾名片咨询我哦&#xff01;&#xff01;&#xff01; &#x1f495;&#x1f495;作者&#xff1a;李同学 &#x1f495;&am…

element表格 加滚动,监听底部实现分页加载

表格要实现滚动很简单&#xff0c;给他加一个高度即可 height"300" 然后是监听事件 mounted() {this.lazyLoading();}, methods:{lazyLoading(){let dom document.querySelector(".el-table__body-wrapper");dom.addEventListener("scroll", (…

踩坑uniapp中打包Andiord app,在真机调试时地图以及定位功能可以正常使用,打包成app后失效的问题

首先看到这是uni官网提出的&#xff0c;app上建议使用高德地图。 下面就用高德地图进行配置。 步骤一&#xff1a;登陆高德地图控制台 名称和类型根据自己情况填写选择即可 步骤二&#xff1a; 添加key 步骤三&#xff1a;取到SHA1 进入uniapp开发官网 点击应用名称&#…

算法模型离线评估方案

1 引言2需求背景3特征评估 3.1特征表维护3.2样本频率分布直方图概览3.3Pearson相关系数计算3.4缺失率计算4模型评估 4.1模型离线AUC评估 4.1.1什么是AUC4.1.2AUC的优势:4.2TensorBoard可视化 4.2.1项目中集成tensorboard4.2.2启动tensorboard命令4.2.3可视化效果4.3离线实验记录…

SpringBoot SpringMVC (详解)

6. SpringBoot Spring 的诞⽣是为了简化 Java 程序的开发的&#xff0c;⽽ Spring Boot 是为了快速开发 Spring 程序开发而诞生的。 Spring Boot 的优点&#xff1a; 快速集成框架&#xff0c;Spring Boot 提供了启动添加依赖的功能&#xff0c;⽤于秒级集成各种框架。内置运⾏…

JAVA WEB 能够实现整个文件夹的上传下载吗?

导入项目&#xff1a; 导入到Eclipse&#xff1a;导入项目 导入到IDEA&#xff1a;导入项目 springboot统一配置&#xff1a;springboot-配置 下载示例&#xff1a; https://gitee.com/xproer/up6-jsp-eclipse/tree/6.5.40/ 工程 NOSQL NOSQL示例不需要任何配置&#xff0c;可…

【面试经典150 | 】最长递增子序列

文章目录 Tag题目来源解题思路方法一&#xff1a;动态规划 写在最后 Tag 【动态规划】【数组】 题目来源 300. 最长递增子序列 解题思路 方法一&#xff1a;动态规划 定义状态 dp[i] 表示以位置 i 对应整数为末尾的最长递增子序列的长度。 状态转移 我们从小到大计算 dp…

FASTAPI系列 16-其他响应类型

FASTAPI系列 16-其他响应类型 文章目录 FASTAPI系列 16-其他响应类型前言一、HTMLResponse 响应 HTML二、纯文本响应三、另外的JSON 响应四、FileResponse文件五、StreamingResponse六、RedirectResponse 重定向请求总结更多内容&#xff0c;请关注公众号, 发送666 更可以得到免…

解决配置文件中文乱码

一、问题 二、解决方法

HTML5+CSS3小实例:文字边框视觉错位

实例:文字边框视觉错位 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scal…

StringRedisTemplate与RedisTemplate详解【序列化的方式不同】

spring 封装了 RedisTemplate 对象来进行对redis的各种操作&#xff0c;它支持所有的 redis 原生的 api。在RedisTemplate中提供了几个常用的接口方法的使用&#xff0c;分别是: private ValueOperations<K, V> valueOps; private HashOperations<K, V> hashOps; …