Unity 迭代器模式(实例详解)

news2024/11/18 23:22:59

文章目录

    • 简介
    • **实例1:遍历数组**
    • **实例2:自定义迭代器类**
    • **实例3:异步加载资源**
    • **实例4:游戏关卡序列**
    • **实例5:无限生成敌人**

简介

在Unity中,虽然不直接使用迭代器模式的原始定义(即设计模式中的迭代器模式),但我们可以借助C#语言中的迭代器功能来实现类似的效果。迭代器模式允许顺序访问聚合对象的元素,而无需暴露其内部表示。Unity引擎中广泛应用了C#的IEnumerator和yield关键字来创建协程,这些协程可以视为一种特殊的迭代器。

以下是五个关于Unity中利用IEnumerator实现迭代器模式概念的代码实例:

实例1:遍历数组

using UnityEngine;
using System.Collections;

public class Example1 : MonoBehaviour
{
    private int[] numbers = { 1, 2, 3, 4, 5 };

    IEnumerator Start()
    {
        foreach (int number in numbers)
        {
            Debug.Log(number);
            yield return new WaitForSeconds(1f); // 每秒输出一个数字
        }
    }
}

这个例子展示了如何通过foreach循环遍历数组,并在Unity中以协程的形式逐个延迟输出数组元素。

实例2:自定义迭代器类

using System.Collections.Generic;

public class CustomEnumerable : IEnumerable<int>
{
    private List<int> data = new List<int>{ 6, 7, 8, 9, 10 };

    public IEnumerator<int> GetEnumerator()
    {
        foreach (var item in data)
        {
            yield return item;
        }
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

public class Example2 : MonoBehaviour
{
    void Start()
    {
        CustomEnumerable customList = new CustomEnumerable();
        foreach (int number in customList)
        {
            Debug.Log(number);
        }
    }
}

这里定义了一个实现了IEnumerable接口的自定义集合类,它通过GetEnumerator方法返回一个IEnumerator,从而可以被foreach语句遍历。

实例3:异步加载资源

using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

public class AssetLoader : MonoBehaviour
{
    public string[] assetKeys;

    IEnumerator LoadAssets()
    {
        foreach (string key in assetKeys)
        {
            AsyncOperationHandle<GameObject> handle = Addressables.LoadAssetAsync<GameObject>(key);
            yield return handle;
            
            if (handle.Status == AsyncOperationStatus.Succeeded)
            {
                GameObject loadedObject = handle.Result;
                Instantiate(loadedObject);
            }
            else
            {
                Debug.LogError($"Failed to load asset: {key}");
            }
        }
    }

    void Start()
    {
        StartCoroutine(LoadAssets());
    }
}

在这个示例中,我们利用Addressables异步加载资源,每次加载一个资源后yield返回,直到所有资源加载完毕,这体现了迭代器在处理异步流程时的灵活性。

实例4:游戏关卡序列

using UnityEngine;
using System.Collections;

public class LevelManager : MonoBehaviour
{
    public Level[] levels;

    IEnumerator LoadLevels()
    {
        for (int i = 0; i < levels.Length; i++)
        {
            Level level = levels[i];
            LoadLevel(level);
            yield return new WaitForSeconds(level.LoadDelay);

            // 加载完成后的逻辑,比如切换场景等
        }
    }

    void LoadLevel(Level level)
    {
        // 加载关卡逻辑...
    }

    void Start()
    {
        StartCoroutine(LoadLevels());
    }
}

[System.Serializable]
public class Level
{
    public string SceneName;
    public float LoadDelay;
}

此例中,我们有一个关卡列表,通过协程逐个加载每个关卡并等待指定时间,这是对迭代器用于序列化操作的一个应用。

实例5:无限生成敌人

using UnityEngine;
using System.Collections;

public class EnemySpawner : MonoBehaviour
{
    [SerializeField] private GameObject enemyPrefab;
    [SerializeField] private float spawnInterval;

    private IEnumerator SpawnCoroutine()
    {
        while (true)
        {
            Vector3 spawnPosition = GetRandomSpawnPosition();
            Instantiate(enemyPrefab, spawnPosition, Quaternion.identity);
            yield return new WaitForSeconds(spawnInterval);
        }
    }

    void Start()
    {
        StartCoroutine(SpawnCoroutine());
    }

    private Vector3 GetRandomSpawnPosition()
    {
        // 实现获取随机生成位置的逻辑...
    }
}

这个例子中,我们创建了一个无限循环生成敌人的协程,每一次yield都代表一次新的敌人生成间隔,表现出了迭代器在持续性行为控制上的运用。

请注意,在Unity中,“迭代器”一词更多地与IEnumerator和yield关联,它们共同构成了“协程”的基础,而并非严格遵循GOF设计模式中的迭代器模式定义。

python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)
————————————————

​最后我们放松一下眼睛
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1417575.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PDF标准详解(一)——PDF文档结构

已经很久没有写博客记录自己学到的一些东西了。但是在过去一年的时间中自己确实又学到了一些东西。一直攒着没有系统化成一篇篇的文章&#xff0c;所以今年的博客打算也是以去年学到的一系列内容为主。通过之前Vim系列教程的启发&#xff0c;我发现还是写一些系列文章对自己的帮…

Springmvc-@RequestBody

SpringBoot-2.7.12 请求的body参数无法转换&#xff0c;服务端没有报错信息打印&#xff0c;而是响应的状态码是400 PostMapping("/static/user") public User userInfo(RequestBody(required false) User user){user.setAge(19);return user; }PostMapping("…

05 Redis之Benchmark+简单动态字符串SDS+集合的底层实现

3.8 Benchmark Redis安装完毕后会自动安装一个redis-benchmark测试工具&#xff0c;其是一个压力测试工具&#xff0c;用于测试 Redis 的性能。 src目录下可找到该工具 通过 redis-benchmark –help 命令可以查看到其用法 3.8.1 测试1 3.9 简单动态字符串SDS 无论是 Redis …

【面试】测试开发面试题

帝王之气&#xff0c;定是你和万里江山&#xff0c;我都护得周全 文章目录 前言1. 网络原理get与post的区别TCP/IP各层是如何传输数据的IP头部包含哪些内容TCP头部为什么有浮动网络层协议1. 路由协议2. 路由信息3. OSPF与RIP的区别Cookie与Session&#xff0c;Token的区别http与…

Redis学习——高级篇①

Redis学习——高级篇① Redis7高级之单线程和多线程&#xff08;一&#xff09; 一、Redis单线程VS多线程1.Redis的单线程部分1.1 Redis为什么是单线程&#xff1f;1.2 Redis所谓的“单线程”1.3 Redis演进变化1.3.1 Redis 3.x 单线程时代性能很快的原因1.3.2…

林浩然科学趣谈:妙解麦克斯韦方程的电磁奥秘

林浩然科学趣谈&#xff1a;妙解麦克斯韦方程的电磁奥秘 Lin Haoran’s Scientific Banter: Playful Insights into the Electromagnetic Mysteries of Maxwell’s Equations 在科学的璀璨星河中&#xff0c;林浩然如同一颗热爱探索的行星&#xff0c;以其独特的幽默和严谨的态…

latent-diffusion model环境配置--我转载的

latent-diffusion model环境配置&#xff0c;这可能是你能够找到的最细的博客了_latent diffusion model 训练 autoencoder-CSDN博客 前言 最近在研究diffusion模型&#xff0c;并对目前最火的stable-diffusion模型很感兴趣&#xff0c;又因为stable-diffusion是一种latent-di…

opencv#35 连通域分析

连通域分割原理 像素领域介绍: 4邻域是指中心的像素与它邻近的上下左右一共有4个像素&#xff0c;那么称这4个像素为中心像素的4邻域。 8邻域是以中心像素周围的8个像素分别是上下左右和对角线上的4个像素。 连通域的定义(分割)分为两种:以4邻域为相邻判定条件的连通域分割和…

C++笔记之RTTI、RAII、MVC、MVVM、SOLID在C++中的表现

C++笔记之RTTI、RAII、MVC、MVVM、SOLID在C++中的表现 —— 杭州 2024-01-28 code review! 文章目录 C++笔记之RTTI、RAII、MVC、MVVM、SOLID在C++中的表现1.RTTI、RAII、MVC、MVVM、SOLID简述2.RAII (Resource Acquisition Is Initialization)3.RTTI (Run-Time Type Informat…

steam幻兽帕鲁服务器配置费用报价,4核16G

幻兽帕鲁服务器价格多少钱&#xff1f;4核16G服务器Palworld官方推荐配置&#xff0c;阿里云4核16G服务器32元1个月、96元3个月&#xff0c;腾讯云换手帕服务器服务器4核16G14M带宽66元一个月、277元3个月&#xff0c;8核32G22M配置115元1个月、345元3个月&#xff0c;16核64G3…

某度Pan复活,突破限速,很强大!

软件简介&#xff1a; 软件【下载地址】获取方式见文末。注&#xff1a;推荐使用&#xff0c;更贴合此安装方法&#xff01; 作为国内领先的云存储服务提供商之一&#xff0c;某度Pan为用户提供了一个便捷的文件存储和分享平台。然而&#xff0c;用户普遍反映某度Pan的下载速…

简盒工具箱iapp源码

一款工具箱兼做软件库。 新增远程更新功能 修复了部分失效功能 修复了偶尔会卡在启动页的情况 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88776737 更多资源下载&#xff1a;关注我。

漏洞原理MySql注入 Windows中Sqlmap 工具的使用

漏洞原理MySql注入 SQLmap是一款开源的自动化SQL注入工具&#xff0c;用于检测和利用Web应用程序中的SQL注入漏洞。以下是SQLmap工具的使用总结&#xff1a; 安装和配置&#xff1a;首先需要下载并安装SQLmap工具。安装完成后&#xff0c;可以通过命令行界面或图形用户界面来使…

2024幻兽帕鲁服务器,阿里云配置

阿里云幻兽帕鲁服务器Palworld服务器推荐4核16G配置&#xff0c;可以选择通用型g7实例或通用算力型u1实例&#xff0c;ECS通用型g7实例4核16G配置价格是502.32元一个月&#xff0c;算力型u1实例4核16G是432.0元/月&#xff0c;经济型e实例是共享型云服务器&#xff0c;价格是32…

案例分享:长沙红胖子公司内部评估高清内窥镜功能列表流程产出成果鉴赏

若该文为原创文章&#xff0c;转载请注明出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/135898723 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结…

多地多活与单元化架构

多地多活与单元化架构 背景 在业务发展到一定阶段之后&#xff0c;任何因故障而导致的服务中断都会带来巨大的损失。为了提高系统的伸缩能力与高可用能力&#xff0c;我们都不断的在努力消除系统单点瓶颈。如使用应用集群是为了解决服务层的单点问题&#xff0c;使用主从数据…

FreeRTOS任务知识详解

前言 本篇文章旨在记录我学习FreeRTOS实时操作系统中&#xff0c;有关于Free RTOS的任务知识的记录。由于RTOS系统的核心就是任务管理&#xff0c;而且我们大多数人学习RTOS的初衷就是为了使用RTOS的多任务处理功能&#xff01; 初步上手RTOS首先应该掌握的就是任务的创建、删除…

AlmaLinux上安装Docker

AlmaLinux上安装Docker 文章目录 AlmaLinux上安装Docker一、前言二、具体步骤1、Docker 下载更新系统包索引&#xff1a;添加Docker仓库&#xff1a;安装Docker引擎&#xff1a; 2、Docker服务启动启动Docker服务&#xff1a;设置Docker开机自启&#xff1a; 3、Docker 安装验证…

GitLab16.8配置webhooks、Jenkins2.4配置GitLab插件实现持续集成、配置宝塔面板实现持续部署

看本篇文章的前提是已经部署完GItlab和Jenkins服务器&#xff0c;已经可以手动构建成功&#xff0c;并且经过了很多次实践&#xff0c;对这两款软件基本熟悉。 建议大家按以下顺序看 前端自动化&#xff08;其一&#xff09;部署gitlab https://blog.csdn.net/weixin_45062076…

数据中心代理IP:最优性价比业务应用指南

数据中心代理IP在应对高速高并发的业务时&#xff0c;以独特的高速传输&#xff0c;游刃有余地应对多任务处理&#xff0c;适合于特定业务场景的高效加速。理性选用数据中心代理IP&#xff0c;可以为业务将迎来更加稳健和迅速的发展。今天&#xff0c;我们将揭示数据中心代理IP…