C#委托

在游戏中有一些需要经常使用的函数,比如加载Perfab,封装成接口:

 //生成Perfab接口函数, 参数为路径 + 父物体 + 位置
    public Transform GenerateObjects(string path, GameObject Parent, Transform Destination){
        Object perfab = Resources.Load(path, typeof(GameObject));
        GameObject Perfab = Instantiate(perfab) as GameObject;
        Perfab.transform.SetParent(Parent.transform, false);
        Perfab.transform.position = Destination.position;
        return Perfab.transform;
    }

接口函数可以交付给委托来执行,
声明委托:

 public delegate Transform GeneratePerfab (string s,GameObject g,Transform t);
 public GeneratePerfab gPerfab;

在Start中注册函数:

 void Start()
    {
        gPerfab = new GeneratePerfab (GenerateObjects);
    }

使用委托(一般不在外部调用委托):

 Transform portrait = chooseCard.GetComponent<Interface>().gPerfab(portrait_path, this.transform.GetChild(32).gameObject, this.transform.GetChild(k++));

Action和Func委托:
除了上面例子中的简单委托,C#提供了两类预定义好的委托类型Action和Func,两种都支持泛型。Action委托没有返回值,Func泛型参数列表的最后一个是返回值类型。

多播委托: 可以按顺序调用多个方法的委托,返回值类型一般声明为void,使用”+=“和”-=“添加或删除方法,多播委托只能得到最后一个方法返回的结果。
逐个调用多播委托中的方法:

Action a1 = Method1;
a1+=Method2;

Delegate[] delegates=a1.GetInvocationList();
foreach(delegate d in delegates){
	//d();
	d.DynamicInvoke(null);
}

匿名方法: 将一个没有名字的方法赋值给委托

Func<int,int,int> plus = delegate (int a,int b){
	int temp = a+b;
	return temp;
};

作用:减少代码量,降低复杂性,一般用来做回调

Lambda表达式:
相当于匿名方法的简写形式,如把上面的改写成Lambda表达式,最大的特点是参数不需要声明类型:

Func<int,int,int> plus = (a,b)=>{ int temp= a+b;return temp; };

另外只有一个参数的话可以省略括号,方法体只有一句话可以省略大括号。

C#事件机制:
事件基于委托,本质是private委托(不能由外部调用)。
事件的声明,事件只能声明为类的成员,不能再方法中声明:
public event + 委托类型 + 事件名,事件依然可以使用”+=“或”-=“添加或删除方法。
事件的定义相当于发布了一条消息,在事件中添加方法看作”订阅消息“。
事件和方法的主要区别在于:
事件只能内部调用,不能外部触发。

观察者模式:
被观察者和观察者:当观察者发现被观察者状态改变时,会触发事件的执行。典型就是游戏中按钮的点击,按钮是被观察者,观察者则是资源管理器或其他。
观察者模式通常基于事件机制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值