服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - Unity C#打包AssetBundle与场景详解

Unity C#打包AssetBundle与场景详解

2022-07-07 09:46冰封百度 C#

这篇文章主要给大家介绍了关于Unity C#打包AssetBundle与场景的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

Unity2018已经把打包过程简化很多了

我们只需要关心两个API:

1.BuildPipline.BuildAssetBundles() 打包AssetBundle

2.BuildPipline.BuildPlayer() 打包场景

1.打包AssetBundle

先在资源的Inspector面板最下方 填写资源所属的AssetBundle名称和后缀(后缀可以不填)

再利用BuildPipeline.BuildAssetBundles()进行打包

Unity C#打包AssetBundle与场景详解

2.打包Scene

利用BuildPipeline.BuildPlayer()进行打包

为方便使用 先把要打包的场景放入指定的文件夹 通过脚本批量打包

Unity C#打包AssetBundle与场景详解

3.脚本批量打包

Unity C#打包AssetBundle与场景详解

4.打包完毕

Unity C#打包AssetBundle与场景详解

5.加载测试

Unity C#打包AssetBundle与场景详解

6.打包和测试脚本

AssetBundleBuilder.cs

using UnityEngine;
using UnityEditor;
using System.IO;

/// <summary>
/// 资源包打包工具
/// <para>打包AssetBundle和场景(Unity 2018.2.20)</para>
/// <para>ZhangYu 2019-02-26</para>
/// </summary>
public class AssetBundleBuilder
{
[MenuItem("打包/Windows/资源包和场景")]
public static void BuildAbsAndScenesWindows() {
BuildAbsAndScenes(BuildTarget.StandaloneWindows);
}

[MenuItem("打包/Android/资源包和场景")]
public static void BuildAbsAndScenesAndroid() {
BuildAbsAndScenes(BuildTarget.Android);
}

[MenuItem("打包/IOS/资源包和场景")]
public static void BuildAbsAndScenesIOS() {
BuildAbsAndScenes(BuildTarget.iOS);
}

[MenuItem("打包/Windows/资源包")]
public static void BuildAbsWindows() {
BuildAssetBundles(BuildTarget.StandaloneWindows);
}

[MenuItem("打包/Android/资源包")]
public static void BuildAbsAndroid() {
BuildAssetBundles(BuildTarget.Android);
}

[MenuItem("打包/IOS/资源包")]
public static void BuildAbsIOS() {
BuildAssetBundles(BuildTarget.iOS);
}

[MenuItem("打包/Windows/场景")]
public static void BuildScenesWindows() {
BuildScenes(BuildTarget.StandaloneWindows);
}

[MenuItem("打包/Android/场景")]
public static void BuildScenesAndroid() {
BuildScenes(BuildTarget.Android);
}

[MenuItem("打包/IOS/场景")]
public static void BuildScenesIOS() {
BuildScenes(BuildTarget.iOS);
}

// 打包AssetBundle和Scenes
public static void BuildAbsAndScenes(BuildTarget platform) {
BuildAssetBundles(platform);
BuildScenes(platform);
}

// 打包AssetBundles
private static void BuildAssetBundles(BuildTarget platform) {
// 输出路径
string outPath = Application.streamingAssetsPath + "/Abs";
if (!Directory.Exists(outPath)) Directory.CreateDirectory(outPath);
EditorUtility.DisplayProgressBar("信息", "打包资源包", 0f);
BuildPipeline.BuildAssetBundles(outPath, BuildAssetBundleOptions.DeterministicAssetBundle, platform);
AssetDatabase.Refresh();
Debug.Log("所有资源包打包完毕");
}

// 打包Scenes
private static void BuildScenes(BuildTarget platform) {
// 指定场景文件夹和输出路径
string scenePath = Application.dataPath + "/AbResources/Scenes";
string outPath = Application.streamingAssetsPath + "/Abs/";

if (Directory.Exists(scenePath)) {
 // 创建输出文件夹
 if (!Directory.Exists(outPath)) Directory.CreateDirectory(outPath);

 // 查找指定目录下的场景文件
 string[] scenes = GetAllFiles(scenePath, "*.unity");
 for (int i = 0; i < scenes.Length; i++) {
  string url = scenes[i].Replace("\\", "/");
  int index = url.LastIndexOf("/");
  string scene = url.Substring(index + 1, url.Length - index - 1);
  string msg = string.Format("打包场景{0}", scene);
  EditorUtility.DisplayProgressBar("信息", msg, 0f);
  scene = scene.Replace(".unity", ".scene");
  Debug.Log(string.Format("打包场景{0}到{1}", url, outPath + scene));
  BuildPipeline.BuildPlayer(scenes, outPath + scene, BuildTarget.StandaloneWindows, BuildOptions.BuildAdditionalStreamedScenes);
  AssetDatabase.Refresh();
 }
 EditorUtility.ClearProgressBar();
 Debug.Log("所有场景打包完毕");
}
}

/// <summary> 获取文件夹和子文件夹下所有指定类型文件 </summary>
private static string[] GetAllFiles(string directory, params string[] types) {
if (!Directory.Exists(directory)) return new string[0];
string searchTypes = (types == null || types.Length == 0) ? "*.*" : string.Join("|", types);
string[] names = Directory.GetFiles(directory, searchTypes, SearchOption.AllDirectories);
return names;
}

}

LoadTest.cs

using UnityEngine;
using UnityEngine.SceneManagement;

public class LoadTest : MonoBehaviour {

private void Start () {
LoadAB();
LoadScene();
}

// 加载资源包
private void LoadAB() {
// 资源包路径
string path = Application.streamingAssetsPath + "/Abs/test.ab";

// WWW下载
Http http = gameObject.AddComponent<Http>();
http.get(path, OnLoadABComplete);
}

// 加载场景
private void LoadScene() {
// 资源包路径
string path = Application.streamingAssetsPath + "/Abs/Test.scene";

// WWW下载
Http http = gameObject.AddComponent<Http>();
http.get(path, OnLoadSceneComplete);
}

// 加载AssetBundle完毕
private void OnLoadABComplete(WWW www) {
// 实例化预制
AssetBundle ab = www.assetBundle;
Object prefab = ab.LoadAsset("Test");
GameObject instance = (GameObject)Instantiate(prefab);
DontDestroyOnLoad(instance);
}

// 加载场景完毕
private void OnLoadSceneComplete(WWW www) {
// 必须写www.assetBundle这句 这样场景才能被读取到
AssetBundle ab = www.assetBundle;
SceneManager.LoadScene("Test");
}

}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。

原文链接:https://segmentfault.com/a/1190000018320573

延伸 · 阅读

精彩推荐
  • C#SMTP客户端未通过身份验证等多种错误解决方案分享

    SMTP客户端未通过身份验证等多种错误解决方案分享

    这篇文章主要介绍了SMTP服务器要求安全连接或客户端未通过身份验证的多种解决方案,感兴趣的小伙伴们可以参考一下...

    lijiao13502021-11-21
  • C#深入浅出23种设计模式

    深入浅出23种设计模式

    本文给大家详解23种设计模式,理解设计模式有助于在程序开发过程中灵活应用,需要的朋友可以参考下...

    编程技术网10712021-10-22
  • C#C# using三种使用方法

    C# using三种使用方法

    这篇文章主要为大家详细介绍了C# using三种使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    心茶5632021-12-18
  • C#C#实现将窗体固定在显示器的左上角且不能移动的方法

    C#实现将窗体固定在显示器的左上角且不能移动的方法

    这篇文章主要介绍了C#实现将窗体固定在显示器的左上角且不能移动的方法,涉及C#窗体固定操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    我心依旧6302021-10-21
  • C#深入理解C#中foreach遍历的使用方法

    深入理解C#中foreach遍历的使用方法

    在c#中通过foreach遍历一个列表是经常拿用的方法,使用起来也方便,下面这篇文章先给大家介绍了关于C#中foreach遍历的使用方法,后面介绍了c#使用foreach注...

    C#教程网7742022-01-19
  • C#C#发送邮箱实现代码

    C#发送邮箱实现代码

    这篇文章主要为大家详细介绍了C#发送邮箱实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    独钓寒江雪丶10052021-12-16
  • C#C#影院售票系统毕业设计(2)

    C#影院售票系统毕业设计(2)

    这篇文章主要介绍了C#影院售票系统毕业设计,介绍了电影院座位的动态绘制、电影信息绑定到窗体中如何展现出来,需要的朋友可以参考下...

    乐智6072021-11-01
  • C#C#实现读取DataSet数据并显示在ListView控件中的方法

    C#实现读取DataSet数据并显示在ListView控件中的方法

    这篇文章主要介绍了C#实现读取DataSet数据并显示在ListView控件中的方法,涉及C#操作DataSet及ListView控件的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考...

    weiren20064492021-10-28