Unity5-ABSystem(三):AssetBundle加载
2017-02-15 10:49
344 查看
转载自:http://blog.csdn.net/lodypig/article/details/51872595
Unity特殊路径
Resources
StreamingAssetsPath
PersistentDataPath
DataPath
同步加载
核心函数
安卓平台下不能同步加载问题
示例
异步加载
核心函数
示例
WWW异步加载
资源加载
核心函数
在加载AssetBundle时,要给出AssetBundle文件路径,Unity有很多特殊路劲,这里列出部分与加载相关的路径。这些路径在不同平台下是不相同的,并可能包含项目或公司名字。下文中出现的类似myProject、myCompany应换成你工程所对应的名字。
Resources文件可以在根目录下,也可以在子目录下,只要叫Resources就好。Resources目录下所有资源将被打包进游戏存放资源的archive中,Resources目录在应用中也就不复存在,但加载时仍使用曾在Resource下的路径。
该目录下所有资源会被压缩,只读不可写,使用Resources.Load()接口加载。
<
10f60
h2 id="streamingassetspath" style="margin:.8em 0px;padding:0px;font-weight:100;color:rgb(85,85,85);font-family:'microsoft yahei';line-height:35px;">
StreamingAssetsPath
StreamingAssets目录必须在根目录下,该目录下所有资源也会被打包到游戏里,不同于Resources目录,该目录下的资源不会进行压缩,同样是只读不可写的。Unity基本也没有提供从该路径下直接读取资源的方法,只有www可以加载audioClip、texture和二进制文件。但Unity提供了从该目录加载AssetBundle的方法,我们一般直接在这个目录下存放AssetBundle文件。可以通过Application.streamingAssetsPath访问该路径。
各平台StreamingAssets路径:
Win:E:/myProj/Assets/StreamingAssets
Mac : /myProj/Assets/StreamingAssets
Andorid:jar:file:///data/app/com.myCompany.myProj-1/base.apk!/assets
iOS: /var/containers/Application/E5543D66-83F3-476D-8A8F-49D5332B3763/myProj.app/Data/Raw
该目录为应用程序沙盒目录,应用程序安装后才会出现。该目录独特之处在于是可写的,所以我们一般将下载的AssetBundle存放于此。使用Application.persistentDataPath访问。
各平台PersistentDataPath路径:
Win:C:/Users/lodypig/Appdata/LocalLow/myCompany/myProj
Mac : /Users/lodypig/Library/Application Support/myCompany/myProj
Andorid:/data/data/com.myCompany.myProj/files
iOS: /var/mobile/Containers/Data/Appliction/A112252D-6B0E-459Z-9D49-CD3EAC6D47D/Documents
应用程序目录,即Assets目录。使用Appliction.dataPath访问。
各平台DataPath路径:
Win:E:/myProj/Assets
Mac : /myProj/Assets/
Andorid:/data/app/com.myCompany.myProj-1/base.apk!
iOS: /var/containers/Application/E5543D66-83F3-476D-8A8F-49D5332B3763/myProj.app/Data
安卓平台下,直接使用Application.streamingAssetsPath进行加载会报cannot open archive的错误,原因是加载时路径不对。可以返回上面看一下,安卓平台下Application.streamingAssetsPath以jar:file://开头,跟其他人都不一样。将这段去掉就能够正常加载。而去掉后等价于Application.dataPath
+ “!assets”,所以在Android下我们用该路径加载。
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
除了使用AssetBundle.LoadFromFileAsync外,还可以使用www异步加载AssetBundle。
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2
1
2
没什么好说的,上代码吧。同样是同步和异步两种方式。
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
除了这些外,还有LoadAllAssetsAsync、LoadAllAssets等方法,详情见Unity官方网站。
Unity特殊路径
Resources
StreamingAssetsPath
PersistentDataPath
DataPath
同步加载
核心函数
安卓平台下不能同步加载问题
示例
异步加载
核心函数
示例
WWW异步加载
资源加载
核心函数
Unity特殊路径
在加载AssetBundle时,要给出AssetBundle文件路径,Unity有很多特殊路劲,这里列出部分与加载相关的路径。这些路径在不同平台下是不相同的,并可能包含项目或公司名字。下文中出现的类似myProject、myCompany应换成你工程所对应的名字。
Resources
Resources文件可以在根目录下,也可以在子目录下,只要叫Resources就好。Resources目录下所有资源将被打包进游戏存放资源的archive中,Resources目录在应用中也就不复存在,但加载时仍使用曾在Resource下的路径。 该目录下所有资源会被压缩,只读不可写,使用Resources.Load()接口加载。
<
10f60
h2 id="streamingassetspath" style="margin:.8em 0px;padding:0px;font-weight:100;color:rgb(85,85,85);font-family:'microsoft yahei';line-height:35px;">
StreamingAssetsPath
StreamingAssets目录必须在根目录下,该目录下所有资源也会被打包到游戏里,不同于Resources目录,该目录下的资源不会进行压缩,同样是只读不可写的。Unity基本也没有提供从该路径下直接读取资源的方法,只有www可以加载audioClip、texture和二进制文件。但Unity提供了从该目录加载AssetBundle的方法,我们一般直接在这个目录下存放AssetBundle文件。可以通过Application.streamingAssetsPath访问该路径。
各平台StreamingAssets路径:
Win:E:/myProj/Assets/StreamingAssets
Mac : /myProj/Assets/StreamingAssets
Andorid:jar:file:///data/app/com.myCompany.myProj-1/base.apk!/assets
iOS: /var/containers/Application/E5543D66-83F3-476D-8A8F-49D5332B3763/myProj.app/Data/Raw
PersistentDataPath
该目录为应用程序沙盒目录,应用程序安装后才会出现。该目录独特之处在于是可写的,所以我们一般将下载的AssetBundle存放于此。使用Application.persistentDataPath访问。 各平台PersistentDataPath路径:
Win:C:/Users/lodypig/Appdata/LocalLow/myCompany/myProj
Mac : /Users/lodypig/Library/Application Support/myCompany/myProj
Andorid:/data/data/com.myCompany.myProj/files
iOS: /var/mobile/Containers/Data/Appliction/A112252D-6B0E-459Z-9D49-CD3EAC6D47D/Documents
DataPath
应用程序目录,即Assets目录。使用Appliction.dataPath访问。 各平台DataPath路径:
Win:E:/myProj/Assets
Mac : /myProj/Assets/
Andorid:/data/app/com.myCompany.myProj-1/base.apk!
iOS: /var/containers/Application/E5543D66-83F3-476D-8A8F-49D5332B3763/myProj.app/Data
同步加载
核心函数
AssetBundle.LoadFromFile(string path);
安卓平台下不能同步加载问题
安卓平台下,直接使用Application.streamingAssetsPath进行加载会报cannot open archive的错误,原因是加载时路径不对。可以返回上面看一下,安卓平台下Application.streamingAssetsPath以jar:file://开头,跟其他人都不一样。将这段去掉就能够正常加载。而去掉后等价于Application.dataPath+ “!assets”,所以在Android下我们用该路径加载。
示例
public class AssetBundleLoader { // 根据不同平台,声明StreamingAssetsPath路径 public static readonly string STREAMING_ASSET_PATH = #if UNITY_ANDROID Application.dataPath + "!assets"; // 安卓平台 #else Application.streamingAssetsPath; // 其他平台 #endif // 从StreamingAssetsPath加载 public static AssetBundle LoadFromStreamingAssetsPath(string assetbundle) { return AssetBundle.LoadFromFile(STREAMING_ASSET_PATH + "/" + assetbundle); } // PersistantDataPath加载 public static AssetBundle LoadFromPersistantDataPath(string assetbundle) { return AssetBundle.LoadFromFile(Application.persistentDataPath+ "/" + assetbundle) } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
异步加载
核心函数
AssetBundle.LoadFromFileAsync(string path);
示例
public class AssetBundleLoader : MonoBehaviour { // 声明StreamingAssetsPath如上 public static readonly string STREAMING_ASSET_PATH = ... // 协程实现 static IEnumerator LoadAsyncCoroutine(string path, Action<AssetBundle> callback) { AssetBundleCreateRequest abcr = AssetBundle.LoadFromFileAsync(path); yield return abcr; callback(abcr.assetBundle); } // 开启协程 static bool LoadAssetbundleAsync(string finalPath, Action<AssetBundle> callback) { StartCoroutine(LoadAsyncCoroutine(finalPath, callback)); } // 从StreamingAssetsPath异步加载 public static AssetBundle LoadFromStreamingAssetsPathAsync(string assetbundle) { return LoadAssetbundleAsync(STREAMING_ASSET_PATH + "/" + assetbundle); } // PersistantDataPath异步加载 public static AssetBundle LoadFromPersistantDataPathAsync(string assetbundle) { return LoadAssetbundleAsync(Application.persistentDataPath+ "/" + assetbundle) } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
WWW异步加载
除了使用AssetBundle.LoadFromFileAsync外,还可以使用www异步加载AssetBundle。public class AssetBundleLoader : MonoBehaviour { // WWW加载时StreamingAsset各平台路径 public static readonly string WWW_STREAM_ASSET_PATH = #if UNITY_ANDROID Application.streamingAssetsPath; // 安卓直接用这个 #elif "file://" + Application.streamingAssetsPath; // 其他平台加file:// #endif // www协程实现 static IEnumerator LoadFromWWWCoroutine(string path, Action<AssetBundle> callback) { WWW www = new WWW(path); yield return www; callback(www.assetBundle); www.Dispose(); www = null; } //开启协程 static bool LoadAssetbundleAsync(string finalPath, Action<AssetBundle> callback) { StartCoroutine(LoadFromWWWCoroutine(finalPath, callback)); } // 从StreamingAssetsPath异步加载 public static AssetBundle LoadFromStreamingAssetsPathAsync(string assetbundle) { return LoadAssetbundleAsync(STREAMING_ASSET_PATH + "/" + assetbundle); } // PersistantDataPath异步加载 public static AssetBundle LoadFromPersistantDataPathAsync(string assetbundle) { return LoadAssetbundleAsync(Application.persistentDataPath+ "/" + assetbundle) }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
资源加载
核心函数
AssetBundle.LoadAsset(string assetName, Type resType); AssetBundle.LoadAssetAsync(string assetName, Type resType);1
2
1
2
没什么好说的,上代码吧。同样是同步和异步两种方式。
public UnityEngine.Object Load(AssetBundle assetbundle, string assetName, Type resType) { return assetBundle.LoadAsset(assetName, resType); } IEnumerator LoadAssetAsyncCoroutine(AssetBundle ab, string name, Type resType, Action<UnityEngine.Object> callback) { AssetBundleRequest request = ab.LoadAssetAsync(name, resType); // 等待加载完成 while (!request.isDone) { yield return false; } callback(request.asset); // 回调上层 }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
除了这些外,还有LoadAllAssetsAsync、LoadAllAssets等方法,详情见Unity官方网站。
相关文章推荐
- Unity5-ABSystem(三):AssetBundle加载
- Unity5-ABSystem(四):AssetBundle依赖
- Unity5.3.5的AssetBundle加载
- Unity中AssetBundle的打包和加载
- Unity 编辑器环境下不能正确加载Android Assetbundle 中的 Shader
- Unity中如何从AssetBundle中加载和卸载对象
- Unity 中WWW加载 AssetBundle---中文路径
- Unity游戏开发使用Assetbundle加载场景实战
- Unity加载AssetBundle后shader丢失问题
- 【unity】关于AssetBundle的加载与卸载
- 解决Unity 中WWW加载 AssetBundle---中文路径
- Unity5 AssetBundle 加载
- unity使用AssetBundle使用记录一(续)--场景打包成AssetBundle并加载
- Unity Assetbundle的加载方式的效率和内存占用
- Unity游戏开发使用Assetbundle加载场景的原理
- Unity创建Assetbundle与加载
- Unity中 BundleAsset资源的打包和解析加载
- Unity—AssetBundle的打包及四种加载资源方式
- [unity]AssetBundle加载
- unity中ScriptableObject在assetbundle中的加载