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);
        }
Example #3
0
    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);
        }
Example #5
0
        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;
                                }
                            }
                        }
                    }
                }
            }
        }