当前位置: 代码网 > it编程>编程语言>C/C++ > Addressable资源加载框架

Addressable资源加载框架

2024年08月01日 C/C++ 我要评论
【代码】Addressable资源加载框架。

代码:

using unityengine.addressableassets;
using unityengine.addressableassets.initialization;
using unityengine.resourcemanagement.asyncoperations;
using unityengine;
using system.collections.generic;
using system;

class baseloader
{
    protected string name = string.empty;

    private asyncoperationhandle handle;

    private bool isload = false;
    public baseloader(string name)
    {
        this.name = name;
        this.isload = false;
    }

    /// <summary>
    /// 加载资源
    /// </summary>
    /// <param name="name">资源名称</param>
    /// <param name="parent">加载完成之后存放的父节点</param>
    /// <param name="oncomplete">加载完成之后的回调</param>
    public virtual void load<t>(action<t> oncomplete) where t : unityengine.object
    {
        if (this.isload)
        {
            if (handle.isdone)
            {
                if (oncomplete != null)
                {
                    oncomplete(handle.result as t);
                }
            }
            else
            {
                handle.completed += (result) =>
                {
                    if (result.status == unityengine.resourcemanagement.asyncoperations.asyncoperationstatus.succeeded)
                    {
                        var obj = result.result as t;
                        if (oncomplete != null)
                        {
                            oncomplete(obj);
                        }
                    }
                    else
                    {
                        if (oncomplete != null)
                        {
                            oncomplete(null);
                        }
                        debug.logerror("load name = " + name + " tpye = " + typeof(t).tostring() + " failed!  ");
                    }
                };
            }
        }
        else
        {
            this.isload = true;
            this.handle = addressables.loadassetasync<t>(name);
            handle.completed += (result) =>
            {
                if (result.status == unityengine.resourcemanagement.asyncoperations.asyncoperationstatus.succeeded)
                {
                    var obj = result.result as t;
                    if (oncomplete != null)
                    {
                        oncomplete(obj);
                    }
                }
                else
                {
                    if (oncomplete != null)
                    {
                        oncomplete(null);
                    }
                    debug.logerror("load name = " + name + " tpye = " + typeof(t).tostring() + " failed!  ");
                }
            };
        }
    }

    /// <summary>
    /// 同步方法加载资源
    /// </summary>
    /// <typeparam name="t"></typeparam>
    /// <returns></returns>
    public virtual t load<t>() where t : unityengine.object
    {
        this.isload = true;
        this.handle = addressables.loadassetasync<t>(name);
        t obj = this.handle.waitforcompletion() as t;
        this.isload = false;
        return obj;
    }

    /// <summary>
    /// 同时加载多个资源
    /// </summary>
    /// <typeparam name="t"></typeparam>
    public virtual list<t> loads<t>() where t : unityengine.object
    {
        this.isload = true;
        this.handle = addressables.loadassetsasync<t>(name, (obj) => { });
        list<t> objs = this.handle.waitforcompletion() as list<t>;
        return objs;
    }

    public virtual void release()
    {
        if (this.isload)
        {
            this.isload = false;
            addressables.release(handle);
        }
    }
}

using system.collections;
using system.collections.generic;
using unityengine;
/// <summary>
/// 预制类资源加载器
/// </summary>
class gameobjectloader : baseloader
{
    /// <summary>
    /// 资源缓存列表
    /// </summary>
    private stack<gameobject> caches = new stack<gameobject>();

    /// <summary>
    /// 正在使用的列表
    /// </summary>
    private hashset<gameobject> references = new hashset<gameobject>();


    public gameobject prefab;

    public gameobjectloader(string name) : base(name)
    {
        this.prefab = null;
    }

    public gameobjectloader(gameobject obj) : base(obj.name)
    {
        this.prefab = obj;
    }
    /// <summary>
    /// 同步方法,确保已经加载好了
    /// </summary>
    /// <param name="parent"></param>
    /// <returns></returns>
    public gameobject instantiate(transform parent)
    {
        gameobject obj = null;
        if (caches.count > 0)
        {
            obj = caches.pop();
        }
        else
        {
            obj = gameobject.instantiate(this.prefab) as gameobject;
            obj.name = this.name;
        }
        this.references.add(obj);
        return obj;
    }

    /// <summary>
    /// 同步方法实例化对象
    /// </summary>
    /// <returns></returns>
    public gameobject instantiate()
    {
        if (caches.count > 0)
        {
            var obj = caches.pop();
            this.references.add(obj);
            return obj;
        }
        else
        {
            if (this.prefab != null)
            {
                var obj = gameobject.instantiate(this.prefab) as gameobject;
                obj.name = this.name;
                this.references.add(obj);
                return obj;
            }
            else
            {
                this.prefab = base.load<gameobject>();
                var obj = gameobject.instantiate(this.prefab) as gameobject;
                obj.name = this.name;
                base.release();
                this.references.add(obj);
                return obj;
            }
        }
    }

    public void free(gameobject obj)
    {
        this.caches.push(obj);
        this.references.remove(obj);
        obj.transform.setparent(assetmanager.instance.poolroot);
    }


    public override void release()
    {
        foreach (var obj in this.caches)
        {
            gameobject.destroy(obj.gameobject);
        }
        if (this.references.count <= 0)
        {
            base.release();
            assetmanager.instance.removepools(this.name);
        }
    }

}

using system.collections;
using system.collections.generic;
using unityengine;
using unityengine.addressableassets;
using unityengine.addressableassets.initialization;
/// <summary>
/// 全局单例资源管理器
/// 所有的资源加载最终都走此类入口
/// </summary>
public class assetmanager
{
    private static assetmanager assetmanager;
    public static assetmanager instance
    {
        get
        {
            if (assetmanager == null)
            {
                assetmanager = new assetmanager();
            }
            return assetmanager;
        }
    }

    #region prefab 预制加载管理
    /// <summary>
    /// 缓存对象根节点
    /// </summary>
    public unityengine.transform poolroot;

    private dictionary<string, gameobjectloader> pools = new dictionary<string, gameobjectloader>();
    /// <summary>
    /// 缓存查找表
    /// </summary>  
    private dictionary<gameobject, gameobjectloader> lookup = new dictionary<gameobject, gameobjectloader>();

    public assetmanager()
    {
        unityengine.transform poolnode = new gameobject("[asset pool]").transform;
        poolnode.transform.localposition = vector3.zero;
        poolnode.transform.localscale = vector3.one;
        poolnode.transform.localrotation = quaternion.identity;
        gameobject.dontdestroyonload(poolnode);
        //启动定时器,定时清理缓存池里的缓存
    }

    /// <summary>
    /// 同步实例化gameobject
    /// </summary>
    /// <param name="name"></param>
    /// <returns></returns>
    public gameobject instantiate(string name)
    {
        gameobjectloader loader;
        if (this.pools.trygetvalue(name, out loader))
        {
            var obj = loader.instantiate();
            this.lookup.add(obj, loader);
            return obj;
        }
        else
        {
            loader = new gameobjectloader(name);
            var obj = loader.instantiate();
            //添加缓存池
            this.pools.add(name, loader);
            //添加缓存查找表
            this.lookup.add(obj, loader);
            return obj;
        }
    }

    /// <summary>
    ///获取模板信息
    /// </summary>
    /// <param name="name"></param>
    /// <returns></returns>
    public gameobject gettemplete(string name)
    {
        gameobjectloader loader;
        if (this.pools.trygetvalue(name, out loader))
        {
            return loader.prefab;
        }
        return null;
    }

    /// <summary>
    /// 将资源释放回缓存池
    /// </summary>
    /// <param name="obj"></param>
    public void freegameobject(gameobject obj)
    {
        gameobjectloader loader;
        if (this.lookup.trygetvalue(obj, out loader))
        {
            loader.free(obj);
            //释放后从缓存查找表中移除
            this.lookup.remove(obj);
        }
    }

    public void removepools(string name)
    {
        this.pools.remove(name);
    }
    ///由定时器调用,定时清理缓存,一般设计为10分钟清理一次
    public void releaseall()
    {
        foreach (var item in this.pools.values)
        {
            item.release();
        }
    }

    #endregion
}

转载自:https://blog.csdn.net/qq_19428987/article/details/119353314

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com