当前位置: 首页 > 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);}}}
}

相关文章:

  • 给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刷写流程
  • 济南做网站的好公司/seo推广思路
  • 河北廊坊建设银行网站/怎么找需要做推广的公司
  • 网站开发费算无形资产吗/百度推广托管公司
  • 假网站如何做/百度极速版推广
  • 在网上可以做宣传的有那些网站/提高百度搜索排名
  • 博远手机销售管理系统app/seo怎么搞