闭包在C#和Unity开发中的应用
创作时间:
作者:
@小白创作中心
闭包在C#和Unity开发中的应用
引用
1
来源
1.
https://www.cnblogs.com/Firepad-magic/p/18666242
闭包(Closure)是编程中一个重要的概念,特别是在使用C#和Unity进行开发时。本文将详细介绍闭包的基本概念、在Unity开发中的常见应用场景以及使用闭包时需要注意的事项。
闭包的基本概念
闭包是指一个函数可以捕获和记住它的作用域(上下文)中的变量,即使这个函数已经在其原始作用域之外被调用。在C#中,匿名方法和Lambda表达式通常会创建闭包。闭包允许方法捕获局部变量并在稍后某个时刻使用这些变量。
闭包示例
闭包的一个常见问题是变量捕获。例如,在下面的代码中,闭包捕获的是变量i
的引用,而不是当前值,导致后续输出都是最后一个i
的值:
为了避免这个问题,可以通过创建局部变量temp
,确保闭包捕获的是变量的值而不是引用:
Unity开发中常见的闭包场景
1. 延迟任务(例如协程)
闭包可以用于在延迟执行中捕获当前上下文变量:
void Start()
{
for (int i = 5; i < 10; i++)
{
StartCoroutine(DelayedLog(x => i, i * 0.5f));//i被匿名方法捕获,延迟调用后i始终为10
}
}
System.Collections.IEnumerator DelayedLog(Func<int,int> func, float delay)
{
yield return new WaitForSeconds(delay);
Debug.Log($"Delayed index: {func.Invoke(0)}");//prints: Delayed index: 10
}
2. 动态事件绑定
Unity中的按钮事件或自定义事件监听器经常会用到闭包:
using UnityEngine;
using UnityEngine.UI;
public class ButtonClosureExample : MonoBehaviour
{
public Button buttonPrefab;
public Transform buttonParent;
void Start()
{
for (int i = 0; i < 5; i++)
{
Button newButton = Instantiate(buttonPrefab, buttonParent);
newButton.GetComponentInChildren<Text>().text = $"Button {index}";
newButton.onClick.AddListener(() => Debug.Log($"Button {i} clicked"));
}
}
}
在这个例子中,会生成5个Button0~4的按钮,但是点击时输出的始终为Button 5 clicked
。
3. 异步任务(例如UnityWebRequest或异步加载)
在异步操作中,闭包可以帮助将参数传递给回调:
using UnityEngine;
using UnityEngine.Networking;
public class AsyncClosureExample : MonoBehaviour
{
void Start()
{
string[] urls = { "https://example.com/file1", "https://example.com/file2" };
foreach (string url in urls)
{
StartCoroutine(DownloadData(url));
}
}
System.Collections.IEnumerator DownloadData(string url)
{
UnityWebRequest request = UnityWebRequest.Get(url);
yield return request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success)
{
Debug.Log($"Downloaded from {url}: {request.downloadHandler.text}");
}
else
{
Debug.LogError($"Failed to download from {url}: {request.error}");
}
}
}
这里的url
是通过闭包捕获的,每个协程实例会记住自己的URL,即使下载任务是异步的。
总结
在Unity开发中,闭包是一种强大的工具,尤其在事件、协程、异步任务中非常有用。然而,使用闭包时需要小心捕获变量的行为,避免产生难以调试的错误。
本文原文来自博客园
热门推荐
安全与合规:自动驾驶技术面临的挑战与前景
海南冬季潜水攻略:最佳潜水地点、水温、装备准备及安全指南
银曜石戴在左手还是右手?详解银曜石的佩戴方式与功效
水彩画中的光与色:表现物象与空间的艺术之道
国家规定,60岁以上老人,可以免费享受这些福利,很多人都不知道
为什么人们总是被限量、稀缺的东西所吸引?揭秘“稀缺性效应”
线性代数篇答疑和总结:矩阵乘法的几何意义是什么?
做销售如何做好市场管理
王阳明曾说:心不死则道不生,欲不灭则道不存,心不苦则智慧不开
北京朝阳医院成功实施机器人辅助下腹膜后巨大肿物切除术
8个表现或在提醒你身体缺水了 及时补水很关键
很多人把天丝洗坏了,究竟要怎么洗?
车漆抛光后如何保持良好状态?这种保持状态的方法存在哪些挑战?
简论宇宙膨胀理论及其发展
《卿怎么读》:探讨情感与人际关系的深刻文学作品分析
羽衣甘蓝盆栽能活几年
固态电池产业化提速,6个月诞生23只翻倍股
阿胶的功效与作用:从补血到美容的全方位保健
泰国全球电子签证系统将于2025年1月正式启用
高血压可以吃补气血的食物吗
各大程序员兼职平台靠谱吗?避坑指南,收藏这一篇文章就够了
动物描写有哪些方面?动物描写:细致展现动物特质的五大方面!
【器材应用】ND减光滤镜使用技巧 ─ 日光下的慢快门 ND滤镜
高血压患者注意!早晚血压波动大,你该怎么办?
储蓄的种类有哪些?不同种类的储蓄有什么特点?
液压电磁阀:结构、原理与应用全解析
邵氏硬度计知识全解析:了解硬度与邵氏硬度计的使用
水煮荷包蛋,水开就下锅是大错!牢记3个窍门,个个圆润不散花
excel函数中and怎么用
日主五行的性格特点