- Home /
Why are my cached (in an array) gameobjects disappearing?
First, some context: I am developing a chunk loading system for unity. I load all the chunks as prefabs from disk to an array as a cache. When I need to load a chunk, I instantiate it from the cache into the world. The problem is that when deleting gameobjects from the world (using the destroy method) to unload them, it also destroys the cached copy meaning that I can't instantiate it back later. I've done some of my own research and I have found that some time after I initially cached the gameobjects and instantiated them into the scene for the first time, the hash codes of both the cached and world gameobjects change to become the same thing. This occurs while the editor isn't playing and no other scripts are running.
Here is some code (note it has been butchered a bit for debugging, sorry):
public GameObject LoadChunk (int l, int x, int y, bool replace)
{
GameObject loadedItem = loaded.FirstOrDefault (i => GetPos (i.name) [0] == l && GetPos (i.name) [1] == x && GetPos (i.name) [2] == y);
if (prefSorted [l] [x] [y].GetHashCode () == loadedItem.GetHashCode ())
{
Debug.Log ("Referencial integrity!!!");
string prefstr = "prefSorted @ x:" + x + " y:" + y + " l:" + l + " is: " + prefSorted [l] [x] [y].GetHashCode ();
Debug.Log ((prefstr) + "\n");
Debug.Log (("loadedItem.GetHashCode () " + loadedItem.GetHashCode ()) + "\n");
}
GameObject old = loaded.FirstOrDefault (i => i.name.Split ("@" [0]) [0] == x + "-" + y);
/*if (old != null)
{
if (!replace && old.name.Split ("@" [0]) [1].Split ("-" [0]) [0] == l.ToString ())
return null;
if (EditorApplication.isPlaying)
Destroy (old);
else
DestroyImmediate (old);
loaded.Remove (old);
}*/
if (prefSorted [l] [x] [y] == null)
{
Debug.LogWarning ("No chunk found in database at: x:" + x + " y:" + y + " l:" + l);
Debug.Log (prefSorted + " layers");
Debug.Log (prefSorted [0] + " x");
Debug.Log (prefSorted [0] [0] + " y");
return null;
}
GameObject newChunk = Instantiate (prefSorted [l] [x] [y]);
/*string name = chunk.name;
int xPos = int.Parse (name.Split ("-" [0]) [0]);
int yPos = int.Parse (name.Split ("-" [0]) [1].Split ("@" [0]) [0]);*/
newChunk.transform.SetParent (this.transform);
loaded.Add (newChunk);
newChunk.transform.localPosition = new Vector3 (x * GridScale.x, 0, y * GridScale.y);
return newChunk;
}
Thanks for everybody's help in advance. If you have any questions, leave a comment and I'll update the post. Thanks, -Thomas
Your answer
Follow this Question
Related Questions
When to Destroy Multiple Items 0 Answers
Do empty transforms take up much CPU power? 1 Answer
how to make a Portal 2-esque laser beam "redirection" system? 0 Answers
Destroying all enemy characters after the level is over 4 Answers
how to destroy an object then instantiate another from a prefab 1 Answer