public static void Execute() { List <CharacterElement> characterElements = new List <CharacterElement>(); // As a CharacterElement needs the name of the assetbundle // that contains its assets, we go through all assetbundles // to match them to the materials we find. string[] assetbundles = Directory.GetFiles(CreateAssetbundles.AssetbundlePath); string[] materials = Directory.GetFiles("Assets/CharacterCustomization/characters", "*.mat", SearchOption.AllDirectories); foreach (string material in materials) { foreach (string bundle in assetbundles) { FileInfo bundleFI = new FileInfo(bundle); FileInfo materialFI = new FileInfo(material); string bundleName = bundleFI.Name.Replace(".assetbundle", ""); if (!materialFI.Name.StartsWith(bundleName)) { continue; } if (!material.Contains("Per Texture Materials")) { continue; } characterElements.Add(new CharacterElement(materialFI.Name.Replace(".mat", ""), bundleFI.Name)); break; } } // After collecting all CharacterElements we store them in an // assetbundle using a ScriptableObject. // Create a ScriptableObject that contains the list of CharacterElements. CharacterElementHolder t = ScriptableObject.CreateInstance <CharacterElementHolder> (); t.content = characterElements; // Save the ScriptableObject and load the resulting asset so it can // be added to an assetbundle. string p = "Assets/characterelementdatabase.asset"; AssetDatabase.CreateAsset(t, p); Object o = AssetDatabase.LoadAssetAtPath(p, typeof(CharacterElementHolder)); AssetBundleBuild[] buildInfo = new AssetBundleBuild[1]; buildInfo[0].assetBundleName = "characterelementdatabase.assetbundle"; buildInfo[0].assetNames = new string[1]; buildInfo[0].assetNames[0] = p; BuildPipeline.BuildAssetBundles(CreateAssetbundles.AssetbundlePath, buildInfo, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows); // Build the CharacterElementDatabase assetbundle. //BuildPipeline.BuildAssetBundle(o, null, CreateAssetbundles.AssetbundlePath + "CharacterElementDatabase.assetbundle"); // Delete the ScriptableObject. AssetDatabase.DeleteAsset(p); Debug.Log("******* Updated Character Element Database, added " + characterElements.Count + " elements *******"); }
// This method downloads the CharacterElementDatabase assetbundle and populates // the sortedElements Dictionary from the contents. This is done at runtime as // ScriptableObjects do not support Dictionaries. ReadyToUse must be true before // you create an instance of CharacterGenerator. public static IEnumerator ReadyToUse() { if (database == null) { database = WWW.LoadFromCacheOrDownload(AssetbundleBaseURL + "CharacterElementDatabase.assetbundle", GameDefines.AssetBundleVersion); yield return(database); } if (sortedElements != null) { yield break; } else { //if (!database.isDone) return false; if (database.assetBundle == null) { yield return(0); } CharacterElementHolder ceh = (CharacterElementHolder)database.assetBundle.mainAsset; sortedElements = new Dictionary <string, Dictionary <string, CharacterElement> >(); foreach (CharacterElement element in ceh.content) { string[] a = element.bundleName.Split('_'); string character = a[0]; string category = a[1].Split('-')[0].Replace(".assetbundle", ""); if (!availableCharacters.Contains(character)) { availableCharacters.Add(character); } if (!sortedElements.ContainsKey(character)) { sortedElements.Add(character, new Dictionary <string, CharacterElement>()); } if (!sortedElements[character].ContainsKey(category)) { sortedElements[character].Add(category, element); } } yield return(0); } yield break; }
public static void Execute() { List<CharacterElement> characterElements = new List<CharacterElement>(); // As a CharacterElement needs the name of the assetbundle // that contains its assets, we go through all assetbundles // to match them to the materials we find. string[] assetbundles = Directory.GetFiles(CreateAssetbundles.AssetbundlePath); string[] materials = Directory.GetFiles("Assets/characters", "*.mat", SearchOption.AllDirectories); foreach (string material in materials) { foreach (string bundle in assetbundles) { FileInfo bundleFI = new FileInfo(bundle); FileInfo materialFI = new FileInfo(material); string bundleName = bundleFI.Name.Replace(".assetbundle", ""); if (!materialFI.Name.StartsWith(bundleName)) continue; if (!material.Contains("Per Texture Materials")) continue; characterElements.Add(new CharacterElement(materialFI.Name.Replace(".mat", ""), bundleFI.Name)); break; } } // After collecting all CharacterElements we store them in an // assetbundle using a ScriptableObject. // Create a ScriptableObject that contains the list of CharacterElements. CharacterElementHolder t = new CharacterElementHolder(characterElements); // Save the ScriptableObject and load the resulting asset so it can // be added to an assetbundle. string p = "Assets/CharacterElementDatabase.asset"; AssetDatabase.CreateAsset(t, p); Object o = AssetDatabase.LoadAssetAtPath(p, typeof(CharacterElementHolder)); // Build the CharacterElementDatabase assetbundle. BuildPipeline.BuildAssetBundle(o, null, CreateAssetbundles.AssetbundlePath + "CharacterElementDatabase.assetbundle"); // Delete the ScriptableObject. AssetDatabase.DeleteAsset(p); Debug.Log("******* Updated Character Element Database, added " + characterElements.Count + " elements *******"); }
static void CreateElementDatabaseBundles() { List <CharacterElement> characterElements = new List <CharacterElement>(); string[] assetbundles = Directory.GetFiles(AssetbundlePath); string[] materials = Directory.GetFiles("Assets/CharacterCustomization/characters", "*.mat", SearchOption.AllDirectories); foreach (string material in materials) { foreach (string bundle in assetbundles) { FileInfo bundleFI = new FileInfo(bundle); FileInfo materialFI = new FileInfo(material); string bundleName = bundleFI.Name.Replace(".assetbundle", ""); if (!materialFI.Name.StartsWith(bundleName)) { continue; } if (!material.Contains("Per Texture Materials")) { continue; } characterElements.Add(new CharacterElement(materialFI.Name.Replace(".mat", ""), bundleFI.Name)); break; } } Debug.Log(characterElements.Count); CharacterElementHolder t = ScriptableObject.CreateInstance <CharacterElementHolder> (); t.content = characterElements; string p = "Assets/CharacterElementDatabase.asset"; AssetDatabase.CreateAsset(t, p); Object o = AssetDatabase.LoadAssetAtPath(p, typeof(CharacterElementHolder)); BuildPipeline.BuildAssetBundle(o, null, AssetbundlePath + "CharacterElementDatabase.assetbundle"); AssetDatabase.DeleteAsset(p); }
//create map material name -> bundle //example: female_face-1 --> female_face-1.assetbundle static void CreateElementDataBaseBundle() { List <CharacterElement> characterElements = new List <CharacterElement>(); string[] assetBundles = Directory.GetFiles(AssetBundlePath); string[] materials = Directory.GetFiles("Assets/CharacterCustomization/characters", "*.mat", SearchOption.AllDirectories); //search materials recursively foreach (var material in materials) { foreach (var bundle in assetBundles) { FileInfo bundleFI = new FileInfo(bundle); FileInfo materialFI = new FileInfo(material); string bundleName = bundleFI.Name.Replace(CharacterElement.BundlePostfix, ""); if (!materialFI.Name.StartsWith(bundleName) || !material.Contains("Per Texture Materials")) { continue; } string name = materialFI.Name.Replace(".mat", ""); characterElements.Add(new CharacterElement(name, bundleName)); break; } } CharacterElementHolder holder = ScriptableObject.CreateInstance <CharacterElementHolder>(); holder.content = characterElements; string path = AssetPath + CharacterElement.AssetFileName(CharacterElement.DataBaseName); AssetDatabase.CreateAsset(holder, path); Object asset = AssetDatabase.LoadAssetAtPath(path, typeof(CharacterElementHolder)); BuildPipeline.BuildAssetBundle(asset, null, AssetBundlePath + CharacterElement.BundleFileName(CharacterElement.DataBaseName)); }