预制体a中有图片b
1、将a打ab包后图片b会打进a的ab里面。
2、若先将b打包,后将a打包则b不会在a的ab里面,但加载时得先加载b的ab包,否则将出现图片丢失
预制体预览
情况1
只将a打ab包
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using System.IO;
using UnityEngine;
public class BundleTool
{
[MenuItem("AssetsBundle/Build AssetBundles")]
static void BuildAllAssetBundles()//进行打包
{
string dir = "AssetBundles";
//判断该目录是否存在
if (Directory.Exists(dir) == false)
{
Directory.CreateDirectory(dir);
}
var bundles = new List<AssetBundleBuild>();
var target = BuildTarget.StandaloneWindows64;
//将所有prefab文件夹下打包
var prefabPaths = Directory.GetFiles("Assets/Resources/Prefab/", "*.prefab", SearchOption.AllDirectories);
var build = new AssetBundleBuild();
build.assetBundleName = "prefabs";
build.assetNames = prefabPaths; //所有的prefab打进一个包
bundles.Add(build);
BuildPipeline.BuildAssetBundles(dir, bundles.ToArray(), BuildAssetBundleOptions.None, target);
}
}
manifest文件
加载prefab
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LoadAssetsBundlePackage : MonoBehaviour
{
// Use this for initialization
void Start()
{
//先将prefab资源包加载进内存
AssetBundle prefabsAssetBundle = AssetBundle.LoadFromFile("AssetBundles/prefabs");
//然后再加载prefab
GameObject prefab = prefabsAssetBundle .LoadAsset<GameObject>("Prefab");
//实例化出一个实体
Instantiate(prefab);
}
}
正常显示
情况2
将a、b分别打ab包
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using System.IO;
using UnityEngine;
public class BundleTool
{
[MenuItem("AssetsBundle/Build AssetBundles")]
static void BuildAllAssetBundles()//进行打包
{
string dir = "AssetBundles";
//判断该目录是否存在
if (Directory.Exists(dir) == false)
{
Directory.CreateDirectory(dir);
}
var bundles = new List<AssetBundleBuild>();
var target = BuildTarget.StandaloneWindows64;
//将所有icon文件夹下png打包(一张一张图片打包) 图片b
var icons = Directory.GetDirectories("Assets/Resources/Icon/");
foreach (var icon in icons)
{
var pngs = Directory.GetFiles(icon + "/", "*.png");
foreach (var item in pngs)
{
var bundle = new AssetBundleBuild();
var key = Path.GetFileNameWithoutExtension(icon) + "_" + Path.GetFileNameWithoutExtension(item);
key = key.ToLower();
bundle.assetBundleName = "icon/icon_" + key;//打进AssetBundles/icon文件夹下
bundle.assetNames = new[] { item }; //一张图片一打
bundles.Add(bundle);
}
}
//将所有prefab文件夹下打包(所有预制体打进一个ab) 预制体a
var prefabPaths = Directory.GetFiles("Assets/Resources/Prefab/", "*.prefab", SearchOption.AllDirectories);
var build = new AssetBundleBuild();
build.assetBundleName = "prefabs";
build.assetNames = prefabPaths; //所有的prefab打进一个包
//
bundles.Add(build);
BuildPipeline.BuildAssetBundles(dir, bundles.ToArray(), BuildAssetBundleOptions.None, target);
}
}
manifest文件
加载prefab
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LoadAssetsBundlePackage : MonoBehaviour
{
// Use this for initialization
void Start()
{
//先将icon资源包加载进内存 若没有将icon资源加入包中,image组件将丢失sourceImage
//AssetBundle.LoadFromFile("AssetBundles/icon/icon_emoji_biti");
//再将prefab资源包加载进内存
AssetBundle prefabsAssetBundle = AssetBundle.LoadFromFile("AssetBundles/prefabs");
//然后再加载prefab预制体
GameObject prefab = prefabsAssetBundle .LoadAsset<GameObject>("Prefab");
//实例化出一个实体
Instantiate(prefab);
}
}
显示
若不先加载icon资源
先加载icon资源,显示正常