From 58532dda73df566ba5ddc53924add5b4276f7f1c Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Thu, 24 Feb 2022 13:20:19 +0100 Subject: [PATCH] Fixed possession caching --- .../Scripts/UI/PossessionDetailsUI.cs | 3 +- .../Visitors/Scripts/VisitorPossessions.cs | 197 +++++++++--------- .../Resources/MakeHuman_simple_TP.prefab.meta | 2 +- 3 files changed, 100 insertions(+), 102 deletions(-) diff --git a/Runtime/Visitors/Scripts/UI/PossessionDetailsUI.cs b/Runtime/Visitors/Scripts/UI/PossessionDetailsUI.cs index 4fd044b..61f6724 100644 --- a/Runtime/Visitors/Scripts/UI/PossessionDetailsUI.cs +++ b/Runtime/Visitors/Scripts/UI/PossessionDetailsUI.cs @@ -67,7 +67,8 @@ namespace Passer { //pawnPossessionsUI.gameObject.SetActive(false); Canvas canvas = GetComponentInParent(); - canvas.gameObject.SetActive(false); + if (canvas != null) + canvas.gameObject.SetActive(false); } } } \ No newline at end of file diff --git a/Runtime/Visitors/Scripts/VisitorPossessions.cs b/Runtime/Visitors/Scripts/VisitorPossessions.cs index 07f4823..563f536 100644 --- a/Runtime/Visitors/Scripts/VisitorPossessions.cs +++ b/Runtime/Visitors/Scripts/VisitorPossessions.cs @@ -32,14 +32,50 @@ namespace Passer { public Possessable scenePossession; } - [System.Serializable] - public class CachedPossession { + #region Locals + + protected class CachedPossessionBundle { public string siteLocation; public AssetBundle assetBundle; + + public static CachedPossessionBundle Find(string possessionLocation) { + foreach (CachedPossessionBundle bundle in bundleCache) { + if (bundle.siteLocation == possessionLocation && bundle.assetBundle != null) + return bundle; + } + return null; + } } + [System.Serializable] + protected class CachedPossession { + public CachedPossessionBundle possessionBundle; + public string assetPath; + public GameObject possession; + + public static void Update(CachedPossessionBundle cachedBundle, string possessablePath, GameObject prefab) { + CachedPossession foundPossession = cache.Find(entry => + entry.assetPath == possessablePath + ); + if (foundPossession == null) { + CachedPossession cachedPossession = new CachedPossession() { + possessionBundle = cachedBundle, + assetPath = possessablePath, + possession = prefab, + }; + cache.Add(cachedPossession); + } + else { + foundPossession.possession = prefab; + } + } + } + + protected static List bundleCache = new List(); protected static List cache = new List(); + #endregion + public class Possessions { public List list = new List(); } @@ -103,7 +139,7 @@ namespace Passer { Possessable possessableAvatar = humanoid.avatarRig.GetComponent(); if (possessableAvatar != null) - AddPossessions(new Possessable[] {possessableAvatar}, true); + AddPossessions(new Possessable[] { possessableAvatar }, true); } #endregion @@ -153,6 +189,8 @@ namespace Passer { } private static Possessable PreservePossession(Possessable possession) { + // Keep the possession as an disabled object for later reference + // Note: this does not work for networked setups!!! GameObject preservedPossession = Instantiate(possession.gameObject); preservedPossession.SetActive(false); Object.DontDestroyOnLoad(preservedPossession); @@ -185,6 +223,24 @@ namespace Passer { possessions.Add(newPossession); + CachedPossessionBundle possessionBundle = CachedPossessionBundle.Find(possessable.siteLocation); + + CachedPossession cachedPossession = new CachedPossession() { + assetPath = possessable.assetPath, + possessionBundle = possessionBundle, + possession = possessable.gameObject, + }; + cache.Add(cachedPossession); + + //Debug.Log("Possession cache: "); + //foreach (CachedPossession poss in cache) + // Debug.Log(" * " + poss.assetPath + " || " + poss.possessionBundle + " || " + poss.possession); + + //Debug.Log("cache: "); + //foreach (CachedPossessionBundle pos in bundleCache) { + // Debug.Log(" - " + pos.siteLocation + " || " + pos.assetBundle); + //} + return newPossession; } @@ -200,124 +256,61 @@ namespace Passer { Debug.Log("deleted"); } - //private void RetrievePossession(Possession possession) { - // StartCoroutine(RetrievePossessionAsync(possession)); - //} - - private static IEnumerator RetrievePossessionAsync(Possession possession) { -#if UNITY_ANDROID - string url = "https://" + possession.siteLocation + ".android.site"; -#elif UNITY_WEBGL - string url = "https://" + possession.siteLocation + ".webgl.site"; -#else - string url = "https://" + possession.siteLocation + ".windows.site"; -#endif - Debug.Log("Loading possession: " + url); - - UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(url); - yield return request.SendWebRequest(); - - AssetBundle assetBundle = DownloadHandlerAssetBundle.GetContent(request); - if (assetBundle == null) { - Debug.LogError("Could not load " + url); - yield break; - } - - GameObject prefab = assetBundle.LoadAsset(possession.assetPath); - if (prefab != null) - Object.Instantiate(prefab); - } - private static AssetBundle lastAssetBundle; public static IEnumerator RetrievePossessionAsync(Possession possession, System.Action callback) { + //Debug.Log("Possession cache: "); + //foreach (CachedPossession poss in cache) + // Debug.Log(" * " + poss.assetPath + " || " + poss.possessionBundle + " || " + poss.possession); + + //Debug.Log("cache: "); + //foreach (CachedPossessionBundle pos in bundleCache) { + // Debug.Log(" - " + pos.siteLocation + " || " + pos.assetBundle); + //} + if (possession.siteLocation == "") { + Debug.Log("Get scene possession"); GameObject prefab = possession.scenePossession.gameObject; prefab.SetActive(true); callback(prefab); prefab.SetActive(false); yield return null; - - } else + } + else yield return RetrievePossessableAsync(possession.siteLocation, possession.assetPath, callback); - /* - GameObject prefab; - - if (possession.siteLocation == "") { - prefab = possession.scenePossession.gameObject; - prefab.SetActive(true); - callback(prefab); - prefab.SetActive(false); - } - else { - CachedPossession foundPossession = cache.Find(entry => entry.siteLocation == possession.siteLocation); - if (foundPossession == null) { -#if UNITY_ANDROID - string url = "https://" + possession.siteLocation + ".android.site"; -#elif UNITY_WEBGL - string url = "https://" + possession.siteLocation + ".webgl.site"; -#else - string url = "https://" + possession.siteLocation + ".windows.site"; -#endif - Debug.Log("Loading possession: " + url); - - UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(url); - yield return request.SendWebRequest(); - - AssetBundle assetBundle = DownloadHandlerAssetBundle.GetContent(request); - if (assetBundle == null) { - Debug.LogError("Could not load " + url); - yield break; - } - lastAssetBundle = assetBundle; - - Debug.Log("Load: " + possession.assetPath); - prefab = assetBundle.LoadAsset(possession.assetPath); - if (prefab == null) { - Debug.LogError("Could not load " + possession.assetPath); - yield break; - } - - CachedPossession cachedPossession = new CachedPossession() { - siteLocation = possession.siteLocation, - assetBundle = assetBundle, - }; - cache.Add(cachedPossession); - } - else { - Debug.Log("Load from cache: " + possession.assetPath); - prefab = foundPossession.assetBundle.LoadAsset(possession.assetPath); - if (prefab == null) { - Debug.LogError("Could not load " + possession.assetPath); - yield break; - } - } - callback(prefab); - } - */ } public static IEnumerator RetrievePossessableAsync(string possessableLocation, string possessablePath, System.Action callback) { GameObject prefab; if (possessableLocation == "") { - CachedPossession foundPossession = cache.Find(entry => entry.siteLocation == possessableLocation); + CachedPossession foundPossession = cache.Find(entry => entry.assetPath == possessablePath); if (foundPossession == null) { Debug.Log("Cannot retrieve Possessable: location is not set"); callback(null); - } else { + } + else { Debug.Log("Load from cache: " + possessablePath); - prefab = LoadPossessableFromAssetBundle(foundPossession.assetBundle, possessablePath); + prefab = foundPossession.possession; if (prefab == null) { Debug.LogError("Could not load " + possessablePath); callback(null); - } else + } + else callback(prefab); } } else { - CachedPossession foundPossession = cache.Find(entry => entry.siteLocation == possessableLocation); - if (foundPossession == null) { + CachedPossession foundPossession = cache.Find(entry => entry.assetPath == possessablePath); + if (foundPossession != null && foundPossession.possession != null) { + //Debug.Log("Load from cache: " + foundPossession.possession); + prefab = foundPossession.possession; + callback(prefab); + yield return null; + } + + CachedPossessionBundle foundPossessionBundle = bundleCache.Find(entry => entry.siteLocation == possessableLocation); + if (foundPossessionBundle == null) { #if UNITY_ANDROID string url = "https://" + possessableLocation + ".android.site"; #elif UNITY_WEBGL @@ -325,7 +318,7 @@ namespace Passer { #else string url = "https://" + possessableLocation + ".windows.site"; #endif - Debug.Log("Loading possession: " + url); + //Debug.Log("Loading possession: " + url); UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(url); yield return request.SendWebRequest(); @@ -336,26 +329,30 @@ namespace Passer { yield break; } - Debug.Log("Load: " + possessablePath); + //Debug.Log("Load: " + possessablePath); prefab = LoadPossessableFromAssetBundle(assetBundle, possessablePath); if (prefab == null) { Debug.LogError("Could not load " + possessablePath); yield break; } - CachedPossession cachedPossession = new CachedPossession() { + CachedPossessionBundle cachedBundle = new CachedPossessionBundle() { siteLocation = possessableLocation, assetBundle = assetBundle, }; - cache.Add(cachedPossession); + bundleCache.Add(cachedBundle); + + CachedPossession.Update(cachedBundle, possessablePath, prefab); } else { - Debug.Log("Load from cache: " + possessablePath); - prefab = LoadPossessableFromAssetBundle(foundPossession.assetBundle, possessablePath); + Debug.Log("Load: " + possessablePath); + prefab = LoadPossessableFromAssetBundle(foundPossessionBundle.assetBundle, possessablePath); if (prefab == null) { Debug.LogError("Could not load " + possessablePath); yield break; } + + CachedPossession.Update(foundPossessionBundle, possessablePath, prefab); } callback(prefab); } diff --git a/Samples~/VisitorsAndSites/Visitors/Prefabs/Resources/MakeHuman_simple_TP.prefab.meta b/Samples~/VisitorsAndSites/Visitors/Prefabs/Resources/MakeHuman_simple_TP.prefab.meta index 4ea8cbb..c502ee2 100644 --- a/Samples~/VisitorsAndSites/Visitors/Prefabs/Resources/MakeHuman_simple_TP.prefab.meta +++ b/Samples~/VisitorsAndSites/Visitors/Prefabs/Resources/MakeHuman_simple_TP.prefab.meta @@ -3,5 +3,5 @@ guid: f249fe40e650a8c4a90aee2b885b941f PrefabImporter: externalObjects: {} userData: - assetBundleName: humanoidvisitor vr_possessions + assetBundleName: humanoidvisitor desktop_possessions assetBundleVariant: