赞
踩
例如:
using UnityEngine;
using UnityEngine.UI;
public class LoadTest1:MonoBehaviour
{
private void Start()
{
Sprite sp=Resources.Load<Sprite>("Pic"); //"Pic"是资源的名字
GameObject obj=Resources.Load<GameObject>("Prefab01");
Instantiate(obj);
}
}
此种方式只能访问Resources文件夹下的资源。
第二种方式就是使用AssetBundle(AssetBundle是一个资源的集合,可以是Unity3D所支持的任何资源格式)。
创建AssetBundle文件
using UnityEditor; public class CreateAssetBundles { [MenuItem("AB/Build AssetBundles")] static void BuildAllAssetBundles() { //要创建的目录 string assetBundleDirectory = "Assets/AssetBundles"; if(!Directory.Exists(assetBundleDirectory)) { Directory.CreateDirectory(assetBundleDirectory); } //三个参数:第一个是创建的目录位置,第二个是AssetBundle的压缩方式,第三个是创建的平台。 BuildPipeline.BuildAssetBundles(assetBundleDirectory, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows); } }
构建好后输出目录中会多出一个与目录名相同的AssetBundle文件和他的manifest文件;然后其余你每分配的一个AssetBundle对应一个文件和同名的manifest文件。
加载AssetBundle文件
using UnityEngine;
public class LoadTest02:MonoBehaviour
{
private void Start()
{
string path=Application.dataPath+"/AssetBundles/"+"roles"; //最后一个字符串是AssetBundle的名字
AssetBundle assetBundle=AssetBundle.LoadFromFile(path);
if(assetBundle==null)
{
return;
}
GameObject obj=assetBundle.LoadAsset<GameObject>("Role01"); //字符串是AssetBundle中资源名称
Instantiate(obj);
}
}
using UnityEngine; using System.IO; public class LoadTest02:MonoBehaviour { private void Start() { string path=Application.dataPath+"/AssetBundles/"+"roles"; //最后一个字符串是AssetBundle的名字 AssetBundle assetBundle=AssetBundle.LoadFromMemory(File.ReadAllBytes(path)); if(assetBundle==null) { return; } GameObject obj=assetBundle.LoadAsset<GameObject>("Role01"); //字符串是AssetBundle中资源名称 Instantiate(obj); } }
此方法与LoadFromFile相比只是将path换成了File.ReadAllBytes(path),即LoadFromMemory的参数是接受的一个字节数组,可以用任何AssetBundle的字节数组替换File.ReadAllBytes()。
using UnityEngine; using UnityEngine.Networking; using System.IO; public class LoadTest03:MonoBehaviour { private void Start() { StartCoroutine(LoadFromRemote()); } private IEnumerator LoadFromRemote() { string path="D:/Documents/ABRep/roles"; string uri="file:///"+path; //可将uri换成任何相关的AssetBundle服务器 UnityWebRequest reques=UnityWebRequestAssetBundle.GetAssetBundle(uri,0); yield return request.SendWebRequest(); AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request); GameObject obj= bundle.LoadAsset<GameObject>("Role02"); Instantiate(obj); } }
以上都是使用通本方法,还有对应的异步方法LoadFromFileAsync,LoadFromMemoryAsync等
扩展:关于版本更新便是使用AssetBundle。通过自定义相关的Version.txt版本文件,每次打开游戏便从远程服务器拉取最新的Version.txt,对比之后,进行扩展包(AssetBundle资源)的下载。之后再谈谈下载相关的问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。