当前位置: 首页 > article >正文

Unity 热更新对象绑定的替代方案--StrangeIoC 注入方式

目录

  • 1. 安装StrangeIoC
  • 2. 基本概念
  • 3. 创建Context
  • 4. 绑定接口和实现
  • 5. 使用Mediator
  • 6. 使用Command
  • 7. 热更新对象绑定的替代方案
    • 7.1 动态绑定
    • 7.2 使用反射
    • 7.3 使用配置文件
  • 8. 总结

在Unity中,使用StrangeIoC(一个轻量级的依赖注入框架)可以有效地管理对象和组件的绑定关系,特别是在热更新场景中。以下是详细的StrangeIoC注入方式以及如何将其用作热更新对象绑定的替代方案。

1. 安装StrangeIoC

首先,在Unity项目中安装StrangeIoC。通过以下几种方式安装:
• 通过Unity Package Manager:
• 打开Unity的Package Manager。
• 点击“+”按钮,选择“Add package from git URL”。
• 输入StrangeIoC的Git URL:https://github.com/strangeioc/strangeioc.git。
• 点击“Add”。
• 手动下载并导入:
• 访问StrangeIoC GitHub页面。
• 下载最新的release版本。
• 将下载的文件解压并导入到Unity项目中。

2. 基本概念

在使用StrangeIoC之前,了解一些基本概念:
Context:管理依赖注入的容器。
Binder:用于绑定接口和实现。
Mediator:用于将视图(UI)与业务逻辑分离。
Command:用于处理业务逻辑。
Signal:用于事件驱动的通信。

3. 创建Context

Context是StrangeIoC的核心,用于管理依赖注入。你需要创建一个自定义的Context来绑定你的对象和组件。
• 创建Context类:

using UnityEngine;
using strange.extensions.context.impl;

public class GameContext : MVCSContext
{
    public GameContext(MonoBehaviour view) : base(view)
    {
    }

    protected override void mapBindings()
    {
        // 绑定接口和实现
        injectionBinder.Bind<IPlayerController>().To<PlayerController>().ToSingleton();

        // 绑定Mediator
        mediationBinder.Bind<PlayerView>().To<PlayerMediator>();

        // 绑定Command
        commandBinder.Bind<StartSignal>().To<StartCommand>();
    }
}

• 创建启动脚本:

using UnityEngine;

public class ContextView : MonoBehaviour
{
    void Awake()
    {
        new GameContext(this);
    }
}

• 将ContextView附加到场景中的一个GameObject:
• 创建一个新的GameObject,例如ContextView。
• 将ContextView脚本附加到该GameObject上。

4. 绑定接口和实现

在mapBindings方法中,你可以绑定接口和实现。例如,绑定IPlayerController接口到PlayerController实现。
• 定义接口:

public interface IPlayerController
{
    void Move(Vector3 direction);
}

• 实现接口:

using UnityEngine;

public class PlayerController : MonoBehaviour, IPlayerController
{
    public void Move(Vector3 direction)
    {
        transform.position += direction * Time.deltaTime;
    }
}

5. 使用Mediator

Mediator用于将视图(UI)与业务逻辑分离。
• 创建视图:

using UnityEngine;

public class PlayerView : MonoBehaviour
{
    public void MovePlayer(Vector3 direction)
    {
        // 触发移动操作
    }
}

• 创建Mediator:

using strange.extensions.mediation.impl;
using UnityEngine;

public class PlayerMediator : Mediator
{
    [Inject]
    public PlayerView view { get; set; }

    [Inject]
    public IPlayerController playerController { get; set; }

    public override void OnRegister()
    {
        view.MovePlayer += HandleMovePlayer;
    }

    public override void OnRemove()
    {
        view.MovePlayer -= HandleMovePlayer;
    }

    private void HandleMovePlayer(Vector3 direction)
    {
        playerController.Move(direction);
    }
}

6. 使用Command

Command用于处理业务逻辑。
• 创建Signal:

using strange.extensions.signal.impl;

public class StartSignal : Signal
{
}

• 创建Command:

using strange.extensions.command.impl;
using UnityEngine;

public class StartCommand : Command
{
    [Inject]
    public IPlayerController playerController { get; set; }

    public override void Execute()
    {
        // 初始化玩家控制器
        playerController.Move(Vector3.forward);
    }
}

• 触发Signal:

using strange.extensions.context.impl;
using UnityEngine;

public class GameContext : MVCSContext
{
    public GameContext(MonoBehaviour view) : base(view)
    {
    }

    protected override void mapBindings()
    {
        injectionBinder.Bind<IPlayerController>().To<PlayerController>().ToSingleton();
        mediationBinder.Bind<PlayerView>().To<PlayerMediator>();
        commandBinder.Bind<StartSignal>().To<StartCommand>();

        // 触发StartSignal
        injectionBinder.GetInstance<StartSignal>().Dispatch();
    }
}

7. 热更新对象绑定的替代方案

在热更新场景中,StrangeIoC可以提供更灵活和动态的对象绑定方式。以下是一些具体的替代方案:

7.1 动态绑定

StrangeIoC允许你在运行时动态地绑定对象和组件。
• 动态绑定示例:

using strange.extensions.context.impl;
using UnityEngine;

public class GameContext : MVCSContext
{
    public GameContext(MonoBehaviour view) : base(view)
    {
    }

    protected override void mapBindings()
    {
        // 动态绑定
        injectionBinder.Bind<IPlayerController>().To<PlayerController>().ToSingleton();
        mediationBinder.Bind<PlayerView>().To<PlayerMediator>();
        commandBinder.Bind<StartSignal>().To<StartCommand>();

        // 动态绑定其他对象
        injectionBinder.Bind<IEnemyController>().To<EnemyController>().ToSingleton();
        mediationBinder.Bind<EnemyView>().To<EnemyMediator>();
        commandBinder.Bind<EnemySpawnSignal>().To<EnemySpawnCommand>();
    }
}

7.2 使用反射

虽然StrangeIoC提供了强大的依赖注入功能,但在某些情况下,你可能需要使用反射来动态地获取和设置对象的字段和属性。
• 反射示例:

using System.Reflection;
using UnityEngine;

public class Example : MonoBehaviour
{
    private IPlayerController playerController;

    void Start()
    {
        // 假设 playerController 是通过某种方式获取的
        playerController = FindObjectOfType<PlayerController>();

        // 使用反射设置字段
        FieldInfo fieldInfo = typeof(Example).GetField("playerController", BindingFlags.NonPublic | BindingFlags.Instance);
        if (fieldInfo != null)
        {
            fieldInfo.SetValue(this, playerController);
        }

        if (playerController != null)
        {
            // 使用 playerController
        }
    }
}

7.3 使用配置文件

通过配置文件(如 JSON、XML 等)来定义对象和组件的绑定关系,然后在运行时读取配置文件并进行绑定。
• 创建配置文件:

{
    "bindings": [
        {
            "target": "Example",
            "field": "playerController",
            "type": "PlayerController"
        }
    ]
}

• 读取配置文件并绑定:

using System.Collections.Generic;
using System.IO;
using UnityEngine;
using Newtonsoft.Json;

public class BindingConfig
{
    public List<BindingEntry> bindings;
}

public class BindingEntry
{
    public string target;
    public string field;
    public string type;
}

public class Example : MonoBehaviour
{
    private IPlayerController playerController;

    void Start()
    {
        string configPath = "Assets/BindingConfig.json";
        string json = File.ReadAllText(configPath);
        BindingConfig config = JsonConvert.DeserializeObject<BindingConfig>(json);

        foreach (var binding in config.bindings)
        {
            if (binding.target == "Example" && binding.field == "playerController")
            {
                playerController = FindObjectOfType<PlayerController>();
                FieldInfo fieldInfo = typeof(Example).GetField(binding.field, BindingFlags.NonPublic | BindingFlags.Instance);
                if (fieldInfo != null)
                {
                    fieldInfo.SetValue(this, playerController);
                }
            }
        }

        if (playerController != null)
        {
            // 使用 playerController
        }
    }
}

8. 总结

• StrangeIoC 提供了强大的依赖注入功能,适用于复杂的项目和热更新场景。
• 动态绑定 允许你在运行时动态地绑定对象和组件。
• 反射 提供了更大的灵活性,但性能可能较低。
• 配置文件 提供了一种灵活的方式来定义和管理对象绑定关系。

通过使用StrangeIoC,你可以在热更新场景中更灵活地管理对象和组件的绑定关系,从而提高代码的可维护性和可扩展性。


http://www.kler.cn/a/511451.html

相关文章:

  • 1.7 ChatGPT:引领AI对话革命的致胜之道
  • Nginx:通过upstream进行代理转发
  • 【王树森搜素引擎技术】相关性03:文本匹配(TF-IDF、BM25、词距)
  • Linux高级--3.3.1 C++ spdlog 开源异步日志方案
  • leetcode-买卖股票问题
  • ScratchLLMStepByStep:训练自己的Tokenizer
  • 计算机毕业设计Python+卷积神经网络租房推荐系统 租房大屏可视化 租房爬虫 hadoop spark 58同城租房爬虫 房源推荐系统
  • 3D线上会议:打破空间限制,重塑会议未来
  • 管理口令安全和资源(二)
  • CSS笔记基础篇01——选择器、文字控制属性、背景属性、显示模式、盒子模型
  • HTTP/2 与 HTTP/3 的新特性
  • Matlab总提示内存不够用,明明小于电脑内存
  • DilateFormer: Multi-Scale Dilated Transformer for Visual Recognition 中的空洞自注意力机制
  • ACL基础理论
  • 跨境电商使用云手机用来做什么呢?
  • 网络系统管理Linux环境——ROUTERSRV之SSH
  • 怎么在iPhone手机上使用便签进行记录?
  • 在亚马逊云科技上高效蒸馏低成本、高精度的Llama 3.1 405B模型(上篇)
  • QT 使用OpenGL显示并查看点云图
  • LabVIEW 水电站厂内经济运行系统
  • Spring Security 6.X + JWT + RBAC 权限管理实战教程(上)
  • Redis 在项目中的实战应用与复盘
  • CSS中样式继承+优先级
  • 本地ocr实现监听屏幕弹窗并进行邮箱通知
  • java微服务的异常
  • 【MathType】mathtype在word中格式问题