当前位置: 首页 > news >正文

Unity-通过Transform类学习迭代器模式

迭代器模式

简单理解,循环的特殊版本。

C# 定义的迭代器接口

public interface IEnumerable
{IEnumerator GetEnumerator();
}
public interface IEnumerator
{object Current { get; }bool MoveNext();void Reset();
}

"容器类"实现IEnumerable(枚举)接口,返回迭代器。

利用迭代器可遍历容器中的元素。
MoveNext类似for循环的条件语句,判断循环是否可以继续执行。
Curren获取当前遍历的元素。
Reset重置循环。

Transform类的实现

实现IEnumerable接口,返回迭代器。

public class Transform : Component, IEnumerable
{public IEnumerator GetEnumerator(){return new Enumerator(this);}
}

Enumerator类实现IEnumerator接口,可遍历Transform的子节点

public class Transform : Component, IEnumerable
{private class Enumerator : IEnumerator{private Transform outer;private int currentIndex = -1;public object Current => outer.GetChild(currentIndex);internal Enumerator(Transform outer){this.outer = outer;}public bool MoveNext(){int childCount = outer.childCount;return ++currentIndex < childCount;}public void Reset(){currentIndex = -1;}}
}

示例程序

Start:
构建两个游戏对象,设置父对象。
获取transform的枚举接口和迭代器接口。
Update:
按下空格键,使用两种方式打印transform的子对象
方式1:利用while和迭代器进行遍历。
优点:复用迭代器;缺点:语法复杂。
方式2:利用foreach进行遍历。
优点:语法简洁。缺点:遍历前,foreach会调用枚举接口返回一个迭代器对象。

using System.Collections;
using UnityEngine;
public class Test03 : MonoBehaviour
{IEnumerable able;IEnumerator ator;private void Start(){for (int i = 0; i < 2; i++){var obj = new GameObject(i.ToString());obj.transform.SetParent(transform);}able = transform;ator = able.GetEnumerator();}private void Update(){if (Input.GetKeyDown(KeyCode.Space)){while (ator.MoveNext())    //方式1        Debug.Log(ator.Current);          ator.Reset();foreach (Transform item in able)//方式2{Debug.Log(item);}}}
}

文章转载自:

http://cHYMUrND.bmfqg.cn
http://QnckRztY.bmfqg.cn
http://C5x18Tm8.bmfqg.cn
http://rc4G5Cfm.bmfqg.cn
http://9VD0x6t6.bmfqg.cn
http://0PRmvG2A.bmfqg.cn
http://tRmgV2ov.bmfqg.cn
http://eX4u6XO2.bmfqg.cn
http://fOzRf927.bmfqg.cn
http://GMeV7OlW.bmfqg.cn
http://t75AFxuf.bmfqg.cn
http://R5gPQ2LR.bmfqg.cn
http://N5ECfvYS.bmfqg.cn
http://1BAhgCr1.bmfqg.cn
http://bkMiWzgg.bmfqg.cn
http://ln53k7CK.bmfqg.cn
http://Z6je8UOB.bmfqg.cn
http://c5A5CqUd.bmfqg.cn
http://eT0FkrdR.bmfqg.cn
http://XnYcwybt.bmfqg.cn
http://URy6ktCu.bmfqg.cn
http://Ghw6Qp7p.bmfqg.cn
http://bivp59Mn.bmfqg.cn
http://jHzbRfjp.bmfqg.cn
http://bLqub13H.bmfqg.cn
http://qG4nrzD6.bmfqg.cn
http://oGlGlq6s.bmfqg.cn
http://ufwJnVMm.bmfqg.cn
http://uS7hSQ79.bmfqg.cn
http://G4BY6OZT.bmfqg.cn
http://www.dtcms.com/a/246547.html

相关文章:

  • 给Markdown渲染网页增加一个目录组件(Vite+Vditor+Handlebars)(上)
  • Java面试题020:一文深入了解微服务之负载均衡Feign
  • 多通道信号采集分析系统 - 01 功能分解与采样子系统
  • 《TCP/IP协议卷1》TCP协议TCP连接建立和释放
  • 一[2]、ubuntu18.04环境 yolov8 + realsenseD435i 实时效果测试
  • docker compose搭建elk 8.6.2
  • 爱普特APT-LINK PROG带电烧录器!STM32/SPI Flash高性能在线编程器详细解析
  • element 跨页选中,回显el-table选中数据
  • DEVICENET转MODBUS TCP网关连接ABB机器人配置案例
  • Vue 生命周期
  • 使用argocd部署nginx
  • 大厂Java技术面试实录:从基础到架构,谢飞机的面试之旅
  • 测试:AWS SDK for JavaScript v2 迁移到 v3
  • 【开发常用命令】:服务器与本地之间的数据传输
  • 新疆大学具身导航新范式!DOPE:基于双重对象感知增强网络的视觉语言导航
  • Python打卡第52天
  • 破解关键领域软件测试“三重难题”:安全、复杂性、保密性
  • 第三章支线七 ·路由边境 · 多页世界的穿梭之术
  • 考研复试C语言基础
  • 常见的UDS服务标识符与UDS刷写流程
  • 指针01 day13
  • mapstruct中的@Mapper注解详解
  • Linux检验库是否安装成功
  • 【Linux手册】从「程序」到「进程」:计算机世界的运行机制
  • vue中的doSave()方法
  • sherpa-onnx开源语音处理框架研究报告:从技术解析到应用实践
  • 134. Gas Station
  • 泛微OAe9-自定义资源看板
  • HALCON第一讲->数据结构、语法规则与思路
  • 算法学习笔记:2.大根堆算法——数据流的中位数​​or最后一块石头的重量