0
点赞
收藏
分享

微信扫一扫

flutter 父组件调用子组件方法

皮皮球场 4小时前 阅读 1

文章目录

前言

Godot 项目工程化上有一朵乌云,我看Godot的Visual Studio 项目的时候,发现如果是手动新建项目导入Godot包,会导致编译的warning,这个虽然不影响正常运行,但是有warining还是不不爽,这次彻底解决他。

GodotProjectDir is null

出现这个问题的原因是,我想分项目开发

在这里插入图片描述
然后会报warning
在这里插入图片描述
所以我之前的项目封装,是放在一个文件家里的,非常的丑陋
在这里插入图片描述

解决方法

先把这三个先装上
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

解决警告问题

GitHub上面找了一圈,找到了解决方案

在这里插入图片描述
这个是解决警告问题。

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

举报

相关推荐

0 条评论