怎么做一个公司的网站建商城
文章目录
- 前言
 - 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项目了
