Unity Resources.LoadAsync 优雅的写法

这篇具有很好参考价值的文章主要介绍了Unity Resources.LoadAsync 优雅的写法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        传统写法中 Resources.LoadAsync("path"),保存回调ResourceRequest 开启一个协程或者定时器,每帧去判断一下 ResourceRequest.isDone是否完成,这样每写一句Resources.LoadAsync就得新增一个定时器,如果使用Resources.Load同步加载很大预制体时会卡顿掉帧,所以我们的程序员宗旨就是能躺着绝不站着。

        经过我的修改,使用起来相当舒服,有以下特点:

1、减少后续繁琐的代码,减少重复代码,使用异步编程方式,一目了然,优雅实在是太优雅了。

2、还没想好。。。。。。。。。。。。。

        缺陷:

 1、如果是需要显示加载进度条的还是老老实实增加一个协程每帧获取进度吧。

首先是新建一个全局文件工具类:(可以直接复制)

using UnityEngine;
using System.Threading.Tasks;
using System.Runtime.CompilerServices;
using System;


public static class ExtensionsResources
{
    public static ResourceRequestAwaiter GetAwaiter(this ResourceRequest request) => new ResourceRequestAwaiter(request);

    public static async Task<T> LoadResourcesAsync<T>(string path) where T : UnityEngine.Object
    {
        var gres = Resources.LoadAsync(path);
        await gres;
        return gres.asset as T;
    }

}

public class ResourceRequestAwaiter : INotifyCompletion
{
    public Action Continuation;
    public ResourceRequest resourceRequest;
    public bool IsCompleted => resourceRequest.isDone;
    public ResourceRequestAwaiter(ResourceRequest resourceRequest)
    {
        this.resourceRequest = resourceRequest;

        //注册完成时的回调
        this.resourceRequest.completed += Accomplish;
    }

    //awati 后面的代码包装成 continuation ,保存在类中方便完成是调用
    public void OnCompleted(Action continuation) => this.Continuation = continuation;

    public void Accomplish(AsyncOperation asyncOperation) => Continuation?.Invoke();

    public void GetResult() {}
}

使用方法 :文章来源地址https://www.toymoban.com/news/detail-512902.html

using UnityEngine;


public class Test : MonoBehaviour
{
    //使用 await 等待加载完成, Star这个方法必须是 有async 修饰  
    async void Start()
    {
       
        GameObject go = await ExtensionsResources.LoadResourcesAsync<GameObject>("Cube");
        Debug.Log(go.name);
        Instantiate(go);

    }
}

到了这里,关于Unity Resources.LoadAsync 优雅的写法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity3D中Resources动态加载图片

    问题:unity的Resources动态加载就不必多说了,这里出现的问题是当我把图片放入Resources文件夹后,使用Resources.Load(datapath)却并没有出现图片。 分析:由于你放在文件夹下的是图片,是Texture2D类型,但是实际用在u3d中的是sprite,所以需要转换类型。 方式: 1.在代码中先行创

    2024年02月11日
    浏览(27)
  • Unity中读取Json文件:基于Assets/Resources文件夹

    我好生气😤,Python,JS里面一两行代码能够搞定的Json读取,在Unity中使用C#读取Json文件超多坑,爬出来一个又来一个。 主要是JsonUtility.FromJson太不给力了。 最好的方式是,使用 https://github.com/jilleJr/Newtonsoft.Json-for-Unity 这个第三方库。详情见下。 Step 1: 先把对应的Json File放到

    2024年02月12日
    浏览(40)
  • Unity 之 Addressable可寻址系统 -- 将Resources加载资源方式修改为Addressable加载 -- 实战(一)

    加载方式: Resources 使用同步加载方式;Resources 加载资源时,应用程序将会被阻塞,直到资源加载完成,这可能会导致应用程序出现卡顿或挂起的情况。 Addressables 使用异步加载方式。这意味着使用 Unity 而使用 Addressables 加载资源时,应用程序可以继续运行,而不会出现卡顿

    2024年02月05日
    浏览(28)
  • 【Unity】传统对象池构造和Unity官方对象池ObjectPool使用

    学习资料来源:【SiKi老师直播回放】如何使用Unity对象池技术ObjectPool_哔哩哔哩_bilibili 目标:在画面中生成大量Cube  一、传统对象池构造 1、对象:需要一个Prefab进行复制 2、对象池(ObjectPool) (1)创建         ①使用队列储存对象:public QueueGameObject cube = new QueueGameObjec

    2024年02月13日
    浏览(28)
  • Unity 如何在Unity中优雅的画线

    内容将会持续更新,有错误的地方欢迎指正,谢谢!   Unity 如何在Unity中优雅的画线       TechX 坚持将创新的科技带给世界! 拥有更好的学习体验 —— 不断努力,不断进步,不断探索 TechX —— 心探索、心进取! 助力快速掌握 画线 为初学者节省宝贵的学习时间,避免困惑!

    2024年02月02日
    浏览(43)
  • Unity里面CG和HLSL在写法上的一些区别

    回到目录 大家好,我是阿赵。这里继续讲URP相关的内容。 这次想讲的是CG和HLSL在写法上的一些区别。 首先,基本上大家都知道的事情再说一遍。 三种Shader编程语言: 1、基于OpenGL的 OpenGL Shading Language ,缩写 GLSL 2、基于DirectX的 High Level Shading Language ,缩写 HLSL 3、基于NVIDIA的

    2024年02月15日
    浏览(23)
  • 【Unity】如何优雅地移动物体-8个方法

    在游戏开发中,如何移动物体?是我们需要思考的事情。 Unity 引擎也提供了众多的方法,每个开发者的使用习惯也各不相同,所以往往不是很清楚在这种场景下哪种方式最好的或者最有效的。 那么,这篇文章,我想分享一下移动物体的一些方法和优缺点。 仓库地址 如何优雅

    2023年04月09日
    浏览(31)
  • 【Unity记录】如何优雅地在Unity中订阅与退订C#事件

    阅读须知: 阅读本文建议提前了解C#事件系统 本文侧重介绍在Unity中事件退订的做法 本文将介绍: 简单介绍何为事件 简单介绍如何使用C#事件 为何需要退订C#事件 何时需要退订C#事件 如何 在Unity中 优雅地退订C#事件 事件模型是面向对象编程中常用的一种模块间通信的模型,

    2024年02月05日
    浏览(37)
  • 【100个 Unity实用技能】 | C# 中关于补位的写法 PadLeft,PadRight 函数

    老规矩,先介绍一下 Unity 的科普小知识: Unity 是 实时3D互动内容创作和运营平台 。 包括 游戏开发 、 美术 、 建筑 、 汽车设计 、 影视 在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和

    2023年04月14日
    浏览(40)
  • Unity 中的 async/await:优雅处理异步任务与协程

    内容将会持续更新,有错误的地方欢迎指正,谢谢!   Unity 中的 async/await:优雅处理异步任务与协程Coroutine       TechX 坚持将创新的科技带给世界! 拥有更好的学习体验 —— 不断努力,不断进步,不断探索 TechX —— 心探索、心进取! 助力快速掌握 async/await 异步等待 为初

    2024年02月06日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包