网站开发设计工程师岗位职责,六安建六安建设网站,wordpress豆瓣小站,公司网站开发主流语言文章目录 前言GodotProjectDir is null解决方法解决警告问题根本解决代码问题测试引用其实其它库的输出路径无所谓。 工程化范例环境命名规范Nuget项目结构架构代码ISceneModelIOC服务 测试GD_Extension 通用扩展TestUtils GD_ProgramTestServiceMainSceneModel Godot对应的脚本… 文章目录 前言GodotProjectDir is null解决方法解决警告问题根本解决代码问题测试引用其实其它库的输出路径无所谓。 工程化范例环境命名规范Nuget项目结构架构代码ISceneModelIOC服务 测试GD_Extension 通用扩展TestUtils GD_ProgramTestServiceMainSceneModel 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 这个是解决警告问题。
PropertyGroupIsGodotToolsProjecttrue/IsGodotToolsProject
/PropertyGroup根本解决代码问题
添加输出路径
$(GodotProjectDir).godot\mono\temp\bin\PropertyGroupGodotProjectDir../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 毫秒)。
1ClassLibrary1 - D:\workspace\program\Godot Game\Train\Test18\Godot\.godot\mono\temp\bin\Debug\net6.0\ClassLibrary1.dll
2------ 已启动全部重新生成: 项目: Test18, 配置: Debug Any CPU ------
2Test18 - 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(需要手动更改)window10visual studio 2022
命名规范 Nuget 项目结构 依赖关系从底层开始
Godot_Extension-Godot_Program-Godot
架构代码
架构代码主要是在GD_Program里面。因为IOC容器时在GD_Program里面。
ISceneModel
/// summary
/// SceneModel的基类
/// /summary
public abstract class ISceneModel
{/// summary/// 挂载场景强制Node2D/// /summarypublic Node2D? Sence { get; set; }/// summary/// 打包场景用于生成/// /summarypublic PackedScene? PackedScene { get; set; }/// summary/// 重载Ready事件/// /summarypublic abstract void Ready();/// summary/// 重载Process事件/// /summary/// param namedelta/parampublic abstract void Process(double delta);/// summary/// 方便加载场景/// /summary/// param namesceneName/parampublic virtual void SetPackedScene(string sceneName){var targetName sceneName.Replace(Scene, );var url $res://Scenes//{targetName}.tscn;GD.Print($加载PackedScene,{sceneName}:{url});PackedScene ResourceLoader.LoadPackedScene(url);}}IOC服务 public class Program{/// summary/// IOC容器/// /summarypublic static IServiceProvider Services ConfigureServices();/// summary/// Configures the services for the application./// /summaryprivate static IServiceProvider ConfigureServices(){var builder new ServiceCollection();AddServices(builder);AddSceneModel(builder);return builder.BuildServiceProvider();}/// summary/// 添加服务应以Singleton形式添加/// /summary/// param nameservice/parampublic static void AddServices(ServiceCollection builder){builder.AddSingletonTestService();}/// summary/// 添加SceneModel应以Transient添加/// /summary/// param nameservice/parampublic static void AddSceneModel(ServiceCollection builder){//比如//builder.AddTransientMainSceneModel();}}测试
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.GetServiceMainSceneModel();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项目了