Fixed possession caching

This commit is contained in:
Pascal Serrarens 2022-02-24 13:20:19 +01:00
parent 9e0911359b
commit 58532dda73
3 changed files with 100 additions and 102 deletions

View File

@ -67,6 +67,7 @@ namespace Passer {
//pawnPossessionsUI.gameObject.SetActive(false); //pawnPossessionsUI.gameObject.SetActive(false);
Canvas canvas = GetComponentInParent<Canvas>(); Canvas canvas = GetComponentInParent<Canvas>();
if (canvas != null)
canvas.gameObject.SetActive(false); canvas.gameObject.SetActive(false);
} }
} }

View File

@ -32,14 +32,50 @@ namespace Passer {
public Possessable scenePossession; public Possessable scenePossession;
} }
[System.Serializable] #region Locals
public class CachedPossession {
protected class CachedPossessionBundle {
public string siteLocation; public string siteLocation;
public AssetBundle assetBundle; 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<CachedPossessionBundle> bundleCache = new List<CachedPossessionBundle>();
protected static List<CachedPossession> cache = new List<CachedPossession>(); protected static List<CachedPossession> cache = new List<CachedPossession>();
#endregion
public class Possessions { public class Possessions {
public List<Possession> list = new List<Possession>(); public List<Possession> list = new List<Possession>();
} }
@ -103,7 +139,7 @@ namespace Passer {
Possessable possessableAvatar = humanoid.avatarRig.GetComponent<Possessable>(); Possessable possessableAvatar = humanoid.avatarRig.GetComponent<Possessable>();
if (possessableAvatar != null) if (possessableAvatar != null)
AddPossessions(new Possessable[] {possessableAvatar}, true); AddPossessions(new Possessable[] { possessableAvatar }, true);
} }
#endregion #endregion
@ -153,6 +189,8 @@ namespace Passer {
} }
private static Possessable PreservePossession(Possessable possession) { 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); GameObject preservedPossession = Instantiate(possession.gameObject);
preservedPossession.SetActive(false); preservedPossession.SetActive(false);
Object.DontDestroyOnLoad(preservedPossession); Object.DontDestroyOnLoad(preservedPossession);
@ -185,6 +223,24 @@ namespace Passer {
possessions.Add(newPossession); 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; return newPossession;
} }
@ -200,124 +256,61 @@ namespace Passer {
Debug.Log("deleted"); 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<GameObject>(possession.assetPath);
if (prefab != null)
Object.Instantiate(prefab);
}
private static AssetBundle lastAssetBundle; private static AssetBundle lastAssetBundle;
public static IEnumerator RetrievePossessionAsync(Possession possession, System.Action<GameObject> callback) { public static IEnumerator RetrievePossessionAsync(Possession possession, System.Action<GameObject> 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 == "") { if (possession.siteLocation == "") {
Debug.Log("Get scene possession");
GameObject prefab = possession.scenePossession.gameObject; GameObject prefab = possession.scenePossession.gameObject;
prefab.SetActive(true); prefab.SetActive(true);
callback(prefab); callback(prefab);
prefab.SetActive(false); prefab.SetActive(false);
yield return null; yield return null;
}
} else else
yield return RetrievePossessableAsync(possession.siteLocation, possession.assetPath, callback); 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<GameObject>(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<GameObject>(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<GameObject> callback) { public static IEnumerator RetrievePossessableAsync(string possessableLocation, string possessablePath, System.Action<GameObject> callback) {
GameObject prefab; GameObject prefab;
if (possessableLocation == "") { if (possessableLocation == "") {
CachedPossession foundPossession = cache.Find(entry => entry.siteLocation == possessableLocation); CachedPossession foundPossession = cache.Find(entry => entry.assetPath == possessablePath);
if (foundPossession == null) { if (foundPossession == null) {
Debug.Log("Cannot retrieve Possessable: location is not set"); Debug.Log("Cannot retrieve Possessable: location is not set");
callback(null); callback(null);
} else { }
else {
Debug.Log("Load from cache: " + possessablePath); Debug.Log("Load from cache: " + possessablePath);
prefab = LoadPossessableFromAssetBundle(foundPossession.assetBundle, possessablePath); prefab = foundPossession.possession;
if (prefab == null) { if (prefab == null) {
Debug.LogError("Could not load " + possessablePath); Debug.LogError("Could not load " + possessablePath);
callback(null); callback(null);
} else }
else
callback(prefab); callback(prefab);
} }
} }
else { else {
CachedPossession foundPossession = cache.Find(entry => entry.siteLocation == possessableLocation); CachedPossession foundPossession = cache.Find(entry => entry.assetPath == possessablePath);
if (foundPossession == null) { 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 #if UNITY_ANDROID
string url = "https://" + possessableLocation + ".android.site"; string url = "https://" + possessableLocation + ".android.site";
#elif UNITY_WEBGL #elif UNITY_WEBGL
@ -325,7 +318,7 @@ namespace Passer {
#else #else
string url = "https://" + possessableLocation + ".windows.site"; string url = "https://" + possessableLocation + ".windows.site";
#endif #endif
Debug.Log("Loading possession: " + url); //Debug.Log("Loading possession: " + url);
UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(url); UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(url);
yield return request.SendWebRequest(); yield return request.SendWebRequest();
@ -336,26 +329,30 @@ namespace Passer {
yield break; yield break;
} }
Debug.Log("Load: " + possessablePath); //Debug.Log("Load: " + possessablePath);
prefab = LoadPossessableFromAssetBundle(assetBundle, possessablePath); prefab = LoadPossessableFromAssetBundle(assetBundle, possessablePath);
if (prefab == null) { if (prefab == null) {
Debug.LogError("Could not load " + possessablePath); Debug.LogError("Could not load " + possessablePath);
yield break; yield break;
} }
CachedPossession cachedPossession = new CachedPossession() { CachedPossessionBundle cachedBundle = new CachedPossessionBundle() {
siteLocation = possessableLocation, siteLocation = possessableLocation,
assetBundle = assetBundle, assetBundle = assetBundle,
}; };
cache.Add(cachedPossession); bundleCache.Add(cachedBundle);
CachedPossession.Update(cachedBundle, possessablePath, prefab);
} }
else { else {
Debug.Log("Load from cache: " + possessablePath); Debug.Log("Load: " + possessablePath);
prefab = LoadPossessableFromAssetBundle(foundPossession.assetBundle, possessablePath); prefab = LoadPossessableFromAssetBundle(foundPossessionBundle.assetBundle, possessablePath);
if (prefab == null) { if (prefab == null) {
Debug.LogError("Could not load " + possessablePath); Debug.LogError("Could not load " + possessablePath);
yield break; yield break;
} }
CachedPossession.Update(foundPossessionBundle, possessablePath, prefab);
} }
callback(prefab); callback(prefab);
} }

View File

@ -3,5 +3,5 @@ guid: f249fe40e650a8c4a90aee2b885b941f
PrefabImporter: PrefabImporter:
externalObjects: {} externalObjects: {}
userData: userData:
assetBundleName: humanoidvisitor vr_possessions assetBundleName: humanoidvisitor desktop_possessions
assetBundleVariant: assetBundleVariant: