文章目录
- 前言
- 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项目了