第一种方法,从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的包名unity动态加载游戏对象,第二个选项为包的后缀名,自定义你想要的包名和后缀,将想要打在一个包的资源的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(Name);
}
}
可以通过AssetBundleLoader.LoadAssetBundle(string, string)来加载Prefab等资源游戏策划,关于这个函数要不要先卸载AssetBundle,这取决于你的框架是否只需要加载一次这个包,并且有一个管理这些资源的系统unity动态加载游戏对象,我这种做法无疑是降低效率的(其实就是懒得再搭个系统),根据实际情况用不同的方式来加载AssetBundle吧
文章来源:https://blog.csdn.net/haowenlai2008/article/details/82807019