delegate(委托)是函数的容器,会定义一个函数的模板。
csharp
public delegate void xxxx()
Event(事件)本质上也是Delegate,但是赋值的权限设置成了Private
csharp
public event xxxx delegate1()
Action是delegate的简写,是C#给我们封装好的一种写法
csharp
public Action xxxx()
Func既可以执行函数,也可以获得返回值,其括号内最后一个类型就是返回值
delegate
例子:
csharp
public delegate void Help(int a); // 委托(函数的容器)
csharp
public class testooo : Singleton<testooo>
{
public Help p; // 将委托实例化
public void Hello(int a)
{
Debug.Log(a);
}
}
csharp
public class TestSendMsg : MonoBehaviour
{
void Start()
{
Help p;
p = testooo.Instance.Hello;
p?.Invoke(1008666);
}
}
Action
其实就是C#把定义委托和将委托实例化封装成一句代码了,效果是一样的:
csharp
public class testooo : Singleton<testooo>
{
public Action<int> p; // 同时定义委托和将委托实例化
public void Hello(int a)
{
Debug.Log(a);
}
}
csharp
public class TestSendMsg : MonoBehaviour
{
void Start()
{
Action<int> p;
p = testooo.Instance.Hello;
p?.Invoke(1008666);
}
}
event:
csharp
public delegate void Help(int a); // 委托(函数的容器)
csharp
public class testooo : Singleton<testooo>
{
public event Help p; // 将委托实例化
private void Start()
{
p = Hello;
p?.Invoke(1);
}
public void Hello(int a)
{
Debug.Log(a);
}
}
在其它类中无法对testooo类的p进行赋值。
csharp
public class TestSendMsg : MonoBehaviour
{
Help p;
void Start()
{
testooo.Instance.p = eee; // 这是会报错的
}
}
Func:
csharp
public class testooo : Singleton<testooo>
{
public Func<int, int> p; // 将委托实例化
public void Start()
{
p = Hello;
Debug.Log("^^^^^^^^^^^^^^^^^^^^");
}
public int Hello(int a)
{
return a * 10;
}
}
csharp
public class TestSendMsg : MonoBehaviour
{
void Start()
{
testooo.Instance.Start();//因为是不继承mono的单例所以要调用一下
Debug.LogError(testooo.Instance.p(1));
}
}
输出结果:
10
注意:继承mono的单例中的生命周期方法(Awake,Start,Update)都是走的unity的生命周期。但是如果单例没有继承mono,那么它的这些方法就不会被自动调用,没法走生命周期。