Unity—委托

每日一句:同是风华正茂,怎能甘拜下风

目录

什么是委托?

自定义委托的声明

可以用【Action委托】和【Func委托】来声明委托(两个内置的委托类型)

使用委托【间接调用】方法比【直接调用】好在哪里?

委托的缺点:

模板方法

回调方法


什么是委托?

一种类,引用类型,可以存储/封装一个,或多个方法的引用

(委托有参数列表和返回值类型),

当实例化委托后,即创建委托的实例

这个委托类型的实例,可以和任何其他方法相关联起来,即可以存储这些方法的引用只要类型兼容(类型兼容:任何方法的签名和返回值委托类型的签名和返回值保持一致),

可以通过委托类型的实例(对象)间接调用这些方法。

【现实】世界(具体)

有一件事情,不亲自去做,而是交给别人替我去做那些本来该我做的事情。

【程序】世界(抽象)

有一个或多个方法,这些方法不需要亲自的直接调佣,而是赋值给委托类型的变量委托类型的变量将会存储这几个方法

委托会指向这几个方法,由委托类型的变量来【间接的调用】这些方法

委托为何重要?

  1. 面试
  2. 事件的基础是委托,Lambda表达式基础也是委托,Lambda是LINQ的基础

自定义委托的声明

public delegate void MyDelegate();

void 目标方法的返回值类型(目标方法;委托可以指向的方法)

(类似于C语言的声明一个函数指针,C#由C++发展而来,通过委托,保留了与函数指针相对应的部分内容)

public delegate void MyDelegate();//声明委托类型

MyDelegate myDelegate;//声明委托类型的变量间接的调用方法

void OnEnable()

{//单播委托

myDelegate=new MyDelegate(Teleport);//创建一个委托类型的实例,将方法赋值到委托类型

的变量中

委托myDelegate指向的目标方法是一个[参数列表为空][返回值为void类型]的方法【目标兼容】

//myDelegate=Teleport;(简化)更加清楚表达出将Teleport方法赋值给委托类型的变量myDelegate中

//myDelegate=new MyDelegate(ChangeColor);

//多播委托

myDelegate+=ChangeColor;

//myDelegate=ChangeColor;//会覆盖掉之前的方法

myDelegate+=Log;

}

void Update()

{ myDelegate();

//myDelegate.Invoke();

}

void Teleport()

{}

void ChangeColor()

{}

委托引用一个实例方法(隶属于一个对象,这个对象必须存在内存中)

可以用【Action委托】和【Func委托】来声明委托(两个内置的委托类型)

Action action01;

Func<string,string> func01;//目标方法的参数列表类型,返回值类型

Func<double,double,double>(Add);//Add(double(double,double))

private void OnEnable()

{ action01=new Action(Teleport);

 func01=new Func<string>(Log);

 func02=new Func<double,double,double>(Add);

}

void Teleport()

{}

string Log()

{}

double Add(double _num1,double _num2)

{}

void Start()

{ anction01();

 func01();

 func02(2.2f,3.8f);//方法的参数

}

使用委托【间接调用】方法比【直接调用】好在哪里?

委托可以封装任意一个与之类型兼容的方法

Action委托:一定指向一个【无返回值】的方法,至于参数列表,可有可无,最多16个

Funct委托:一定指向一个【有返回值】的方法,至于参数列表,可有可无,最多16个

委托的缺点:

难精通+易使用+功能强大,一旦别滥用则后果非常严重

  1. 一种方法级别的紧耦合,实现工作慎之
  2. 可读性下降,debug难度增加
  3. 把委托回调,异步调用和多线程纠缠在一起,让代码难以阅读
  4. 使用不当,可能造成内存泄漏和程序性能下降和维护

模板方法

有一处不确定的,其余代码都是确定好的,这个不确定的部分,就靠传进来的委托类型的参数所包含的这个方法来填补,所以一定是有返回值Func<T>委托类型的参数方法

回调方法

以回调方法形式使用【委托】根据逻辑,动态选择是否调用

委托是一个引用类型,将委托当作方法的参数,传递到别的方法中,间接的去调用委托所封装的方法,从而形成动态调用方法的代码结果

//以上内容听B站宝藏Up主—BeaverJoe的课,做的学习笔记

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity 是一款流行的游戏引擎,它提供了丰富的开发工具和功能,可以用于开发各种类型的游戏和应用程序。 在 Unity 中,委托(Delegate)是一种重要的编程概念,它允许程序员将方法作为参数传递,并通过委托来调用这些方法。 在这个问题中,如果我们有一个委托叫做 greetpeople,我们可以使用 Unity 引擎的相关 API 来实现 greetpeople 这个委托。 首先,我们需要定义 greetpeople 的委托类型。可以使用以下代码: ``` public delegate void GreetPeopleDelegate(string name); ``` 接下来,我们可以编写一个方法作为 greetpeople 的实现,例如: ``` public void Greet(string name) { Debug.Log("Hello, " + name + "!"); } ``` 在这个例子中,我们简单地将传入的名字连接到问候语后面,并使用 Unity 引擎的 Debug.Log 函数输出结果。 最后,我们可以使用 greetpeople 委托来调用 Greet 方法。例如: ``` GreetPeopleDelegate greetpeople = Greet; greetpeople("Bob"); ``` 在这个示例中,我们将 Greet 方法赋值给 greetpeople 委托,并传入字符串 "Bob"。通过调用 greetpeople 委托,我们实际上会调用 Greet 方法,并输出 "Hello, Bob!" 到 Unity 编辑器的日志中。 通过使用 Unity 引擎的委托机制,我们可以更加灵活地设计和组织代码,实现各种功能和交互。无论是游戏开发还是其他应用程序开发,委托都是非常有用的编程工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值