04.Unity Zenject入门到掌握(Zenject的绑定实例Bind)

本文深入介绍了Unity中的Zenject依赖注入框架,详细解析了Zenject的绑定方式,包括各种构造方法,如FromNew、FromInstance、FromMethod等。通过实例和详细解释,帮助读者理解如何在游戏开发中有效地管理对象依赖关系。


绑定说明

所有基于DI(dependency injection)框架都是将类型绑定到实例。在Zenject中,通过绑定到容器来映射引用关系;
但容器应该知道通过什么方式来实例化已经绑定的对象,通过递归解决所有对象的引用关系

过程

当容器请求构建一个类型的实例的时候,通过C#的反射找到需要构造的参数,找到所有被[Inject]标记的成员变量
和属性;挨个去关联引用,然后框架就可以通过构造函数来创建一个新实例

所有Zenject框架设计的游戏必须在代码里面指定所有需要框架管理的引用,通常使用Bind类实现

示例
namespace zenject.bind
{
   
   
    public class ZenjectBind
    {
   
   
        private IBinded mBinded;
        public ZenjectBind(IBinded binded)
        {
   
   
            this.mBinded = binded;
        }
    }

    public class Binded : IBinded
    {
   
   

    }

    public interface IBinded
    {
   
   

    }
}
public void Bind()
{
   
   
     Container.Bind<ZenjectBind>().AsSingle();
     Container.Bind<IBinded>().To<Binded>().AsSingle();
}

每当需要ZenjectBind的时候使用同一个实例对象,自动创建,但有引用到IBind对象,需要绑定IBind,
由于IBind是个接口,需要指定一个实现类


绑定格式

Container.Bind<ContractType>()
    .WithId(Identifier)
    .To<ResultType>()
    .FromConstructionMethod()
    .AsScope()
    .WithArguments(Arguments)
    .OnInstantiated(InstantiatedCallback)
    .When(Condition)
    .(Copy|Move)Into(All|Direct)SubContainers()
    .NonLazy()
    .IfNotBound();
字段表单说明
字段名称 说明 备注 默认值
ContractType 需要绑定的类型 已经绑定的不会再次绑定 NO
ResultType 需要绑定的实例 绑定类型或派生类 ContractType=ToSelf()
Identifier 给予id标识 多个同样用于区分 Default
ConstructionMethod 通过什么方式构建 构建方式 FromNew()
Scope 复用实例的频率 类多处引用实例方式 AsTransient()
Arguments 创建新实例参数 直接给新实例赋值 NO
InstantiatedCallback 创建新实例回调 callback NO
Conditon 条件筛选 满足条件才绑定 NO
(Copy/Move)Into(All/Direct)SubContainers 容器选择 一般不用 NO
NonLazy 直接实例化 绑定即创建 Lazily()
IfNotBound 验正是否已经绑定过 验证ContractType和Identifier NO

构建方法(Construction Methods)

  1. FromNew() - 同过C#的new操作符来创建实例
// These are both the same
Container.Bind<Foo>();
Container.Bind<Foo>().FromNew();
  1. FromInstance() - 通过手动创建一个实例来绑定对象到容器,手动创建的对象不能已经被绑定
Container.Bind<Foo>().FromInstance(new Foo());

// You can also use this short hand which just takes ContractType from the parameter type
Container.BindInstance(new Foo());

// This is also what you would typically use for primitive types
Container.BindInstance(5.13f);
Container.BindInstance("foo");

// Or, if you have many instances, you can use BindInstances
Container.BindInstances(5.13f, "foo", new Foo())
### 关于 UnityBind 函数的使用 在 Unity 的开发过程中,“Bind” 并不是一个特定的标准函数名,而是通常用于描述某种绑定行为的操作。例如,在脚本中绑定事件、绑定 Lua 脚本中的功能、或者通过插件实现某些绑定逻辑(如 OpenGL 纹理绑定或 FFmpeg 绑定)。以下是几种常见的 “Bind” 行为及其具体应用: #### 1. **Lua 脚本绑定** 在 Unity 和 ToLua 集成的情况下,可以通过 `LuaBinder.Bind` 方法来完成 Lua 脚本与 C# 类之间的绑定操作。 ```csharp // 注册绑定 LuaBinder.Bind(lua); string luaScript = @" local GameObject = UnityEngine.GameObject -- 获取类 local MeshRenderer = UnityEngine.MeshRenderer -- 获取类 local newGo = GameObject('obj') -- 创建对象 local go = GameObject.Find('Main') -- 调用静态查找方法 newGo:AddComponent(typeof(MeshRenderer)) -- 添加组件 "; ``` 上述代码展示了如何通过 `LuaBinder.Bind` 将 Lua 脚本环境与 Unity 游戏对象关联起来[^1]。 --- #### 2. **OpenGL 纹理绑定** 当涉及到图形渲染时,可以利用 OpenGL 提供的 `glBindTexture` 来绑定纹理资源到指定的目标上。 ```cpp void glBindTexture(GLenum target, GLuint texture); ``` 此函数的主要作用是将一个已存在的纹理对象绑定至某个目标(如 GL_TEXTURE_2D),以便后续绘制调用能够正确访问该纹理数据[^2]。 示例代码如下: ```cpp GLuint textureID; glGenTextures(1, &textureID); // 生成纹理 ID glBindTexture(GL_TEXTURE_2D, textureID); // 绑定纹理 ``` --- #### 3. **FFmpeg 插件录制视频** 如果需要在 Unity 中集成 FFmpeg 功能,则可能涉及对录制逻辑的初始化以及绑定相关设置。 ```csharp recLogic = GameObject.Find("UICamera").GetComponent<FFmpegREC>(); ``` 这段代码片段说明了如何从场景中找到名为 `"UICamera"` 的游戏对象并获取其上的 `FFmpegREC` 组件实例[^3]。 --- #### 4. **异步编程中的 Select 替代方案** 为了优化性能问题,特别是在频繁检测输入或其他动态变化的数据流时,推荐采用更高效的异步处理方式替代传统的轮询机制。 虽然原始引用提到的是基于 Update 循环的方式存在效率瓶颈[^4],但在现代项目实践中,建议改用协程 (Coroutine) 或者真正的异步 API 实现类似需求。 下面是一个简单的协程例子展示延迟执行的效果: ```csharp IEnumerator DelayedAction() { yield return new WaitForSeconds(2f); // 延迟两秒 Debug.Log("Delayed action executed!"); } StartCoroutine(DelayedAction()); ``` --- ### 结论 综上所述,“Bind” 在不同上下文中具有多种含义和用途。无论是 Lua 脚本交互、OpenGL 图形接口还是第三方工具链支持,都需要根据实际应用场景灵活调整其实现细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值