Unity学习笔记(5):动态加载Prefab
第一种方法,从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的更多相关文章
- thinkphp学习笔记9—自动加载
原文:thinkphp学习笔记9-自动加载 1.命名空间自动加载 在3.2版本中不需要手动加载类库文件,可以很方便的完成自动加载. 系统可以根据类的命名空间自动定位到类库文件,例如定义了一个类Org\ ...
- Unity 动态加载 Prefab
Unity3D 里有两种动态加载机制:一个是Resources.Load,另外一个通过AssetBundle,其实两者区别不大. Resources.Load就是从一个缺省打进程序包里的AssetBu ...
- webpack学习笔记--按需加载
为什么需要按需加载 随着互联网的发展,一个网页需要承载的功能越来越多. 对于采用单页应用作为前端架构的网站来说,会面临着一个网页需要加载的代码量很大的问题,因为许多功能都集中的做到了一个 HTML 里 ...
- Unity实现精灵资源动态加载
private Sprite LoadSourceSprite(string relativePath) { //把资源加载到内存中 UnityEngine.Objec ...
- node 学习笔记 - Modules 模块加载系统 (1)
本文同步自我的个人博客:http://www.52cik.com/2015/12/11/learn-node-modules-path.html 用了这么久的 require,但却没有系统的学习过 n ...
- Openstack本学习笔记——Neutron-server服务加载和启动源代码分析(三)
本文是在学习Openstack过程中整理和总结.因为时间和个人能力有限.错误之处在所难免,欢迎指正! 在Neutron-server服务载入与启动源代码分析(二)中搞定模块功能的扩展和载入.我们就回到 ...
- Office365学习笔记—Lookup类型加载条目过多解决方案
1,随着接触的项目越来越多,遇到的各种奇葩的问题也越来越多,不得不说,SharePoint是个好东西,提高了开发效率,简化了很多基础的功能.但是令人头疼的问题是,当你想做个稍微复杂点的功能,就不得不研 ...
- Spring学习笔记(1)——资源加载
<!-- 占坑,迟点补充底层原理 --> Spring支持4种资源的地址前缀 (1)从类路径中加载资源——classpath: classpath:和classpath:/是等价的,都是相 ...
- node 学习笔记 - Modules 模块加载系统 (2)
本文同步自我的个人博客:http://www.52cik.com/2015/12/14/learn-node-modules-module.html 上一篇讲了模块是如何被寻找到然后加载进来的,这篇则 ...
随机推荐
- 在.NET中操作数字证书(新手教程)
.NET为我们提供了操作数字证书的两个主要的类,分为为: System.Security.Cryptography.X509Certificates.X509Certificate2类, 每个这个类的 ...
- Installing Oracle Database 12c Release 2(12.2) RAC on RHEL7.3 in Silent Mode
概要 在RHEL7静默方式安装oracle database 12.2 RAC. 一.环境配置 1. 配置hosts文件 cp /etc/hosts /etc/hosts_$(date +%Y%d%m ...
- Sequelize-nodejs-13-Working with legacy tables
Working with legacy tables使用遗留表 While out of the box Sequelize will seem a bit opinionated it's triv ...
- 【转】Python数据处理(四舍五入、除法部分)
转自:https://www.cnblogs.com/junyiningyuan/p/5338378.html 关于除法 传统除法 对两个整数进行除的运算,同时结果会舍去小数部分,返回一个整数.但如果 ...
- Opencv——摄像头设置
VideoCapture capture(0);/*设置摄像头参数 不要随意修改capture.set(CV_CAP_PROP_FRAME_WIDTH, 1080);//宽度 capture.set( ...
- http 的request和response 在servlet的应用文件下载
一)response 我们通过浏览器访问网站的时候,处理响应的是response. 它由三部门组成:响应行.响应头.响应体 作用:往浏览器写东西. 1)响应行 格式:协议/版本 状态码 状态码说明. ...
- MySQL(一)索引的创建和删除
索引是存储引擎用于快速找到记录的一种数据结构,这是索引的基本功能. 索引对于良好的性能非常关键.尤其是当表中的数据量越来越大时,索引对性能的影响愈发重要.接下来将讲述如何创建.查看和删除索引. 索引分 ...
- P1796 汤姆斯的天堂梦
题目描述 汤姆斯生活在一个等级为0的星球上.那里的环境极其恶劣,每天12小时的工作和成堆的垃圾让人忍无可忍.他向往着等级为N的星球上天堂般的生活. 有一些航班将人从低等级的星球送上高一级的星球,有时需 ...
- [iOS]拾遗补阙
一.AFNetworking POST纯字符串 修改位置AFURLRequestSerialization 修改前 NSString * AFQueryStringFromParameters(NSD ...
- package.json常用的字段
package.json中5个字段: name: 包名 今后下载时输入名称 (注意:要与下载的包名不一样) version:版本号 x.x.x 例如 1.2.3 1 大版本:当这个包有巨大内容变化时( ...