Created
February 3, 2014 21:15
-
-
Save wmiller/8792555 to your computer and use it in GitHub Desktop.
XML Database BuildAssetBundles
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[MenuItem("Assets/Build AssetBundles")] | |
private static void BuildAssetBundles() | |
{ | |
ClearAssetBundles(); | |
// You would probably want to parameterize this part | |
Database.Instance.ReadFiles(AssetInfoXMLPath); | |
// Validate asset infos | |
ValidateAssetBundleAssetsInternal(); | |
// Get all asset infos and asset bundle infos from the database | |
AssetInfo[] assetInfos = Database.Instance.GetEntries<AssetInfo>(); | |
AssetBundleInfo[] assetBundleInfos = Database.Instance.GetEntries<AssetBundleInfo>(); | |
// We need to build a list of all objects and object names (paths) for each | |
// asset bundle. Store these lists in two dictionaries, keyed to the | |
// asset bundle info ID that each asset info references. | |
Dictionary<ID, List<Object>> bundleObjects = new Dictionary<ID, List<Object>>(); | |
Dictionary<ID, List<string>> bundleNames = new Dictionary<ID, List<string>>(); | |
foreach (AssetInfo info in assetInfos) | |
{ | |
List<Object> objectList; | |
if (!bundleObjects.TryGetValue(info.AssetBundleInfoRef.Entry.DatabaseID, out objectList)) | |
{ | |
objectList = new List<Object>(); | |
bundleObjects.Add(info.AssetBundleInfoRef.Entry.DatabaseID, objectList); | |
} | |
List<string> nameList; | |
if (!bundleNames.TryGetValue(info.AssetBundleInfoRef.Entry.DatabaseID, out nameList)) | |
{ | |
nameList = new List<string>(); | |
bundleNames.Add(info.AssetBundleInfoRef.Entry.DatabaseID, nameList); | |
} | |
UnityEngine.Object asset = Resources.LoadAssetAtPath<UnityEngine.Object>(info.Path); | |
if (asset == null) | |
{ | |
throw new System.Exception("Invalid asset: " + info.Path); | |
} | |
objectList.Add(asset); | |
nameList.Add(info.Path); | |
} | |
// Build bundles | |
foreach (AssetBundleInfo info in assetBundleInfos) | |
{ | |
// Get the list of objects for this bundle | |
List<Object> objectList; | |
if (!bundleObjects.TryGetValue(info.DatabaseID, out objectList)) | |
{ | |
Debug.LogWarning("No objects for bundle: " + info.Name); | |
continue; | |
} | |
// Get the list of names for this bundle | |
List<string> nameList; | |
if (!bundleNames.TryGetValue(info.DatabaseID, out nameList)) | |
{ | |
throw new System.Exception("No names generated for objects"); | |
} | |
// Build the bundle using the two lists | |
string path = AssetBundlePath + "/" + info.Name + ".unity3d"; | |
BuildAssetBundleOptions options = (BuildAssetBundleOptions.CollectDependencies | | |
BuildAssetBundleOptions.CompleteAssets | | |
BuildAssetBundleOptions.DeterministicAssetBundle); | |
BuildTarget target = BuildTarget.WebPlayer; | |
if (!BuildPipeline.BuildAssetBundleExplicitAssetNames(objectList.ToArray(), | |
nameList.ToArray(), | |
path, | |
options, | |
target)) | |
{ | |
throw new System.Exception("Unable to build asset bundle: " + info.Name); | |
} | |
AssetDatabase.SaveAssets(); | |
Debug.Log("Built bundle: " + info.Name); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment