/// <summary> /// Returns the download progress of the asset bundle(s) required for the given asset to become available /// </summary> /// <param name="assetName"></param> /// <returns></returns> public float GetDownloadProgressOf(string assetName) { float progress = 0; DownloadingAssetItem item = null; item = downloadingItems.Find(aitem => aitem.requiredAssetName == assetName); if (item != null) { progress = item.Progress; } else { Debug.Log(assetName + " was not downloading"); } return(progress); }
/// <summary> /// Generates a temporary item of type T. It then adds a new DownloadingAssetItem to downloadingItems that contains a refrence to this created temp asset and the name of the asset that it should be replaced by once the given assetbundle has completed downloading. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="requiredAssetName"></param> /// <param name="containingBundle"></param> /// <returns></returns> public T AddDownloadItem <T>(string requiredAssetName, int?requiredAssetNameHash, string containingBundle, Delegate callback = null) where T : UnityEngine.Object { T thisTempAsset = null; if (downloadingItems.Find(item => item.requiredAssetName == requiredAssetName) == null) { if (requiredAssetNameHash == null) { requiredAssetNameHash = UMAUtils.StringToHash(requiredAssetName); } if (typeof(T) == typeof(RaceData)) { thisTempAsset = ScriptableObject.Instantiate(DynamicAssetLoader.Instance.placeholderRace) as T; (thisTempAsset as RaceData).raceName = requiredAssetName; (thisTempAsset as RaceData).name = requiredAssetName; } else if (typeof(T) == typeof(SlotDataAsset)) { thisTempAsset = ScriptableObject.Instantiate(DynamicAssetLoader.Instance.placeholderSlot) as T; (thisTempAsset as SlotDataAsset).name = requiredAssetName; (thisTempAsset as SlotDataAsset).slotName = requiredAssetName; //also needs the name hash (thisTempAsset as SlotDataAsset).nameHash = (int)requiredAssetNameHash; //we can safely force because we just set this above } else if (typeof(T) == typeof(OverlayDataAsset)) { thisTempAsset = ScriptableObject.Instantiate(DynamicAssetLoader.Instance.placeholderOverlay) as T; (thisTempAsset as OverlayDataAsset).name = requiredAssetName; (thisTempAsset as OverlayDataAsset).overlayName = requiredAssetName; (thisTempAsset as OverlayDataAsset).nameHash = (int)requiredAssetNameHash; } else if (typeof(T) == typeof(UMATextRecipe)) { if (AssetBundleManager.AssetBundleIndexObject.IsAssetWardrobeRecipe(containingBundle, requiredAssetName)) { thisTempAsset = ScriptableObject.Instantiate(DynamicAssetLoader.Instance.placeholderWardrobeRecipe) as T; (thisTempAsset as UMATextRecipe).recipeType = "Wardrobe"; (thisTempAsset as UMATextRecipe).wardrobeSlot = AssetBundleManager.AssetBundleIndexObject.AssetWardrobeSlot(containingBundle, requiredAssetName); (thisTempAsset as UMATextRecipe).Hides = AssetBundleManager.AssetBundleIndexObject.AssetWardrobeHides(containingBundle, requiredAssetName); (thisTempAsset as UMATextRecipe).compatibleRaces = AssetBundleManager.AssetBundleIndexObject.AssetWardrobeCompatibleWith(containingBundle, requiredAssetName); } else { thisTempAsset = ScriptableObject.Instantiate(DynamicAssetLoader.Instance.placeholderRace.baseRaceRecipe) as T; } thisTempAsset.name = requiredAssetName; } else if (typeof(T) == typeof(UMAWardrobeRecipe)) { thisTempAsset = ScriptableObject.Instantiate(DynamicAssetLoader.Instance.placeholderWardrobeRecipe) as T; (thisTempAsset as UMAWardrobeRecipe).recipeType = "Wardrobe"; (thisTempAsset as UMAWardrobeRecipe).wardrobeSlot = AssetBundleManager.AssetBundleIndexObject.AssetWardrobeSlot(containingBundle, requiredAssetName); (thisTempAsset as UMAWardrobeRecipe).Hides = AssetBundleManager.AssetBundleIndexObject.AssetWardrobeHides(containingBundle, requiredAssetName); (thisTempAsset as UMAWardrobeRecipe).compatibleRaces = AssetBundleManager.AssetBundleIndexObject.AssetWardrobeCompatibleWith(containingBundle, requiredAssetName); thisTempAsset.name = requiredAssetName; } else if (typeof(T) == typeof(UMAWardrobeCollection)) { thisTempAsset = ScriptableObject.CreateInstance(typeof(T)) as T; (thisTempAsset as UMAWardrobeCollection).recipeType = "WardrobeCollection"; (thisTempAsset as UMAWardrobeCollection).wardrobeSlot = AssetBundleManager.AssetBundleIndexObject.AssetWardrobeCollectionSlot(containingBundle, requiredAssetName); (thisTempAsset as UMAWardrobeCollection).compatibleRaces = AssetBundleManager.AssetBundleIndexObject.AssetWardrobeCollectionCompatibleWith(containingBundle, requiredAssetName); thisTempAsset.name = requiredAssetName; } else if (typeof(T) == typeof(RuntimeAnimatorController)) //Possibly can be removed- just here because we may need to do something else with animators... { thisTempAsset = (T)Activator.CreateInstance(typeof(T)); (thisTempAsset as RuntimeAnimatorController).name = requiredAssetName; } else { //Need to check for ScriptableObjects here because they require different instantiation if (typeof(ScriptableObject).IsAssignableFrom(typeof(T))) { thisTempAsset = ScriptableObject.CreateInstance(typeof(T)) as T; } else { thisTempAsset = (T)Activator.CreateInstance(typeof(T)); } thisTempAsset.name = requiredAssetName; } var thisDlItem = new DownloadingAssetItem(requiredAssetName, thisTempAsset, containingBundle, callback); downloadingItems.Add(thisDlItem); } else { DownloadingAssetItem dlItem = null; if (downloadingItems.Find(item => item.requiredAssetName == requiredAssetName) != null) { dlItem = downloadingItems.Find(item => item.requiredAssetName == requiredAssetName); } if (dlItem != null) { Debug.LogWarning("DownloadingAssetsList already had entry for " + requiredAssetName + " as type " + dlItem.tempAsset.GetType().ToString() + " new request wanted it as type " + typeof(T) + " and its callback was " + dlItem.dynamicCallback[0].Method.Name); if (callback != null) { if (!dlItem.dynamicCallback.Contains(callback)) { dlItem.dynamicCallback.Add(callback); } } thisTempAsset = dlItem.tempAsset as T; } else { Debug.LogWarning("Could not get TempAsset for " + requiredAssetName); } } return(thisTempAsset); }
/// <summary> /// Generates a temporary item of type T. It then adds a new DownloadingAssetItem to downloadingItems that contains a refrence to this created temp asset and the name of the asset that it should be replaced by once the given assetbundle has completed downloading. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="requiredAssetName"></param> /// <param name="containingBundle"></param> /// <returns></returns> public T AddDownloadItem <T>(string requiredAssetName, int?requiredAssetNameHash, string containingBundle, Delegate callback = null) where T : UnityEngine.Object { T thisTempAsset = null; if (downloadingItems.Find(item => item.requiredAssetName == requiredAssetName) == null) { if (requiredAssetNameHash == null) { requiredAssetNameHash = UMAUtils.StringToHash(requiredAssetName); } thisTempAsset = GetTempAsset <T>(); if (typeof(T) == typeof(RaceData)) { (thisTempAsset as RaceData).raceName = requiredAssetName; (thisTempAsset as RaceData).raceName = requiredAssetName; (thisTempAsset as RaceData).name = requiredAssetName; } else if (typeof(T) == typeof(SlotDataAsset)) { (thisTempAsset as SlotDataAsset).name = requiredAssetName; (thisTempAsset as SlotDataAsset).slotName = requiredAssetName; (thisTempAsset as SlotDataAsset).nameHash = (int)requiredAssetNameHash; //we can safely force because we just set this above } else if (typeof(T) == typeof(OverlayDataAsset)) { (thisTempAsset as OverlayDataAsset).name = requiredAssetName; (thisTempAsset as OverlayDataAsset).overlayName = requiredAssetName; (thisTempAsset as OverlayDataAsset).nameHash = (int)requiredAssetNameHash; } else if (typeof(T) == typeof(UMATextRecipe)) { //now that wardrobeRecipes have their own type, we can assume an UMATextRecipe is a full character recipe thisTempAsset.name = requiredAssetName; } else if (typeof(T) == typeof(UMAWardrobeRecipe)) { (thisTempAsset as UMAWardrobeRecipe).recipeType = "Wardrobe"; (thisTempAsset as UMAWardrobeRecipe).wardrobeSlot = AssetBundleManager.AssetBundleIndexObject.AssetWardrobeSlot(containingBundle, requiredAssetName); (thisTempAsset as UMAWardrobeRecipe).Hides = AssetBundleManager.AssetBundleIndexObject.AssetWardrobeHides(containingBundle, requiredAssetName); (thisTempAsset as UMAWardrobeRecipe).compatibleRaces = AssetBundleManager.AssetBundleIndexObject.AssetWardrobeCompatibleWith(containingBundle, requiredAssetName); thisTempAsset.name = requiredAssetName; } else if (typeof(T) == typeof(UMAWardrobeCollection)) { (thisTempAsset as UMAWardrobeCollection).recipeType = "WardrobeCollection"; (thisTempAsset as UMAWardrobeCollection).wardrobeSlot = AssetBundleManager.AssetBundleIndexObject.AssetWardrobeCollectionSlot(containingBundle, requiredAssetName); (thisTempAsset as UMAWardrobeCollection).compatibleRaces = AssetBundleManager.AssetBundleIndexObject.AssetWardrobeCollectionCompatibleWith(containingBundle, requiredAssetName); thisTempAsset.name = requiredAssetName; } else if (typeof(T) == typeof(RuntimeAnimatorController)) { (thisTempAsset as RuntimeAnimatorController).name = requiredAssetName; } else { thisTempAsset.name = requiredAssetName; } var thisDlItem = new DownloadingAssetItem(requiredAssetName, thisTempAsset, containingBundle, callback); downloadingItems.Add(thisDlItem); } else { DownloadingAssetItem dlItem = null; if (downloadingItems.Find(item => item.requiredAssetName == requiredAssetName) != null) { dlItem = downloadingItems.Find(item => item.requiredAssetName == requiredAssetName); } if (dlItem != null) { //Debug.LogWarning("DownloadingAssetsList already had entry for " + requiredAssetName + " as type " + dlItem.tempAsset.GetType().ToString() + " new request wanted it as type " + typeof(T) + " and its callback was " + dlItem.dynamicCallback[0].Method.Name); if (callback != null) { if (!dlItem.dynamicCallback.Contains(callback)) { dlItem.dynamicCallback.Add(callback); } } thisTempAsset = dlItem.tempAsset as T; } else { Debug.LogWarning("Could not get TempAsset for " + requiredAssetName); } } return(thisTempAsset); }