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(); } }