Unity中Delegate的用法场景


本文提供全流程,中文翻译。

Chinar 坚持将简单的生活方式,带给世人!

(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例)


Chinar —— 心分享、心创新!

助力快速理解 C# Delegate的基本用法

为新手节省宝贵的时间,避免采坑!

Chinar 教程效果:


  • 1

    • Delegate —— 委托
  • 2
    • Store Model —— 商店模式
  • 3
    • Waiter —— 服务员脚本
  • 4
    • Client A/B/C Class —— 顾客A/B/C脚本
  • 5
    • Demo —— 演示样本
  • 支持
    • May Be —— 搞开发,总有一天要做的事!

全文高清图片,点击即可放大观看 (很多人竟然不知道)


1

Delegate —— 委托

Unity 中,委托多用于当某个值,或者物体状态发生改变的时候

其他一些操作需要同时进行监听

一旦状态发生,改变,所有注册在委托中的函数,都会被调用


当警察出来的时候,小偷就得逃跑

当服务员叫餐叫号的时候,叫到谁,就该谁取餐

等等,诸如此类的场景


2

Store Model —— 商店模式

这里以一个简单的 商店模式 来模拟流程

用委托实现,群体的函数、方法注册到对象中

注意:

我们需要 1 个主脚本用来管理 :服务员

3 个顾客类:顾客 A/B/C

为了更加生动, Chinar 用了 iTween 来处理动画效果

页面布局如下


采用委托的方式,通知所有顾客,谁该干什么

分别通知对应群体对象


3

Waiter —— 服务员脚本

服务员脚本,用于管理委托对象,并在相应的按钮中调用对象

然后委托对象,状态发生改变,就会通知所有注册到对象中的函数,都被调用

using System.Collections;
using UnityEngine;
using UnityEngine.UI;//委托传递的是方法/函数
public delegate void CallNumber(); //使用时,必须要声明委托对象;返回值类型,要与将要注册到委托对象中的函数,返回值类型保持一致!public delegate int GetOuntHandler(); /*也就是:委托方法和被委托方法的类型必须保持一致*/public delegate bool SomeFood(string food);
/*以上是委托函数的声明方式*//// <summary>
/// Chinar委托测试类
/// </summary>
public class ChinarDelegate : MonoBehaviour
{//方法是引用类型的对象//委托将一个函数 转换成了一个函数对象//可以将 这个函数 以 对象 的形式进行传递public CallNumber callNumber;  //定义委托对象   这里定义的是一个委托对象public SomeFood   someFood;    //定义一个有参数有返回值的委托public Text       WaiterSpeak; //服务员说话内容文本public Text       BigScreen;   //服务员说话内容文本public GameObject G2GameObject;/// <summary>/// 叫号方法 —— 绑定按钮/// </summary>public void OnClickCallNumber(){callNumber();Content(Color.red, "叫号啦!!!", "请100号顾客取餐!");}/// <summary>/// 汉堡包 —— 绑定按钮/// </summary>public void OnClickHamburger(){if (!GameObject.Find("Hamburger(Clone)")) Instantiate(Resources.Load("Hamburger"));someFood("汉堡");Content(UserTwo.temporaryText.color, "谁的汉堡?", "请B号顾客取餐!");}/// <summary>/// 可乐 —— 绑定按钮/// </summary>public void OnClickCola(){someFood("可乐");Content(UserTwo.temporaryText.color, "谁点的可乐?", "请C号顾客取餐!");}/// <summary>/// 封装内容简化代码/// </summary>/// <param name="color"></param>/// <param name="speak"></param>/// <param name="bigScreen"></param>private void Content(Color color, string speak, string bigScreen){WaiterSpeak.text  = speak;WaiterSpeak.color = color;BigScreen.text    = bigScreen;StopCoroutine(ClearText());StartCoroutine(ClearText());}/// <summary>/// 清理文本内容/// </summary>/// <returns></returns>IEnumerator ClearText(){yield return new WaitForSeconds(3);WaiterSpeak.text = "";BigScreen.text   = "";}public static void Move(GameObject gameObject){iTween.MoveTo(gameObject, iTween.Hash("time",                                     .7f, "x",     6.69f,                         "y",        8.6f, "easetype", iTween.EaseType.easeOutCubic));iTween.MoveTo(gameObject, iTween.Hash("time",                                     .7f, "x",     -13.38f,                       "y",        2.8f, "easetype", iTween.EaseType.easeOutCubic, "delay", 2.4f));iTween.ScaleTo(gameObject.transform.Find("Speak").gameObject, iTween.Hash("time", .7f, "scale", new Vector3(0.3f, 0.3f, 0.3f), "easetype", iTween.EaseType.easeOutCubic));iTween.ScaleTo(gameObject.transform.Find("Speak").gameObject, iTween.Hash("time", .7f, "scale", new Vector3(1,    1,    1),    "easetype", iTween.EaseType.easeOutCubic, "delay", 2.4f));iTween.ScaleTo(gameObject,                                    iTween.Hash("time", .7f, "scale", new Vector3(3,    3,    3),    "easetype", iTween.EaseType.easeOutCubic));iTween.ScaleTo(gameObject,                                    iTween.Hash("time", .7f, "scale", new Vector3(1,    1,    1),    "easetype", iTween.EaseType.easeOutCubic, "delay", 2.4f));iTween.RotateTo(gameObject, iTween.Hash("time",                                   .7f, "z",     -360.01f,                      "easetype", iTween.EaseType.easeOutCubic));}
}

4

Client A/B/C Class —— 顾客A/B/C脚本

3 个顾客类:顾客 A/B/C

using System.Collections;
using UnityEngine;
using UnityEngine.UI;/// <summary>
/// 顾客A
/// </summary>
public class UserOne : MonoBehaviour
{public  ChinarDelegate Cd;            //声明委托对象所在的类对象//实例化一个类对象 在内存中重新开辟一块内存空间 创建了一个新的类对象public static Text temporaryText; //临时文本,设置公有静态是为了 方便调用颜色属性,去改变服务员文本颜色void Start(){Cd            = GameObject.Find("MountScript").GetComponent<ChinarDelegate>(); //赋值Cd.callNumber += LookScreen;temporaryText = transform.Find("Speak/Text").GetComponent<Text>();//添加委托函数//委托函数的添加方式:可以用 = 号 //如果想添加多个委托 需要用 +=号//删除委托用: -=}/// <summary>/// 抬头看大屏幕/// </summary>public void LookScreen(){temporaryText.text = "顾客A看向大屏幕";StopCoroutine(ClearText());StartCoroutine(ClearText());}/// <summary>/// 清理文本内容/// </summary>/// <returns></returns>IEnumerator ClearText(){yield return new WaitForSeconds(3);temporaryText.text = "";}
}

顾客 B:

using System.Collections;
using UnityEngine;
using UnityEngine.UI;/// <summary>
/// 顾客B
/// </summary>
public class UserTwo : MonoBehaviour
{public        ChinarDelegate Cd;public static Text           temporaryText; //临时文本,设置公有静态是为了 方便调用颜色属性,去改变服务员文本颜色void Start(){Cd            =  GameObject.Find("MountScript").GetComponent<ChinarDelegate>();Cd.callNumber += LookScreen; //2添加委托函数Cd.someFood   += WaitHamburger;temporaryText =  transform.Find("Speak/Text").GetComponent<Text>();}/// <summary>/// 服务员叫汉堡时,委托事件才会触发/// </summary>public bool WaitHamburger(string food){if (food == "汉堡"){temporaryText.text = "这里,我要汉堡";ChinarDelegate.Move(gameObject);iTween.MoveTo(GameObject.Find("Hamburger(Clone)"), iTween.Hash("oncomplete", "DestroyHamburger", "oncompletetarget", gameObject,           "time",     .7f,                          "x",     -13.38, "y", 2.8f, "easetype", iTween.EaseType.easeOutCubic, "delay", 2.4f));iTween.ScaleTo(GameObject.Find("Hamburger(Clone)"), iTween.Hash("time",      .7f,                "scale",            new Vector3(0, 0, 0), "easetype", iTween.EaseType.easeOutCubic, "delay", 2.4f));StopCoroutine(ClearText());StartCoroutine(ClearText());return true;}return false;}private void DestroyHamburger(){Destroy(GameObject.Find("Hamburger(Clone)"));}/// <summary>/// 抬头看大屏幕/// </summary>public void LookScreen(){temporaryText.text = "顾客B看向大屏幕";StopCoroutine(ClearText());StartCoroutine(ClearText());}/// <summary>/// 清理文本内容/// </summary>/// <returns></returns>IEnumerator ClearText(){yield return new WaitForSeconds(3);temporaryText.text = "";}
}

顾客 C:

using System.Collections;
using UnityEngine;
using UnityEngine.UI;/// <summary>
/// 顾客C
/// </summary>
public class UserThree : MonoBehaviour
{public        ChinarDelegate Cd;            //委托对象public static Text           temporaryText; //临时文本,设置公有静态是为了 方便调用颜色属性,去改变服务员文本颜色void Start(){Cd            =  GameObject.Find("MountScript").GetComponent<ChinarDelegate>(); //获取对象Cd.callNumber += LookScreen;                                                    //当 叫号的委托对象中,有多个方法调用时,需要用 += 添加Cd.someFood   += WaitCola;                                                      //委托对象添加 顾客3的可乐temporaryText =  transform.Find("Speak/Text").GetComponent<Text>();}/// <summary>/// 服务员叫可乐时,委托事件才会触发/// </summary>public bool WaitCola(string food){if (food == "可乐"){temporaryText.text = "这里,我要的可乐";ChinarDelegate.Move(gameObject);StopCoroutine(ClearText());StartCoroutine(ClearText());return true;}return false;}/// <summary>/// 抬头看大屏幕/// </summary>public void LookScreen(){temporaryText.text = "顾客C看向大屏幕";StopCoroutine(ClearText());StartCoroutine(ClearText());}/// <summary>/// 清理文本内容/// </summary>/// <returns></returns>IEnumerator ClearText(){yield return new WaitForSeconds(3);temporaryText.text = "";}
}

5

Demo —— 演示样本

Chinar 提供了演示样本,节省大家搭建界面的时间

便于大家理解

Chinar 委托演示项目


支持

May Be —— 搞开发,总有一天要做的事!

拥有自己的服务器,无需再找攻略!

Chinar 提供一站式教程,闭眼式创建!

为新手节省宝贵时间,避免采坑!

先点击领取 —— 阿里全产品优惠券 (享受最低优惠)

1 —— 云服务器超全购买流程 (新手必备!)

2 —— 阿里ECS云服务器自定义配置 - 购买教程(新手必备!)

3—— Windows 服务器配置、运行、建站一条龙 !

4 —— Linux 服务器配置、运行、建站一条龙 !




<script type="math/tex" id="MathJax-Element-4"> </script>
技术交流群:806091680 ! Chinar 欢迎你的加入


END

本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究

对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: ichinar@icloud.com

对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址>

Unity 项目中委托Delegate用法案例相关推荐

  1. [团队] 在Unity项目中使用FMOD来管理你的音效

    Hello各位小伙伴, 今天来聊一下Unity项目中的音效管理. 我目前正在研发的项目, 使用了FMOD的来管理音效和背景音乐. FMOD本身是一款免费的音频集成工具. 自身的音效编辑器还拥有强大的编 ...

  2. Unity 项目中资源管理(续)

    转载自:https://zhuanlan.zhihu.com/p/28324190 上次和大家分享了Unity项目中的资源管理主要讲资源配置以及资源配置工具,Unity资源配置在资源管理中处于基础地位 ...

  3. Unity项目中UI美术必须知道的程序要点

    原文地址:http://youxiputao.com/articles/4820 本文转载自IndieACE(游戏葡萄),是开发者DonaldW写给UI美术同事的一篇文章,原文题为<Unity项 ...

  4. Unity项目中不显示手柄

    文章目录 1.前言 2.查阅的网络上的解决方案 2.1 方案1: 2.2 方案2 1.前言 用于记录本次故障,问题描述: Unity项目没有做改变,SteamVR Plugin是旧版本的插件,Stea ...

  5. vue项目中/deep/的用法-vue-cli中没法覆盖样式解决方法

    在vue-cli项目中,我们在二次覆盖样式的时候会遇到这个问题,就是在控制样式的时候,复制了类名,但是设置了样式会没有. 解决方式:在样式前面加一个 /deep/ <style lang=&qu ...

  6. Unity 项目中的音效管理器

    using UnityEngine; using System.Collections; using System.Collections.Generic;/// <summary> // ...

  7. java项目中enum的用法_java中enum的用法

    本文实例讲述了java中enum的用法.分享给大家供大家参考.具体分析如下: 1. 基本用法 enum Day { SUNDAY, MONDAY, TUESDAY, WENDSDAY, THURSDA ...

  8. 3分钟让你学会axios在vue项目中的基本用法(建议收藏)

    Axios酸狗来教你 提示:本篇详解axios在vue项目中的实例.在使用Vue.js框架开发前端项目时,会经常发送ajax请求服务端接口,在开发过程中,需要对axios进一步封装,方便在项目中的使用 ...

  9. java redis缓存理解_Java项目中使用Redis缓存案例

    缓存的目的是为了提高系统的性能,缓存中的数据主要有两种: 1.热点数据.我们将经常访问到的数据放在缓存中,降低数据库I/O,同时因为缓存的数据的高速查询,加快整个系统的响应速度,也在一定程度上提高并发 ...

最新文章

  1. MindSpore平台系统类
  2. Eclipse-Java代码规范和质量检查插件-SonarLint
  3. 李洪强经典面试题10
  4. 走近分形与混沌(part3)-引领任何科学发展的,从来都是伟大的思想而不是繁琐的公式
  5. 高计能计算要实现软着陆
  6. PostgreSQL 分页——示例
  7. kafkatemplate无法注入_Spring-Kafka(三)-KafkaTemplate发送消息及结果回调
  8. java代码运行Python程序
  9. OAuth2.0_授权服务配置_资源服务测试_Spring Security OAuth2.0认证授权---springcloud工作笔记146
  10. 四针角oled屏连接arduino_Arduino提高篇03—OLED屏图片显示
  11. ((亲测有效))安卓神器Xposed框架无ROOT使用指南
  12. 通过笔记本wifi共享到以太网接口方法--使用嵌入式设备接入互联网
  13. Google搜索关键字
  14. python删除列表第一个,在Python中删除列表的第一个元素
  15. OracleRAC基本概念及入门
  16. 使用OAS Validator帮助你规范OpenAPI Spec文档
  17. matlab实现三分之一倍频程,三分之一倍频程程序
  18. “科林明伦杯”哈尔滨理工大学第十届程序设计竞赛(同步赛)---全题目+题解
  19. Ubuntu查看主机名和修改主机名
  20. 转载于烂泥博客,供个人学习kvm、mysql等知识

热门文章

  1. 嵌入式Linux应用程序开发-(10)i.MX6UL基于嵌入式QT实现电容屏多点触控
  2. CVE-2012-1823:phpcgi 代码执行
  3. 设计一个日期类Date
  4. 万字长文深度解读5G射频,国产机会在哪里?
  5. ps读写ddr3里面的数据 zynq_ZYNQ_PL与PS的DDR交互
  6. 测试小兵成长记:当家方知油盐贵
  7. .net 2.0 中 DataTable 小兵变大将
  8. 蓝牙耳机买什么牌子好?几款值得买的蓝牙耳机推荐
  9. Vue报错出现[Vue warn]: Error compiling template:
  10. 《2019上半年DDoS攻击态势报告》发布:应用层攻击形势依然严峻,海量移动设备成新一代肉鸡...