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

迭代器模式

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

C# 定义的迭代器接口

csharp 复制代码
public interface IEnumerable
{
    IEnumerator GetEnumerator();
}
public interface IEnumerator
{
    object Current { get; }
    bool MoveNext();
    void Reset();
}

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

利用迭代器可遍历容器中的元素。

MoveNext类似for循环的条件语句,判断循环是否可以继续执行。

Curren获取当前遍历的元素。

Reset重置循环。

Transform类的实现

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

csharp 复制代码
public class Transform : Component, IEnumerable
{
	public IEnumerator GetEnumerator()
	{
   		 return new Enumerator(this);
	}
}

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

csharp 复制代码
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会调用枚举接口返回一个迭代器对象。

csharp 复制代码
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);
            }
        }
    }
}
相关推荐
flashier1 小时前
ESP32学习笔记_Components(1)——使用LED Strip组件点亮LED灯带
学习·esp32·led·led灯带·esp32组件
Shining05962 小时前
Datawhale AI 夏令营—科大讯飞AI大赛(大模型技术)—让大模型理解表格数据(列车信息表)
人工智能·学习·其他
希望奇迹很安静3 小时前
SSRF_XXE_RCE_反序列化学习
学习·web安全·ctf·渗透测试学习
悦悦子a啊3 小时前
Python之--字典
开发语言·python·学习
kmjyccc4 小时前
生活毫无头绪就毫无头绪吧(7.24)
学习·生活
heyilunv5 小时前
昇思学习营-Deepseek-r1-distill-qwen-1.5b模型开发与适配课程内容和学习心得
学习
胡耀超5 小时前
我们如何写好提示词、发挥LLM能力、写作指南:从认知分析到动态构建的思维方法
人工智能·python·学习·大模型·llm·提示词·八要素思维
waveee1235 小时前
学习嵌入式的第三十一天-数据结构-(2025.7.23)网络协议封装
学习
冷崖6 小时前
Redis缓存策略以及bigkey的学习(九)
redis·学习·缓存
墨染枫7 小时前
pytorch学习笔记-使用DataLoader加载固有Datasets(CIFAR10),使用tensorboard进行可视化
pytorch·笔记·学习