精华内容
下载资源
问答
  • Unity资源的加载有很多方式,通过Resource去进行动态加载,当需要热更新的时候,就需要通过加载AB包的方式,如果单独用一种方式进行加载的话,当需要用到另外一种的时候,往往需要对逻辑进行较大的更改,更改...

    在Unity中资源的加载有很多方式,通过Resource去进行动态加载,当需要热更新的时候,就需要通过加载AB包的方式,如果单独用一种方式进行加载的话,当需要用到另外一种的时候,往往需要对逻辑进行较大的更改,更改代码永远是不好的,这个时候我们面向接口,到时候只需要更换加载,而不需要去管代码的逻辑。资源的动态加载以及脚本的动态挂载,有两种方式,第一种需要预制体的名字和脚本名字保持一致,通过Type.GetType的方式获取到当前脚本的类型,那这样看到第一种相对简单也算是也一点限制,第二种呢,通过Attribute特性的方式去动态挂载脚本

    一.第一种动态资源加载和脚本挂载

    1.第一种动态资源加载和脚本挂载,跟根据需要加载的参数,写出加载的方法,创建一个名为ResourceLoad的方法以及ABLoad的方法,全部继承至ILoad的接口实现动态加载资源。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class ResourceLoad :ILoad
    {
        public GameObject LoadPrefab(string path, Transform parent = null)
        {
           GameObject temp =  Resources.Load<GameObject>(path);
            GameObject go = UnityEngine.Object.Instantiate(temp, parent);
            return go;
        }
    }
    
    using UnityEngine;
    
    public class ABLoad : ILoad
    {
        public GameObject LoadPrefab(string path, Transform parent = null)
        {
            return null;
        }
    }
    
    using UnityEngine;
    
    public interface ILoad 
    {
        GameObject LoadPrefab(string path, Transform parent = null);
    }
    
    

    2.接下来我们需要创建一个加载的管理类,在这个管理器里面可以选择加载方式,资源的加载和脚本的添加都在这个管理器进行实现。接下来先实现第一种方式,通过得到接口,但是却可以选择new不同的子类,这里面就运用到了里氏转换原则,可以将子类向上转换为父类进行实现。通过LoadPrefab加载资源,通过Type.GetType得到当前预制体类型,然后动态添加,这种方式必须要求预制体名称和脚本名称一致。

    using UnityEngine;
    using System;
    public class LoadManager : NormalSingeleton<LoadManager>
    {
        private ILoad loader;
    
        public LoadManager()
        {
               loader = new ResourceLoad();  //Resource加载
              //loader = new ABLoad(); //AB加载
        }
    
        /// <summary>
        /// 1.预制体名称和脚本名称保持一致,使用Type.GetType获得预制体的脚本类型
        /// </summary>
        public GameObject LoadPrefab(string path, Transform parent = null)
        {
             GameObject temp =  loader.LoadPrefab(path, parent);
            Type type = Type.GetType(temp.name.Remove(temp.name.Length - 7));
            temp.AddComponent(type);
            return temp;
        }
    }
    
    

    3.接下创建一个LaunchGame脚本作为场景的启动脚本,用于调用LoadManager的加载预制体的方法,传入加载的路径和父物体。

    using UnityEngine;
    
    public class LaunchGame : MonoBehaviour
    {
        void Start()
        {
            LoadManager.Instance.LoadPrefab("Prefabs/StartView", transform);
        }
        void Update()
        {
            
        }
    }
    

    4.最后运行的效果如下
    在这里插入图片描述

    二.第二种运用特性动态资源加载和脚本挂载

    1.下面我们运用第二种特性的方法进行动态加载资源以及动态添加脚本,创建一个名为BindPrefab的脚本,该脚本继承至Attribute,自定义一个特性,只应用于Class,在构造方法初始化资源的路径

    using System;
    [AttributeUsage(AttributeTargets.Class)]
    
    public class BindPrefab :Attribute
    {
        public string path;
    
        public BindPrefab(string path)
        {
            this.path = path;
        }
       
    }
    
    

    2.创建一个名为BindUtil的工具类,创建一个字典用于key用于存储路径,value存储类型,有Bind和Load两个方法,Bind方法添加路径和类型,Load方法跟据路径得到类型

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class BindUtil
    {
    
        private static Dictionary<string, Type> prefabAndScritMaps = new Dictionary<string, Type>();
    
        /// <summary>
        /// 绑定预制体
        /// </summary>
        public static void Bind(string path,Type type)
        {
            //Debug.Log("Path:" + path);
            if (!prefabAndScritMaps.ContainsKey(path))
            {
                prefabAndScritMaps.Add(path, type);
            }
            else
            {
                Debug.LogError("当前数据这已经存在该路径" + path);
            }
        }
    
    
        /// <summary>
        /// 加载预制体
        /// </summary>
        /// <returns></returns>
        public static Type Load(string path)
        {
            //Debug.Log("Path:" + path);
            if (prefabAndScritMaps.ContainsKey(path))
            {
                return prefabAndScritMaps[path];
            }
            else
            {
                Debug.LogError("当前数据中不存在该路径");
                return null;
            }
    
        }
    
    }
    
    

    3.创建一个名为IntiCustomAttribute的脚本,对BindPrefab我们自定义的特性进行初始化,先是得到BindPrefab类中的程序集,之后得到该程序集下所有共有的方法,检索每个Type类型所拥有的特性,然后强制转换为当前类型,调用BindUtil的方法将路径和类型进行绑定。

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Reflection;
    using UnityEngine;
    
    /// <summary>
    /// 初始化特性
    /// </summary>
    public class InitCustomAttribute 
    {
        public void Init()
        {
    
            //获取在其中定义指定类型的当前加载的程序集。返回的程序集中的类型。
            Assembly assembly = Assembly.GetAssembly(typeof(BindPrefab));
            //Debug.Log("Assembly:" + assembly.FullName);
            //Debug.Log("Assembly:" + assembly.CodeBase);
            //得到该程序集种所有的Type类型,也就是得到该程序集下面所有共有的方法
            Type[] types =  assembly.GetExportedTypes();
            foreach (Type type in types)
            {
                //Debug.Log("Type:" + type);
    
                //得到每个Type类型所拥有的特性
                foreach (Attribute attribute in Attribute.GetCustomAttributes(type, true))
                {
                    Debug.Log("Attribute:"+attribute);
                    if(attribute is BindPrefab)
                    {
                        BindPrefab date = attribute as BindPrefab;
                        BindUtil.Bind(date.path, type);
                    }
                }
            }
        }
        
    
    }
    
    

    4.在StartView脚本中,使用该特性,传入资源的路径,就相当于调用BindPrefab的构造函数

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    [BindPrefab("Prefabs/StartView")]
    public class StartView : MonoBehaviour
    {
       
        void Start()
        {
            
        }
        
        void Update()
        {
            
        }
    }
    
    

    5.在LoadManager得到资源和动态挂载脚本,通过BindUtil.Load得到类型,进行动态添加

    
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using System;
    public class LoadManager : NormalSingeleton<LoadManager>
    {
        private ILoad loader;
    
        public LoadManager()
        {
            loader = new ResourceLoad();  //Resource加载
            //loader = new ABLoad(); //AB加载
        }
    
        /// <summary>
        /// 1.预制体名称和脚本名称保持一致,使用Type.GetType获得预制体的脚本类型
        /// </summary>
        //public GameObject LoadPrefab(string path, Transform parent = null)
        //{
        //     GameObject temp =  loader.LoadPrefab(path, parent);
        //    Type type = Type.GetType(temp.name.Remove(temp.name.Length - 7));
        //    temp.AddComponent(type);
        //    return temp;
        //}
    
        public GameObject LoadPrefab(string path, Transform parent = null)
        {
            GameObject temp = loader.LoadPrefab(path, parent);
             Type type =  BindUtil.Load(path);
            temp.AddComponent(type);
            return temp;
        }
    
    
    }
    
    

    6.最后在我们的LaunchGame中进行初始化和加载

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class LaunchGame : MonoBehaviour
    {
    
        void Start()
        {
            InitCustomAttribute initCustomAttr = new InitCustomAttribute();
            initCustomAttr.Init();
    
            LoadManager.Instance.LoadPrefab("Prefabs/StartView", transform);
        }
    
    }
    
    

    7.得到一样的效果
    在这里插入图片描述

    展开全文
  • Unity动态加载资源的几种方式

    千次阅读 2019-02-21 15:09:37
    Unity资源加载的几种方式: instantiate:最简单的一种方式,以实例化的方式动态生成一个物体。 Assetsbundle:即将资源打成 asset bundle 放在服务器或本地磁盘,然后使用WWW模块get 下来,然后从这个bundle中...

    Unity资源加载的几种方式:

    instantiate:最简单的一种方式,以实例化的方式动态生成一个物体。

    Assetsbundle:即将资源打成 asset bundle 放在服务器或本地磁盘,然后使用WWW模块get 下来,然后从这个bundle中load某个object,unity官方推荐也是绝大多数商业化项目使用的一种方式。

    AssetDatabase.loadasset :这种方式只在editor范围内有效,游戏运行时没有这个函数,它通常是在开发中调试用的。

    Resource.Load:可以直接load并返回某个类型的Object,前提是要把这个资源放在Resource命名的文件夹下,Unity不管有没有场景引用,都会将其全部打入到安装包中。

    展开全文
  • 方式 特点 用法 Resource.load ...在Asset文件夹下建一个Resources命名的文件夹,在打包安装包时会把 Resources文件夹下的...将资源打包成小的 bundle,用哪个就 load 哪个,还能分包发布和版本升级(patch)。...
    方式 特点  用法 
    Resource.load  安装包会比较大  在Asset文件夹下建一个Resources命名的文件夹,在打包安装包时会把 Resources文件夹下的所有文件都打包进去,不管是否有场景引用。  
    AssetBundle  按需加载  将资源打包成小的 bundle,用哪个就 load 哪个,还能分包发布和版本升级(patch)。bundle 可以放在远程服务器上或者打包进去。
    AssetDatabase.loadasset 相当于AssetBundle的调试模式  不需要新增(修改)一个文件就重新打包一次 bundle,只能在 editor 环境下使用。 

    转载于:https://www.cnblogs.com/sweetXiaoma/p/9336993.html

    展开全文
  • 可以直接 load 并返回某个类型的 Object, 前提是要把这个资源放在 Resources 命名的文件夹下, Unity 不管有没有场景引用, 都会将其全部打包至安装包中. Resources.Load(); (2) 通过 bundle 的形式 : 将资源打成 ...

    1. 三种方式 #

    (1) 通过 Resources 模块, 调用它的 load 函数 :
    可以直接 load 并返回某个类型的 Object, 前提是要把这个资源放在 Resources 命名的文件夹下, Unity 不管有没有场景引用, 都会将其全部打包至安装包中. Resources.Load();

    (2) 通过 bundle 的形式 :
    将资源打成 asset bundle 放在服务器或本地磁盘, 然后使用 WWW 模块 get 下来, 然后从这个 bundle 中 load 某个 object. AssetBundle

    (3) 通过 AssetDatabase.loadasset :
    这种方式只在 Editor 范围内有效, 游戏运行时没有这个函数, 通常是在开发中调用使用的. AssetDatabase 资源数据库

    2. 各方式的对比 #

    (1) Resources 的方式需要把所有资源全部打包到安装包中, 对游戏的分包发布(微端)和版本升级(patch)是不利的, Unity 推荐的方式是不用它, 都用 bundle 的方式替代;

    (2) Bundle 的方式把资源打成几个小的 bundle, 用哪个就 load 哪个, 这样还能分包发布和 patch, 但是在开发过程中, 有时候不可能更新一个资源就打一次 bundle;

    (3) 既然在开发的过程中不可能每更新一个资源就打一次 bundle, 所以在 Editor 的环境下就可以使用 AssetDatabase 来模拟, 通常需要我们封装一个 dynamic resource 的 loader 模块, 在不同的环境下做不同实现.

    3. 动态资源的存放 #

    有时候需要存放一些自己的文件在磁盘上, 例如想把几个 bundle 放在初始的安装里, Unity 有一个 Streaming Asset 的概念, 用于提供存储接口的访问. 需要在编辑器建立一个 StreamingAssets 名字的文件夹, 把需要放在客户磁盘上的动态文件放在这个文件夹下, 这样, 安装之后这些文件就会在用户磁盘的指定位置, 这个位置可以通过 Application.streamingAssetsPath 来得到.

    Not End.

    转载于:https://www.cnblogs.com/isayes/p/6593774.html

    展开全文
  •  有人说使用unity 的WWW类的LoadFromCacheOrDownload方法就可以实现缓存加载的方式,但是我自己使用的时候发现在unity编辑器环境下是可以的,但是到Android和iOS平台下就会有问题,会导致每次进入资源都是从网络上...
  • 首先介绍下Resources.Load的使用方法 在这里为了简单使用一个Cube代替, 首先在Project面板建立一个...就可以动态加载出你的预设体了 转载自: 作者:吐泡泡的小鲤鱼 链接:https://www.jianshu.com/p/eb0018ff25a4
  • unity动态加载远程资源的相关话题网上有一些,但都语焉不详,经过本人的摸索,终于找到门道,记录下来备忘,也分享给同好。 unity动态加载远程资源需要用到unity的一个runtime class,叫做WWW,可以在帮助里面的...
  • unity动态加载远程资源

    千次阅读 2013-09-28 17:28:39
    unity动态加载远程资源的相关话题网上有一些,但都语焉不详,经过本人的摸索,终于找到门道,记录下来备忘,也分享给同好。 unity动态加载远程资源需要用到unity的一个runtime class,叫做WWW,可以在帮助里面...
  • Unity3D动态加载资源

    2016-07-12 14:16:26
    unity3d动态加载资源案例,里面有完整的代码和Demo
  • Unity动态加载sprite资源 public class LoadingSprite : MonoBehaviour { private SpriteAtlas headAtlas; /// <summary> /// 动态加载资源 /// </summary> /// <typeparam name="T"></...
  • unity动态加载Resources.Load方法

    万次阅读 多人点赞 2016-04-08 09:46:25
    Resources.Load:使用这种方式加载资源,首先需要下Asset目录下创建一个名为Resources的文件夹,这个命名是U3D规定的方式,然后把资源文件放进去,当然也可以在Resources中再创建子文件夹,代码加载时需要添加相应的...
  • unity3d动态加载资源

    2019-07-07 01:53:48
    Unity3D的网络游戏中实现资源动态加载 分类:最新学习2012-06-14 13:351127人阅读评论(0)收藏举报 网络游戏nullvectorjson游戏string 用Unity3D制作基于web的网络游戏,不可避免的会用到一个技术-资源动态...
  • Unity动态加载3D模型

    2020-07-09 20:07:03
    Unity动态加载3D模型 在Unity中创建游戏对象的方法有 3 种: 第一种是将物体模型资源由 Project 视图直接拖曳到 Hierarchy 面板中; 第二种是在 Unity 3D 菜单 GameObject 中创建 Unity 3D 自带的游戏对象,如 ...
  • 从网上找的相关动态加载的资料,然后自己又稍微整理整理,分了分类而已。
  • Unity 动态加载Prefab

    千次阅读 2019-05-11 14:11:56
    Assets/Resources是Unity中的一个特殊文件夹,放在这个文件夹里的资源包括Prefab可以被代码动态加载。 GameObject Prefab = (GameObject)Resources.Load("Prefabs/Character"); Instantiate(Prefab); ...
  • 本文转载自:... 初步整理并且学习unity动态加载资源.html' target='_self'>3d资源加载方法,预计用时两天完成入门学习Unity3d常用两种加载资源方案:Resources.Load和AssetBundle R...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 737
精华内容 294
关键字:

unity动态加载资源