void InstantiateAllPrefabs() { //For every prefab object, for (int i = 0; i < prefabObjects.Count; i++) { //Create a new prefab queue PrefabQueue newPrefabQueues = new PrefabQueue(); //Add created queue into prefabQueues list prefabQueues.Add(newPrefabQueues); //Set created prefab queue name to prefab object name (Used for object pooling later on) if (prefabQueues[i] != null) { prefabQueues[i].QueueName = prefabObjects[i].name; } else { Debug.LogError("PrefabQueue [" + i + "] is null! Current Queue size : " + prefabQueues.Count); } //Create the prefab object based on the amount to spawn and enqueue it into the queue for (int j = 0; j < prefabObjects[i].AmountToSpawn; j++) { CreateAndEnqueuePrefab(i); } } }
public GameObject Add(GameObject prefabToClone, Vector3 position, float angle, string type, bool matchGroundAngle) { PrefabQueue prefabToAdd = Prefabs.Where(t => t.PrefabType == type && t.IsSpawned == false).FirstOrDefault(); if (prefabToAdd == null) { //Let's create a new one prefabToAdd = new PrefabQueue(); GameObject prefab = GameObject.Instantiate(prefabToClone, position, new Quaternion()); prefab.name = prefabToClone.name + "-x" + position.x.ToString("#"); if (angle != 0 && matchGroundAngle) { prefab.transform.localEulerAngles = new Vector3(0, 0, angle); } prefabToAdd.PrefabType = type; prefabToAdd.Prefab = prefab; prefabToAdd.IsSpawned = true; prefabToAdd.Prefab.SetActive(true); Prefabs.Add(prefabToAdd); } else { //Just update one from the queue prefabToAdd.Prefab.transform.position = position; if (angle != 0 && matchGroundAngle) { prefabToAdd.Prefab.transform.localEulerAngles = new Vector3(0, 0, angle); } prefabToAdd.IsSpawned = true; prefabToAdd.Prefab.SetActive(true); } return(prefabToAdd.Prefab); }
public GameObject Add(GameObject prefabToClone, Vector3 position, float angle, string type, bool matchGroundAngle) { PrefabQueue prefabToAdd = Prefabs.Where(t=>t.PrefabType == type && t.IsSpawned == false).FirstOrDefault(); if (prefabToAdd == null){ //Let's create a new one prefabToAdd = new PrefabQueue(); GameObject prefab = (GameObject)GameObject.Instantiate(prefabToClone, position, new Quaternion()); prefab.name = prefabToClone.name; if (angle != 0 && matchGroundAngle){ prefab.transform.localEulerAngles = new Vector3(0, 0, angle); } prefabToAdd.PrefabType = type; prefabToAdd.Prefab = prefab; prefabToAdd.IsSpawned = true; prefabToAdd.Prefab.SetActive(true); Prefabs.Add(prefabToAdd); }else{ //Just update one from the queue prefabToAdd.Prefab.transform.position = position; if (angle != 0 && matchGroundAngle){ prefabToAdd.Prefab.transform.localEulerAngles = new Vector3(0, 0, angle); } prefabToAdd.IsSpawned =true; prefabToAdd.Prefab.SetActive(true); } return prefabToAdd.Prefab; }
public void Remove(GameObject prefab) { PrefabQueue prefabToRemove = Prefabs.Where(p => p.Prefab == prefab).FirstOrDefault(); prefabToRemove.IsSpawned = false; prefabToRemove.Prefab.SetActive(false); GameObject.Destroy(prefabToRemove.Prefab); Prefabs.Remove(prefabToRemove); }
public void PlacePrefabs(TerrainManager tm) { terrainManager = tm; InstantiatePrefabManagerObject(); List <PrefabQueue> prefabsToAdd = new List <PrefabQueue>(); for (int i = 0; i < terrainManager.AllFrontTopVerticies.Count(); i++) { Vector3 current = terrainManager.AllFrontTopVerticies[i]; for (int j = 0; j < settings.PrefabRules.Count(); j++) { PrefabRule rule = settings.PrefabRules[j]; //Can't do anything without a prefab if (rule.PrefabToClone == null) { break; } //If we haven't started yet, set our initial values if (rule.LastPrefabLocation == Vector3.zero) { rule.LastPrefabLocation = current; } rule.CurrentLocation = current; //Save it because it is randomized and changes every time float repeatDistance = rule.RepeatDistance; if (rule.AddPrefab(repeatDistance)) { //Find the location of the first prefab float nextXLocation = rule.NextPrefabXLocation(repeatDistance); Vector3 nextLocation = FindLocationAlongTerrain(nextXLocation); float angle = FindSlopeAngle(nextLocation.x); //Store a list of the prefabs to add. Only add them if every prefab in this ruleset can be added. //If they can't, add them at the start of the next mesh bool addAllPrefabs = true; prefabsToAdd.Clear(); prefabsToAdd.Add(new PrefabQueue() { location = nextLocation, angle = angle }); if (rule.GroupSize > 1) { float increase = 0; for (int k = 1; k < rule.GroupSize; k++) { //Find the location of the next prefab in this group increase = increase + rule.GroupSpacing; nextLocation = FindLocationAlongTerrain(nextXLocation + increase); //We can't place all prefabs. Break out if (nextLocation == Vector3.zero) { addAllPrefabs = false; break; } else { //Store the location of these prefabs as well angle = FindSlopeAngle(nextXLocation + increase); prefabsToAdd.Add(new PrefabQueue() { location = nextLocation, angle = angle }); } } } //Can we add all the prefabs? Then go ahead and instatiate them if (addAllPrefabs) { for (int k = 0; k < prefabsToAdd.Count(); k++) { PrefabQueue pq = prefabsToAdd[k]; //Determine if this prefab is allowed to be placed on this terrain rule var currentRule = tm.VertexGen.CurrentTerrainRule; bool allowedForThisTerrainRule = currentRule.AllowedPrefabs.Where(ap => ap.Allowed && ap.Index == j).Any(); bool meetsDistanceReqs = true; //Determine if this prefab is within the distance rules if (rule.UseMinDistance) { if (pq.location.x < rule.MinDistance) { meetsDistanceReqs = false; } } if (rule.UseMaxDistance) { if (pq.location.x > rule.MaxDistance) { meetsDistanceReqs = false; } } //Only add if it is within the slope limits if (pq.angle >= rule.MinSlope && pq.angle <= rule.MaxSlope && allowedForThisTerrainRule && meetsDistanceReqs) { rule.InstantiatePrefab(pq.location, PrefabManagerObject, Pool, pq.angle); rule.LastPrefabLocation = pq.location; } else { //Just update this so we can keep placing prefabs, but don't actually create the prefab rule.LastPrefabLocation = pq.location; } } } } } } }