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中测试IOC
        testService.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项目了

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mac 解决随机出现的蓝色框

macbookair为什么打字的时候按空格键会出现蓝色框? - 知乎

t-rex2开放集目标检测

论文链接&#xff1a;http://arxiv.org/abs/2403.14610v1 项目链接&#xff1a;https://github.com/IDEA-Research/T-Rex 这篇文章的工作是基于t-rex1的工作继续做的&#xff0c;核心亮点&#xff1a; 是支持图片/文本两种模态的prompt进行输入&#xff0c;甚至进一步利用两…

配置git公钥

电脑重置重新配置公钥记录一下供自己观看 打开git bash 输入生成ssh公钥命令 ssh-keygen -t rsa -C your-email 一直回车直到出现 输入查看公钥命令 cat ~/.ssh/id_rsa.pub 复制公钥&#xff0c;打开git设置&#xff0c;找到ssh公钥添加(标题随便命名) 配置完后就可以正常使…

【DataWhale学习】灵境Agent开发——Agent介绍

【DataWhale学习】灵境Agent开发——Agent介绍 ​ 这次我参加了 DataWhale 的灵境Agent开发者训练营&#xff0c;第一次开发了一款属于自己的Agent&#xff0c;整体体验下来&#xff0c;操作还是非常方便的。灵境Agent和Coze上面创建的bot差不多&#xff0c;零代码开发可以仅仅…

QT常见布局器使用

布局简介 为什么要布局&#xff1f;通过布局拖动不影响鼠标拖动窗口的效果等优点.QT设计器布局比较固定&#xff0c;不方便后期修改和维护&#xff1b;在Qt里面布局分为四个大类 &#xff1a; 盒子布局&#xff1a;QBoxLayout 网格布局&#xff1a;QGridLayout 表单布局&am…

双指针(滑动窗口)-算法刷题

一.移动零&#xff08;. - 力扣&#xff08;LeetCode&#xff09;&#xff09; 算法思想 &#xff1a; 设置两个指针left,right&#xff0c;将数组分为三块[0,left]为不为0的元素&#xff0c;[left1,right-1]为0元素&#xff0c;[right,num.size()-1]为未扫描的区域&#xff0c…

Notepad++ 如何调整显示字面大小

在 Notepad 上&#xff0c;可以使用 ctrl 加上鼠标的左键来滚动来进行调整。 如何恢复默 可以使用 Ctrl 加数字键盘上的 / 键 来恢复默认设置。 当然也可以通过菜单栏上 view 菜单下的 Zoom 选项。 上面的界面中可以看到我们的在 Notepad 中使用的选项。 Notepad 如何调整显示…

stm32知识总结--简单复习各部件

目录 内部结构 部件介绍 配置步骤 之前学了很多部件&#xff0c;配置了很多参数&#xff0c;但是没有很系统地把他们连接在一起&#xff0c;今天这个图里简洁描述了资源与资源之间的关系。 内部结构 部件介绍 黑框部分为CPU、内部有一个内核专门处理事件&#xff0c;所有的…

Android Studio 无法下载 gradle-7.3.3-bin.zip

下载新的Android Studio&#xff0c;然后创建新的工程时&#xff0c;出现报错&#xff1a;Could not install Gradle distribution from https://services.gradle.org/distributions/gradle-7.3.3-bin.zip 或者超时&#xff0c;我们可以复制&#xff1a;https://services.grad…

基于Google云原生工程师的kubernetes最佳实践(二)

目录 二、应用部署篇 为deployment打上丰富的label,以便selecting 使用sidecar容器部署agent、proxy等组件 使用init container处理依赖关系,而不要用sidecar 镜像tag使用版本号,不要用latest或空tag 为pod设置readiness和liveness探针 不要给所有服务都使用LoadBalance…

C++实现FFmpeg音视频实时拉流并播放

1.准备工作: 下载rtsp流媒体服务器rtsp-simple-server,安装go开发环境并编译 编译好后启动流媒体服务器 准备一个要推流的mp4视频文件,如db.mp4 使用ffmpeg开始推流 推流命令: ffmpeg -re -stream_loop -1 -i db.mp4 -c copy -rtsp_transport tcp -f rtsp rtsp://192.168.16…

笔记本和台式机主板内部结构分析

笔记本和态势机主板内存接口以及配件安装位置 笔记本主板 1 以thinkpad L-490为例,使用拆机小工具拆机&#xff0c;打开后面板&#xff0c;内部结构示意图如下 台式机主板 以技嘉-B660M-AORUS-PRO-AX型号主板为例 笔记本电脑和台式机电脑的相同之处 CPU&#xff1a;笔记本…

前端学习之css media查询、自定义字体、过度动画、css变换、动画、渐变、多列、字体图标

media查询 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>media查询</title><!-- media查询&#xff1a;根据设备类型不同&#xff1a;比如说打印机、屏幕不同而产生不一样效果格式&#x…

Web安全基础入门+信息收集篇

教程介绍 学习信息收集&#xff0c;针对域名信息,解析信息,网站信息,服务器信息等&#xff1b;学习端口扫描&#xff0c;针对端口进行服务探针,理解服务及端口对应关系&#xff1b;学习WEB扫描&#xff0c;主要针对敏感文件,安全漏洞,子域名信息等&#xff1b;学习信息收集方法…

海外媒体宣发:十大国外中文网站-大舍传媒

十大国外中文网站 1、欧洲时报 覆盖欧洲且较具影响力的华文媒体 国外中文新闻网站&#xff0c;欧洲时报文化传媒集团旗舰日报《欧洲时报》旗下官方网站&#xff0c;总部设在法国巴黎&#xff0c;创刊于1983年&#xff0c;现已成为唯一发行覆盖全欧、发行量最大、最具影响力的华…

每日一题 --- 两两交换链表中的节点[力扣][Go]

两两交换链表中的节点 题目&#xff1a;24. 两两交换链表中的节点 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&a…

算法打卡day15

今日任务&#xff1a; 1&#xff09;110.平衡二叉树 2&#xff09;257. 二叉树的所有路径 3&#xff09;404.左叶子之和 110.平衡二叉树 题目链接&#xff1a;110. 平衡二叉树 - 力扣&#xff08;LeetCode&#xff09; 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树…

隐私计算实训营学习四:SecretFlow的安装和部署

文章目录 一、SecretFlow安装二、SecretFolw部署模式简介三、SecretFlow部署-仿真模式四、SecretFlow部署-生产模式 一、SecretFlow安装 SecretFlow运行要求&#xff1a; Python > 3.8操作系统&#xff1a;CentOS7、Anolis8、Ubuntu 18.04/20.04、macOS 11.1、WSL2资源&am…

共享打印机以及修复脱机状态打印机

title: 共享打印机以及修复脱机状态打印机 search: 2024-03-23 tags: “#共享打印机以及修复脱机状态打印机” 如何将打印机共享在局域网内 Tips&#xff1a;考虑将打印机共享&#xff0c;无非是要考虑两个问题&#xff0c;一个是将打印机作为外设的电脑怎么将打印机共享&…

随机密码生成器源码

源码简介 纯HTML&#xff0c;该去的已去掉&#xff0c;该简化的简化&#xff0c;最高支持32位混合随机密码生成 安装教程 纯HTML&#xff0c;直接将压缩包上传网站目录解压即可 首页截图 源码下载 随机密码生成器源码-小8源码屋源码简介 纯HTML&#xff0c;该去的已去掉&a…