Unity 项目中委托Delegate用法案例
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用法案例相关推荐
- [团队] 在Unity项目中使用FMOD来管理你的音效
Hello各位小伙伴, 今天来聊一下Unity项目中的音效管理. 我目前正在研发的项目, 使用了FMOD的来管理音效和背景音乐. FMOD本身是一款免费的音频集成工具. 自身的音效编辑器还拥有强大的编 ...
- Unity 项目中资源管理(续)
转载自:https://zhuanlan.zhihu.com/p/28324190 上次和大家分享了Unity项目中的资源管理主要讲资源配置以及资源配置工具,Unity资源配置在资源管理中处于基础地位 ...
- Unity项目中UI美术必须知道的程序要点
原文地址:http://youxiputao.com/articles/4820 本文转载自IndieACE(游戏葡萄),是开发者DonaldW写给UI美术同事的一篇文章,原文题为<Unity项 ...
- Unity项目中不显示手柄
文章目录 1.前言 2.查阅的网络上的解决方案 2.1 方案1: 2.2 方案2 1.前言 用于记录本次故障,问题描述: Unity项目没有做改变,SteamVR Plugin是旧版本的插件,Stea ...
- vue项目中/deep/的用法-vue-cli中没法覆盖样式解决方法
在vue-cli项目中,我们在二次覆盖样式的时候会遇到这个问题,就是在控制样式的时候,复制了类名,但是设置了样式会没有. 解决方式:在样式前面加一个 /deep/ <style lang=&qu ...
- Unity 项目中的音效管理器
using UnityEngine; using System.Collections; using System.Collections.Generic;/// <summary> // ...
- java项目中enum的用法_java中enum的用法
本文实例讲述了java中enum的用法.分享给大家供大家参考.具体分析如下: 1. 基本用法 enum Day { SUNDAY, MONDAY, TUESDAY, WENDSDAY, THURSDA ...
- 3分钟让你学会axios在vue项目中的基本用法(建议收藏)
Axios酸狗来教你 提示:本篇详解axios在vue项目中的实例.在使用Vue.js框架开发前端项目时,会经常发送ajax请求服务端接口,在开发过程中,需要对axios进一步封装,方便在项目中的使用 ...
- java redis缓存理解_Java项目中使用Redis缓存案例
缓存的目的是为了提高系统的性能,缓存中的数据主要有两种: 1.热点数据.我们将经常访问到的数据放在缓存中,降低数据库I/O,同时因为缓存的数据的高速查询,加快整个系统的响应速度,也在一定程度上提高并发 ...
最新文章
- MindSpore平台系统类
- Eclipse-Java代码规范和质量检查插件-SonarLint
- 李洪强经典面试题10
- 走近分形与混沌(part3)-引领任何科学发展的,从来都是伟大的思想而不是繁琐的公式
- 高计能计算要实现软着陆
- PostgreSQL 分页——示例
- kafkatemplate无法注入_Spring-Kafka(三)-KafkaTemplate发送消息及结果回调
- java代码运行Python程序
- OAuth2.0_授权服务配置_资源服务测试_Spring Security OAuth2.0认证授权---springcloud工作笔记146
- 四针角oled屏连接arduino_Arduino提高篇03—OLED屏图片显示
- ((亲测有效))安卓神器Xposed框架无ROOT使用指南
- 通过笔记本wifi共享到以太网接口方法--使用嵌入式设备接入互联网
- Google搜索关键字
- python删除列表第一个,在Python中删除列表的第一个元素
- OracleRAC基本概念及入门
- 使用OAS Validator帮助你规范OpenAPI Spec文档
- matlab实现三分之一倍频程,三分之一倍频程程序
- “科林明伦杯”哈尔滨理工大学第十届程序设计竞赛(同步赛)---全题目+题解
- Ubuntu查看主机名和修改主机名
- 转载于烂泥博客,供个人学习kvm、mysql等知识
热门文章
- 嵌入式Linux应用程序开发-(10)i.MX6UL基于嵌入式QT实现电容屏多点触控
- CVE-2012-1823:phpcgi 代码执行
- 设计一个日期类Date
- 万字长文深度解读5G射频,国产机会在哪里?
- ps读写ddr3里面的数据 zynq_ZYNQ_PL与PS的DDR交互
- 测试小兵成长记:当家方知油盐贵
- .net 2.0 中 DataTable 小兵变大将
- 蓝牙耳机买什么牌子好?几款值得买的蓝牙耳机推荐
- Vue报错出现[Vue warn]: Error compiling template:
- 《2019上半年DDoS攻击态势报告》发布:应用层攻击形势依然严峻,海量移动设备成新一代肉鸡...