Esempio n. 1
0
    private IEnumerator GenerateField()
    {
        ShowDebugMessage("Generator comming to life...", false);

        placementCoroutineIsRunning = true;
        GameObject newAsteroid        = null;
        int        currentPrefabIndex = 0;
        float      currentRotation    = 0f;
        bool       complete           = false;

        if (placementAttempts < 1)
        {
            complete = true;
            ShowDebugMessage("Placement attempts less than 1!", true);
        }

        valueForProgressBar = 0f;
        passCount++;

        pivotObject = new GameObject("pivot");
        pivotObject.transform.parent        = transform;
        pivotObject.transform.localPosition = Vector3.zero;

        if (fieldType == FieldType.Ribbon)
        {
            lengthPositionOffset = targetWidthPositionOffset;
        }
        else
        {
            lengthPositionOffset = 0f;
        }

        int loopCount = 0;

        ShowDebugMessage("Generator is running...", false);
        while (complete == false)
        {
            if (StopAndCleanGenerator == false)
            {
                Vector3    targetPosition     = Vector3.zero;
                Vector3    tempTargetPosition = Vector3.zero;
                Quaternion defaultRotation    = Quaternion.identity;
                Quaternion targetRotation     = Quaternion.identity;
                Rigidbody  newRb       = null;
                string     prefabName  = "";
                Vector3    prefabScale = Vector3.zero;
                float      scaleFactor = 1f;

                if (fieldType == FieldType.Blob_Sphere_Inside)
                {
                    tempTargetPosition = Random.insideUnitSphere * fieldSize;
                    targetPosition     = tempTargetPosition + transform.position;
                }
                else if (fieldType == FieldType.Blob_Sphere_Surface)
                {
                    tempTargetPosition = Random.onUnitSphere * (Random.Range((fieldSize - ringWidth / 2f), (fieldSize + ringWidth / 2f)));
                    targetPosition     = tempTargetPosition + transform.position;
                }
                else if (fieldType == FieldType.Ring || fieldType == FieldType.Ribbon)
                {
                    if (fieldType == FieldType.Ring)
                    {
                        pivotObject.transform.Rotate(0f, currentRotation, 0f);
                    }
                    tempTargetPosition.x = Random.Range((pivotObject.transform.forward.x + lengthPositionOffset) - targetWidth / 2f, (pivotObject.transform.forward.x + lengthPositionOffset) + targetWidth / 2f);
                    tempTargetPosition.y = Random.Range(pivotObject.transform.forward.y - (ringThickness / 2f), pivotObject.transform.forward.y + (ringThickness / 2f));
                    tempTargetPosition.z = Random.Range(pivotObject.transform.forward.z + fieldSize - (ringWidth / 2f), pivotObject.transform.forward.z + fieldSize + (ringWidth / 2f));
                    targetPosition       = pivotObject.transform.TransformPoint(tempTargetPosition);
                }
                targetRotation = randomRotation == true ? Random.rotation : Quaternion.identity;
                scaleFactor    = randomScale == true?Random.Range(scaleMinSize, scaleMaxSize) : 1f;

                prefabName      = objectPrefabs[currentPrefabIndex].name;
                prefabScale     = objectPrefabs[currentPrefabIndex].transform.localScale;
                defaultRotation = objectPrefabs[currentPrefabIndex].transform.rotation;

                if (keepPrefabLink == false || enablePrefabLink == false)
                {
                    newAsteroid = Instantiate(objectPrefabs[currentPrefabIndex], targetPosition, defaultRotation, transform);
                }
                else if (keepPrefabLink == true && enablePrefabLink == true)
                {
                    newAsteroid = PrefabUtility.InstantiatePrefab(objectPrefabs[currentPrefabIndex] as GameObject) as GameObject;
                    newAsteroid.transform.parent   = transform;
                    newAsteroid.transform.position = targetPosition;
                    newAsteroid.transform.rotation = defaultRotation;
                }

                if (newAsteroid != null)
                {
                    newAsteroid.name = prefabName.Replace(char.Parse(passCountDelineator), char.Parse(" ")) + passCountDelineator + passCount + passCountDelineator + loopCount;
                    AstroData astroData = newAsteroid.GetComponent <AstroData>();

                    if (astroData != null)
                    {
                        if (astroData.DoNotScale != true)
                        {
                            newAsteroid.transform.localScale = new Vector3(prefabScale.x * scaleFactor, prefabScale.y * scaleFactor, prefabScale.z * scaleFactor);
                        }
                        if (adjustMassByScale == true && astroData.DoNotScale != true)
                        {
                            if (astroData.RigidbodyToScale != null)
                            {
                                newRb = astroData.RigidbodyToScale;
                            }
                            else if (newAsteroid.GetComponent <Rigidbody>() != null)
                            {
                                newRb = newAsteroid.GetComponent <Rigidbody>();
                            }

                            if (newRb != null)
                            {
                                float targetMass = (newRb.mass * massScaleFactor) * scaleFactor;
                                newRb.mass = targetMass;
                            }
                        }
                        if (astroData.DoNotRotate != true)
                        {
                            newAsteroid.transform.rotation = targetRotation;
                        }
                        astroData.CheckPlacement();
                        astroData.ShowBufferGizmo = showBufferGizmo;
                        astroData.ShowMesh        = enableMeshes;
                        astroData.ShowColliders   = enableColliders;
                    }
                    else
                    {
                        ShowDebugMessage(prefabName + " has no AstroData script", true);
                        newAsteroid = null;
                    }
                    currentRotation = rotateDegresPerAttempt;
                    currentPrefabIndex++;
                    currentPrefabIndex = currentPrefabIndex == objectPrefabs.Count ? 0 : currentPrefabIndex;
                }
                loopCount++;
                valueForProgressBar = (float)loopCount / (float)placementAttempts;
                complete            = loopCount == placementAttempts ? true : false;
                yield return(null);
            }
            else
            {
                complete = true;
                ShowDebugMessage("E-Stop Recieved...", false);
            }
        }

        if (complete == true)
        {
            ShowDebugMessage("Stopping Generator...", false);
            if (newAsteroid != null)
            {
                DestroyImmediate(newAsteroid);
                ShowDebugMessage("Orphaned asteroids removed...", false);
            }

            if (pivotObject != null)
            {
                DestroyImmediate(pivotObject);
                ShowDebugMessage("Orphaned pivot removed...", false);
            }
            ShowDebugMessage("Object clean up complete...", false);
            valueForProgressBar = 0f;
            EnforceBufferZones();
            ResetGenerator();
        }
    }