Godot 学习笔记(3):IOC容器注入,以NlogServices为例

news2024/11/15 23:18:19

文章目录

  • 前言
  • 环境
  • 注意事项
  • Ioc注入
    • 文件夹设置
    • Service服务搭建
      • Nlog.config
      • NlogService配置
      • ButtonTest1Service控制反转
      • Program主入口
      • ButtonTest1从Ioc中获取服务
    • 输出
    • 生命周期问题
  • 总结

前言

Godot.Net中使用IOC之后,Godot的代码将会被极大的解耦。这里不不展开说明IOC的优点。

Godot Engine 4.2 简体中文文档 最佳实践 场景组织

.NET Core 依赖注入 Microsoft.Extensions.DependencyInjection

C# IOC 容器实战:KeyedService和生命周期

.NET 控制台NLog 使用

Godot 添加Nuget 引用

环境

  • visual studio 2022
  • .net core 8.0
  • godot 4.2.1
  • window 10

Nuget

在这里插入图片描述
在这里插入图片描述

注意事项

  • 我们每次visual Studio 写完代码后,一定要重新生产解决方案。不然会导致无法更新。
  • 我们可以在需要隐藏的文件夹中添加.gdignore,这样我们就能忽略多余的Csharp文件夹
  • 在绑定C# 脚本代码后,一定不能再次修改脚本代码的名字,不然会导致加载场景出现问题,整个场景彻底打不开。

Ioc注入

在这里插入图片描述
在这里插入图片描述

文件夹设置

在这里插入图片描述
这里建议手写,因为自动生成的代码是没有命名空间的。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Service服务搭建

Nlog.config

详细的可以参考这个

.NET 控制台NLog 使用

我们在根路径下面添加Nlog.config
在这里插入图片描述

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
  <targets>
    <!--将Debug导出为每小时一个-->
    <target name="debug"
            xsi:type="File"
            fileName="${basedir}/Logs/${date:format=yyyy}/${date:format=MM}/${date:format=dd}/${date:format=HH}.log"
            layout="${date:format=yyyy-MM-dd HH\:mm\:ss} [${uppercase:${level}}] : ${message}" />
    <!--将Error导出为每天一个,而且存放在一个Error文件夹中-->
    <target name="error"
            xsi:type="File"
            fileName="${basedir}/Logs/${date:format=yyyy}/${date:format=MM}/Error/${date:format=dd}.log"
            layout="${date:format=yyyy-MM-dd HH\:mm\:ss} [${uppercase:${level}}] : ${message}" />
  </targets>


  <rules>
    <logger name="*"
            minlevel="Debug"
            writeTo="debug" />

    <logger name="*"
        minlevel="Error"
        writeTo="error" />
  </rules>
</nlog>

在这里插入图片描述
在这里插入图片描述

NlogService配置

public class NlogServices
{
    private Logger logger;

    public NlogServices()
    {
        var url = string.Format("{0}NLog.config", AppDomain.CurrentDomain.BaseDirectory.ToString());
        GD.Print($"url地址为{url}");
        LogManager.Configuration = new XmlLoggingConfiguration(url);
        
        logger = NLog.LogManager.GetCurrentClassLogger();
    }

    public void Debug(string msg)
    {
        GD.Print(msg);
        logger.Debug(msg);
    }

    public void Info(string msg)
    {
        GD.Print(msg);
        logger.Info(msg);

    }

    public void Error(string msg)
    {
        GD.Print(msg);

        logger.Error(msg);
    }

    public void Warning(string msg)
    {
        GD.Print(msg);
        logger.Warn(msg);
    }

}

ButtonTest1Service控制反转

我们应该在ButtonTest1Service中将ButtonTest1场景脚本对象获取。

    public class ButtonTest1Service
    {

        private NlogServices _nlogService;
        private ButtonTest1 _buttonTest1;
        public ButtonTest1Service(NlogServices nlogServices) {
            _nlogService = nlogServices;
            
        }

        public void Start(ButtonTest1 buttonTest1)
        {
            _buttonTest1 = buttonTest1;

            _buttonTest1.ButtonDown += () =>
            {
                _nlogService.Info("依赖注入成功!");
            };
        }
        
    }

Program主入口

我们应该有个主入口,我这里的主入口是Program.cs
在这里插入图片描述

    public static class Program
    {

        public static IServiceProvider Services  = ConfigureServices();
        /// <summary>
        /// Configures the services for the application.
        /// </summary>
        private static IServiceProvider ConfigureServices()
        {
            var services = new ServiceCollection();
            services.AddSingleton<NlogServices>();
            services.AddTransient<ButtonTest1Service>();

            return services.BuildServiceProvider();
        }

    }

ButtonTest1从Ioc中获取服务

public partial class ButtonTest1 : Button
{
	// Called when the node enters the scene tree for the first time.


	public ButtonTest1Service SenceSerivce { get; set; }
	public override void _Ready()
	{
		//获取Ioc容器
		SenceSerivce = Program.Services.GetService<ButtonTest1Service>();
		//Ioc控制反转,将本身添加到Start中
		SenceSerivce.Start(this);
    }

	// Called every frame. 'delta' is the elapsed time since the previous frame.
	public override void _Process(double delta)
	{
	}

}

输出

因为我们已经在Service里面注册了按钮事件,所以我们直接使用即可。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

生命周期问题

我更建议将Ioc注入放在构造函数而不是Ready里面,因为我们一般会在Ready里面去获取Node子节点。可能会有一个生命周期冲突的问题。

在这里插入图片描述

总结

Ioc容器会极大的解决Godot的代码的耦合问题。我们这次是添加了Nlog日志服务。我们后面还可以添加网络服务,数据库服务,文件加载服务等。这个极大的降低了我们代码的耦合。让我们更加专心的解决代码。

SencesScirpt和SenceSerivces的分开,也是功能和职责的分开。SencesScirpt更加注重Godot的生命周期,比如Ready(), Process等生命周期。SenceSerivces更加注重根本的代码逻辑。

我应该基本已经解决了大部分的代码问题。我后面应该就是开始认真的开发游戏了。目前打算从贪吃蛇,推箱子等经典游戏入手。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【大模型】直接在VS Code(Visual Studio Code)上安装CodeGeeX插件的过程

文章目录 一、什么是CodeGeeX&#xff08;一&#xff09;我理解的CodeGeeX&#xff08;二&#xff09;优缺点 二、CodeGeex下载、安装、注册&#xff08;一&#xff09;安装VS Code(Visual Studio Code)&#xff08;二&#xff09;下载安装CodeGeeX&#xff08;三&#xff09;注…

SpringBoot中使用验证码easy-captcha

easy-captcha使用的大概逻辑: 当一个请求发送到后端服务器请求验证,服务器使用easy-captcha生成一个验证码图片,并通过session将验证信息保存在服务器,当用户登录校验时候,会从ession中取出对比是否一致 但是前后端分离之后 由于跨域问题 以上就无法实现了 下面这种情况没…

Trait与生命周期

原文链接&#xff1a;(*∇&#xff40;*) 咦,又好了~ Rust – xiaocr_bloghttp://www.xiaocr.fun/index.php/2024/03/18/trait%E4%B8%8E%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F/ 目录 Trait 定义trait 默认实现 trait作为参数 Trait Bound语法 通过指定多个 trait bound …

B003-springcloud alibaba 服务治理 nacos discovery ribbon feign

目录 服务治理服务治理介绍什么是服务治理相关方案 nacos实战入门搭建nacos环境安装nacos启动nacos访问nacos 将商品微服务注册进nacos将订单微服务注册进nacos订单服务通过nacos调用商品服务 实现服务调用的负载均衡什么是负载均衡代码实现负载均衡增加一个服务提供者自定义实…

【CKA模拟题】掌握Pod日志输出的秘密

题干 For this question, please set this context (In exam, diff cluster name) 对于这个问题&#xff0c;请设置这个上下文(在考试中&#xff0c;diff cluster name) kubectl config use-context kubernetes-adminkubernetes product pod is running. when you access log…

flask之ssti [WesternCTF2018]shrine1

打开题目 整理一下&#xff0c;代码: import flask import osapp flask.Flask(__name__) app.config[FLAG] os.environ.pop(FLAG) app.route(/)def index():return open(__file__).read()app.route(/shrine/)def shrine(shrine):def safe_jinja(s):s s.replace((, ).replac…

无人机三维建模过程中注意事项

无人机三维建模是指利用无人机技术进行三维建模&#xff0c;该方法通过无人机搭载的多种传感器&#xff0c;如摄像头、激光扫描仪等&#xff0c;获取建筑物的多角度影像数据&#xff0c;然后利用计算机视觉技术和三维重建算法&#xff0c;将这些影像数据转化为高精度的三维模型…

微服务技术栈SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式(五):分布式搜索 ES-下

文章目录 一、数据聚合1.1 聚合种类1.2 DSL实现聚合1.3 RestAPI实现聚合1.4 演示&#xff1a;多条件聚合 二、自动补全2.1 拼音分词器2.2 自定义分词器2.3 DSL自动补全查询2.5 实现酒店搜索框自动补全2.5.1 修改酒店索引库数据结构2.5.2 RestAPI实现自动补全查询2.5.3 实战 三、…

Docker部署Django项目——基础

1.服务器配置 1.1centos7 系统的安装 centos-7-isos-x86_64安装包下载) VMware安装自定义配置 选择对应的系统镜像 一般选择内核4核、内存8g、硬盘80g 相关配置 1.2.网络配置 1.2.1查看win电脑虚拟机VMnet8的ip 使用ipconfig查看虚拟机的ip 1.2.2配置虚拟机VMnet8的ip…

196基于matlab的计算器GUI可视化

基于matlab的计算器GUI可视化&#xff0c;具有加减乘除功能。可作为练习使用。程序已调通&#xff0c;可直接运行。 196 matlab GUI可视化 计算器 - 小红书 (xiaohongshu.com)

Flutter-数字切换动画

效果 需求 数字切换时新数字从上往下进入&#xff0c;上个数字从上往下出新数字进入时下落到位置并带有回弹效果上个数字及新输入切换时带有透明度和缩放动画 实现 主要采用AnimatedSwitcher实现需求&#xff0c;代码比较简单&#xff0c;直接撸 import dart:math;import p…

html-docx-js-typescript——将html生成docx文档

html-docx-js-typescript源码&#xff1a;GitHub - caiyexiang/html-docx-js-typescript: Convert HTML documents to docx format. html-docx-js地址&#xff1a;html-docx-js - npm *简单使用&#xff1a; 获取需要转为word文档的html节点&#xff0c;借助file-saver提供的…

MacBook远程桌面Windows使用Microsoft Remote Desktop for Mac_亲测使用

MacBook远程桌面Windows使用Microsoft Remote Desktop for Mac_亲测使用 像Windows上有自带的远程桌面连接软件.MacBook没有自带的远程连接Windows桌面的工具,需要安装软件来实现. 像远程桌面控制软件一般有 TeamViewer、向日葵远程控制, ToDesk, Microsoft Remote Desktop f…

Go语言gin框架中加载html/css/js等静态资源

Gin框架没有内置静态文件服务&#xff0c;但可以使用gin.Static或gin.StaticFS中间件来提供静态文件服务。 效果图如下&#xff1a; 一、gin 框架加载 Html 模板文件的方法 方式1&#xff1a;加载单个或多个html文件&#xff0c;需要指明具体文件名 r.LoadHTMLFiles("vie…

数字创新的引擎:探索Web3的前沿科技和商业模式

随着数字化时代的不断发展&#xff0c;Web3作为下一代互联网的重要组成部分&#xff0c;正逐渐成为数字创新的引擎。本文将深入探讨Web3的前沿科技和商业模式&#xff0c;揭示其在数字创新领域的重要作用和潜力。 1. 区块链技术的革命性 Web3的核心是区块链技术&#xff0c;它…

Flutter-自定义图片3D画廊

效果 需求 3D画廊效果 设计内容 StackGestureDetectorTransformPositioned数学三角函数 代码实现 具体代码大概300行 import dart:math;import package:flutter/material.dart; import package:flutter_xy/widgets/xy_app_bar.dart;import ../../r.dart;class ImageSwitc…

【活动】政府工作报告视角下的计算机行业发展前瞻与策略探讨

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 引言正文计算机行业在政府工作报告中的定位与发展态势政策导向解析未来机遇展望…

【uniapp】表单验证不生效的解决方案

表单验证这个常见的功能&#xff0c;明明在element ui等框架已经用的很熟了&#xff0c;在uniapp开发时还是处处碰壁&#xff1f;这篇文章我会提示uni-forms表单验证的几个注意点&#xff0c;帮助大家排查。 示例 下面是一份包含普通验证和自定义验证的示例&#xff1a; <…

vsto excel 插件注册表属性值含义

在 VSTO (Visual Studio Tools for Office) 中&#xff0c;LoadBehavior 是用于指定 Office 插件加载行为的一个属性。具体含义如下&#xff1a; - LoadBehavior 0&#xff1a;此值表示插件已被禁用&#xff0c;将不会加载。 - LoadBehavior 1&#xff1a;此值表示插件将在 O…

Sentinel基础使用

1. 概念解释 限流&#xff1a;对并发访问进行限速。限流的一些行为&#xff1a; 1. 拒绝服务&#xff1a;将多余的请求直接拒绝掉2.服务降级&#xff1a;降级甚至关闭后台的某些服务3.特权请求&#xff1a;在多租户或者对用户进行分级时&#xff0c;考虑让特权用户进行访问4.延…