第一种方法,从Resources文件夹读取Prefab

Assets/Resources文件夹是Unity中的一个特殊文件夹,在博主当前的认知里,放在这个文件夹里的Prefab可以被代码动态加载

直接上代码

GameObject Prefab = (GameObject)Resources.Load("Prefabs/Character");
Instantiate(Prefab);

第二种方法,绝对路径读取Prefab

这种方法仅限Editor模式使用,在制作插件的时候会经常用到

GameObject gb = AssetDatabase.LoadAssetAtPath("Assets/Prefabs/Character.prefab", typeof(GameObject)) as GameObject;
Instantiate(gb)

Resources.Load函数返回一个object对象,第一个参数为以Resources为根目录,目标Prefab的路径,第二个参数为Prefab的名字,最后将这个object对象强转成(GameObjcet)就可以获得Prefab了

第三种方法,把Prefab打包成AssetBundle并且使用AssetBundle相关API动态加载

1.首先在资源管理器中找到你想打包的Prefab,找到Inspector页面下面的Asset_Labels,打开



发现AssetBundle后面有两个选项,第一个选项为AssetBundle的包名,第二个选项为包的后缀名,自定义你想要的包名和后缀,将想要打在一个包的资源的AssetBundle的包名和后缀设置成一样的

2.编写AssetBundle生成工具

在Asset下创建文件夹Plugins,再在Plugins下创建文件夹Editor,在Plugins/Editor下创建脚本CreateAssetBundles.cs

Plugins/Editor和Resource一样是特殊路径,在Plugins下的脚本的编译优先级高于普通脚本。

CreateAssetBundles.cs:

using UnityEditor;
using System.IO; public class CreateAssetBundles {
//设定AssetBundle的储存路径
static string AssetbundlePath = "Assets" + Path.DirectorySeparatorChar + "assetbundles" + Path.DirectorySeparatorChar;
//编辑器扩展
[MenuItem("Assets/Build AssetBundle")]
static void BuildAssetsBundles()
{
//创建路径
if (Directory.Exists(AssetbundlePath) == false)
{
Directory.CreateDirectory(AssetbundlePath);
}
//使用LZMA算法打包
BuildPipeline.BuildAssetBundles(AssetbundlePath, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
}
}

BuildPipeline.BuildAssetBundles的第二个参数是打包的压缩方式

有三个可选参数

BuildAssetBundleOptions.None LZMA算法压缩,压缩包小,加载慢

BuildAssetBundleOptions.UncompressedAssetBundle; 不压缩,包大,加载快

BuildAssetBundleOptions.ChunkBasedCompression LZ4压缩,压缩率比LZMA低,可以加载指定资源不用解压全部

保存

回到Unity Editor,点击Assets可以看到最下面出现了Build AssetBundle选项,点击Build AssetBundle,打包



打包完成后可以在刚刚设置的AssetBundle所在路径找到几个文件



这几个文件具体是什么暂时不讨论

3.加载Prefab

创建脚本AssetBundleLoader.cs

AssetBundleLoader.cs:

using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class AssetBundleLoader
{
//参数1是AssetBundle的路径,参数2是资源的名称
public static GameObject LoadAssetBundle(string Path, string Name)
{
//1.卸载数据,如果有某个系统来管理加载好的数据就不要加下面这句了
AssetBundle.UnloadAllAssetBundles(true); //2.加载数据
AssetBundle ab = AssetBundle.LoadFromFile(Path); return ab.LoadAsset<GameObject>(Name);
}
}

可以通过AssetBundleLoader.LoadAssetBundle(string, string)来加载Prefab等资源,关于这个函数要不要先卸载AssetBundle,这取决于你的框架是否只需要加载一次这个包,并且有一个管理这些资源的系统,我这种做法无疑是降低效率的(其实就是懒得再搭个系统),根据实际情况用不同的方式来加载AssetBundle吧

Unity学习笔记(5):动态加载Prefab的更多相关文章

  1. thinkphp学习笔记9—自动加载

    原文:thinkphp学习笔记9-自动加载 1.命名空间自动加载 在3.2版本中不需要手动加载类库文件,可以很方便的完成自动加载. 系统可以根据类的命名空间自动定位到类库文件,例如定义了一个类Org\ ...

  2. Unity 动态加载 Prefab

    Unity3D 里有两种动态加载机制:一个是Resources.Load,另外一个通过AssetBundle,其实两者区别不大. Resources.Load就是从一个缺省打进程序包里的AssetBu ...

  3. webpack学习笔记--按需加载

    为什么需要按需加载 随着互联网的发展,一个网页需要承载的功能越来越多. 对于采用单页应用作为前端架构的网站来说,会面临着一个网页需要加载的代码量很大的问题,因为许多功能都集中的做到了一个 HTML 里 ...

  4. Unity实现精灵资源动态加载

    private Sprite LoadSourceSprite(string relativePath) {         //把资源加载到内存中         UnityEngine.Objec ...

  5. node 学习笔记 - Modules 模块加载系统 (1)

    本文同步自我的个人博客:http://www.52cik.com/2015/12/11/learn-node-modules-path.html 用了这么久的 require,但却没有系统的学习过 n ...

  6. Openstack本学习笔记——Neutron-server服务加载和启动源代码分析(三)

    本文是在学习Openstack过程中整理和总结.因为时间和个人能力有限.错误之处在所难免,欢迎指正! 在Neutron-server服务载入与启动源代码分析(二)中搞定模块功能的扩展和载入.我们就回到 ...

  7. Office365学习笔记—Lookup类型加载条目过多解决方案

    1,随着接触的项目越来越多,遇到的各种奇葩的问题也越来越多,不得不说,SharePoint是个好东西,提高了开发效率,简化了很多基础的功能.但是令人头疼的问题是,当你想做个稍微复杂点的功能,就不得不研 ...

  8. Spring学习笔记(1)——资源加载

    <!-- 占坑,迟点补充底层原理 --> Spring支持4种资源的地址前缀 (1)从类路径中加载资源——classpath: classpath:和classpath:/是等价的,都是相 ...

  9. node 学习笔记 - Modules 模块加载系统 (2)

    本文同步自我的个人博客:http://www.52cik.com/2015/12/14/learn-node-modules-module.html 上一篇讲了模块是如何被寻找到然后加载进来的,这篇则 ...

随机推荐

  1. 使用 Bulk Copy 将大量数据复制到数据库

    如果一次要向数据库服务器提交多条记录 , 通常会执行多次Insert命令 , 这样就为要插入的每个记录执行一次与数据库服务器的往返 , 这就给服务器增加了压力 , 效率也大大的降低了... .Net  ...

  2. TensorFlow函数(十)tf.global_variables_initializer()

    tf.global_variables_initializer() 此函数是初始化模型的参数 with tf.Session() as sess: tf.global_variables_initia ...

  3. 利用Zookeeper实现分布式锁及服务注册中心

    对于Zookeeper的定义以及原理,网上已经有很多的优秀文章对其进行了详细的介绍,所以本文不再进行这方面的阐述. 本文主要介绍一些基本的准备工作以及zookeeper.net的使用. 本文源代码gi ...

  4. 【转】numpy中 meshgrid 和 mgrid 的区别和使用

    转自:https://www.cnblogs.com/shenxiaolin/p/8854197.html 一.meshgrid函数 meshgrid函数通常使用在数据的矢量化上. 它适用于生成网格型 ...

  5. 新手搭建 x-boot 编译环境笔记

    1.需要先搭建交叉编译环境,即制作交叉编译工具链,这个过程比较复杂,所以我在这里使用别人做好的交叉编译工具链. 2018年8月27日15:03:37   2.X-boot 源码github地址:htt ...

  6. iOS UITextField的代理<UITextFieldDelegate>的几点笔记

    今天做项目的时候,有个需求,点击按钮,就在特定的编辑框输入按钮中的文字,一开始我还以C++的思想来写,先获取光标的位置,然后在判断是否在那个编辑框,进行输入.后来我旁边的同事看到了直接教我用代理方法, ...

  7. 转:超级好用的流程图js框架

    支叫图论(Graph Theroy).利用图我们可以做很多工具,比如思维导图,流程图,状态机,组织架构图,等等.今天我要做的是用开源的HTML5工具来快速构造一个做图的工具. 工具选择 预先善其事,必 ...

  8. jQuery----左侧导航栏面板切换实现

    页面运行结果:                                                      点击曹操 点击刘备 点击孙权 原图 需求说明:原图如上所示,点击一方诸侯的时候 ...

  9. Mybatis联合查询记录,左连接参数操作

    公司业务需求要做个列表的排序 而实际排序的字段不再本库中,需要跨库去拿到字段,因为是微服务体系架构,不可能Left join跨库的表,所以决定调用一次跨服务的API拿到排序相关的对象,里面包含需要排序 ...

  10. php对接网易云信视频直播

    <?php/** * Created by PhpStorm. * User: lhl * Date: 2019/4/10 * Time: 17:31 */ namespace app\api\ ...