思考并回答以下问题:
- 什么是依赖注入?有哪几种注入方式?
- 为什么需要IOC容器?直接注入不行吗?
- 自定义特性是什么原理?
引言
使用[Inject]标签,可以根据字段类型自动注入一些数据,方便调用类与类之间的成员和函数,避免重复获取组件。游戏开始只读取一次,就可以直到游戏关闭为止。
使用了自定义特性,首先阅读反射和特性
使用方法
新建XX类,需要挂到Hierarchy面板上任意一个物体。
举个例子,例如先挂到Canvas,需要注入A类。
代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13public class XX : MonoBehaviour
{
void Awake()
{
A a = GameObject.Find(“Canvas”).GetComponent< A >();
EasyInjector.Instance.AddInject(a);
}
void OnDestroy()
{
EasyInjector.Instance.RemoveInject<A>();
}
}
注意一点:必须要说到A类注入成功了,在Awake里面函数,但是如果切换场景时,那就必须要移除A类注入方式,在OnDestroy()函数里面,如果再切回来场景时发现之前注入A类,没有被注销的话,就会导致重复注入A类成功,就会出现其他未知BUG。
使用方式:
由于上面已经讲了如何注入和注销,如何使用首先必须要继承MonoInjected,单独写一个MonoInjected。
代码如下1
2
3
4
5
6
7
8
9// 可注入的Mono基类,所有子类如果复写Awake, 需要base.Awake();
public class MonoInjected : MonoBehaviour
{
protected virtual void Awake()
{
EasyInjector.ReflectionInject(this);
}
}
只允许继承它才可以使用注入标签方式。
比如你A类需要调用B类一些成员,那么代码如下:1
2
3
4
5
6
7
8
9
10
11public class A : MonoInjected
{
[ ]
public B m_b { get; set; }
public void Start()
{
m_b.成员或者函数; // 前提是B类成员和函数得public公开,否则无法调用
}
}
注入工具代码
EasyInjector.cs
1 | using System; |