//Chunks in this queue have been altered by the player, and are currently within the collision radius. //Only que if not already in queue private void FlagCollisionChunkForPriorityUpdate(CollisionChunk collisionChunkToUpdate) { if (!collisionChunkPriorityUpdateQueue.Contains(collisionChunkToUpdate)) { collisionChunkPriorityUpdateQueue.Enqueue(collisionChunkToUpdate); } }
private void UpdatePriorityCollisionChunkQueue() { for (int i = 0; i < priorityCollisionChunksPerFrame; i++) { if (collisionChunkPriorityUpdateQueue.Count > 0) { CollisionChunk chunkToActivate = collisionChunkPriorityUpdateQueue.Dequeue(); chunkToActivate.UpdateCollisionChunk(marchingGrid); chunkToActivate.gameObject.SetActive(true); //Update the mesh before waking the object to prevent baking collision data twice. } } }
private void InstantiateCollisionChunk(int x, int y) { if (collisionChunkArray [x, y] == null) { CollisionChunk newCollisionChunk = PullCollisionChunkFromPool(); newCollisionChunk.SetChunkCoord(new Coord(x, y)); //Don't immediately update chunk, as many chunks will be added at once as the player crosses grid lines in //chunk coords. Enque, then update one per frame. collisionChunkUpdateQueue.Enqueue(newCollisionChunk); collisionChunkArray [x, y] = newCollisionChunk.GetComponent <CollisionChunk> () as CollisionChunk; } }
//return the next available chunk. If no chunks available, instantiate a new chunk. private CollisionChunk PullCollisionChunkFromPool() { if (collisionChunkPool.Count > 0) { CollisionChunk collisionChunkToActivate = collisionChunkPool.Pop(); // collisionChunkToActivate.gameObject.SetActive (true); return(collisionChunkToActivate); } else { GameObject newCollisionChunkGO = Instantiate(collisionChunkPrefab, this.transform.position, Quaternion.identity) as GameObject; // newCollisionChunkGO.transform.SetParent (this.transform); CollisionChunk newCollisionChunk = newCollisionChunkGO.GetComponent <CollisionChunk> () as CollisionChunk; newCollisionChunk.Initialise(chunkSize); newCollisionChunkGO.transform.SetParent(this.interiorGO.transform); BindCollisionToInterior(newCollisionChunkGO); instantiatedCollisionChunkCount++; return(newCollisionChunk); } }
private void PushCollisionChunkToPool(CollisionChunk collisionChunkToDeactivate) { collisionChunkToDeactivate.gameObject.SetActive(false); collisionChunkPool.Push(collisionChunkToDeactivate); }