Fixed possession caching
This commit is contained in:
parent
9e0911359b
commit
58532dda73
@ -67,7 +67,8 @@ namespace Passer {
|
|||||||
//pawnPossessionsUI.gameObject.SetActive(false);
|
//pawnPossessionsUI.gameObject.SetActive(false);
|
||||||
|
|
||||||
Canvas canvas = GetComponentInParent<Canvas>();
|
Canvas canvas = GetComponentInParent<Canvas>();
|
||||||
canvas.gameObject.SetActive(false);
|
if (canvas != null)
|
||||||
|
canvas.gameObject.SetActive(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -3,5 +3,5 @@ guid: f249fe40e650a8c4a90aee2b885b941f
|
|||||||
PrefabImporter:
|
PrefabImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
userData:
|
userData:
|
||||||
assetBundleName: humanoidvisitor vr_possessions
|
assetBundleName: humanoidvisitor desktop_possessions
|
||||||
assetBundleVariant:
|
assetBundleVariant:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user