当前位置: 首页 > 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://www.xdnf.cn/news/1001755.html

相关文章:

  • 数据集-目标检测系列- 孔雀 数据集 peacock >> DataBall
  • FFmpeg 压缩视频文件
  • 力扣HOT100之技巧:136. 只出现一次的数字
  • C#调用C++ 结构体方法
  • GitHub 上 PAT 和 SSH 的 7 个主要区别:您应该选择哪一个?
  • Transformer 与 XGBoost 协同优化的时间序列建模
  • LSTM助力迁移学习!深度学习架构性能提升,准确率达到99.91%!
  • TCN+Transformer+SE注意力机制多分类模型 + SHAP特征重要性分析,pytorch框架
  • 用于在多个远程计算机上求解的 Ansoft RSM 设置 - Windows
  • 实战案例-FPGA的JESD204B IP核配置详解
  • 【springboot组件开发】三方中间件自定义自动装载(rabbitmq/rocketmq/cmq)
  • 记录一次jenkins slave因为本地安装多个java版本导致的问题
  • stm32f103 标准库移植rt-thread nano
  • 学习笔记整理之状态图与状态图搜索
  • Windows 提权工具(“Potato“ 系列)用法指南
  • 火线、零线、地线 基础知识
  • 实现图片懒加载
  • 大话软工笔记—架构的概要设计
  • 【AS32系列MCU调试教程】基础配置:Eclipse项目与工具链的优化
  • SD-WAN优化云应用与多云架构访问的关键策略
  • 408考研逐题详解:2009年第39题
  • 深入探索IIC-OLED显示技术:嵌入式仿真平台如何重塑高校教学范式——深圳航天科技创新研究院技术赋能新一代工程教育
  • 观点 | 科技企业到了品牌建设的历史性窗口期
  • 界面开发框架DevExpress XAF实践:集成.NET Aspire后如何实现服务安排?
  • Kratos 与Golang Cms的关系
  • 深度学习环境搭建(pycharm+yolov5)
  • 【AWS入门】IAM多重身份验证(MFA)简介
  • 深度解析Git错误:`fatal: detected dubious ownership in repository` 的根源与解决方案
  • OpenAI API:LLM编程的事实标准(上)
  • R语言缓释制剂QBD解决方案之五