private void GeneratePlanets() { RobinPlanet lastPlanet = null; for (int i = 0; i < m_NumberOfPlanet; ++i) { RobinPlanet planet = new RobinPlanet(); GameObject planetObject = GameObject.CreatePrimitive(PrimitiveType.Sphere); Transform planetTransform = planetObject.transform; // Set planet gameobject planet.m_GameObject = planetObject; // Set planet name planetObject.name = $"Planet {i + 1}"; planetTransform.parent = transform; planetTransform.localPosition = Vector3.zero; // Get a random radius shift float randomShift = Random.Range(m_PlanetMinRadiusShift, m_PlanetMaxRadiusShift); // Set the radius of the planet based on the last planet planet.m_Radius = lastPlanet == null ? m_PlanetSunOffset + randomShift : lastPlanet.m_Radius + randomShift; // Randomize the planet scale planet.m_Scale = Random.Range(m_PlanetMinScale, m_PlanetMaxScale); float newPlanetX = planet.m_Radius; planetTransform.localPosition = new Vector3(newPlanetX, planetTransform.localPosition.y, planetTransform.localPosition.z); // Set the scale planet.m_GameObject.transform.localScale = new Vector3(planet.m_Scale, planet.m_Scale, planet.m_Scale); // Set planet speed planet.m_Speed = Random.Range(m_PlanetMinSpeed, m_PlanetMaxSpeed); planet.m_Angle = Random.Range(0.0f, 360.0f); // Push planet into list of planets m_Planets.Add(planet); GenerateMoons(planet); // Update last planet lastPlanet = planet; } }
private void GenerateMoons(RobinPlanet planet) { int moons = Random.Range(m_PlanetMoonAmountRange.x, m_PlanetMoonAmountRange.y + 1); // Range between range is max exclusive if (moons <= 0) { return; } float previousRadius = 0.4f; for (int j = 0; j < moons; j++) { RobinPlanet moon = new RobinPlanet(); moon.m_GameObject = GameObject.CreatePrimitive(PrimitiveType.Sphere); GameObject moonObject = moon.m_GameObject; moonObject.name = $"Moon {j + 1}"; moonObject.transform.parent = planet.m_GameObject.transform; moonObject.transform.localScale = new Vector3(0.25f, 0.25f, 0.25f); // Create variable moon.m_Radius = Random.Range(0.3f, 0.7f) + previousRadius; Vector3 moonPosition = new Vector3(moon.m_Radius, 0.0f, 0.0f); previousRadius = moon.m_Radius; moon.m_Angle = Random.Range(0, 360); moon.m_Speed = Random.Range(m_PlanetMinSpeed, m_PlanetMaxSpeed); moonObject.transform.localPosition = moonPosition; planet.m_Moons.Add(moon); } GenerateOrreryArms(ref planet.m_Moons, new Vector3(0.0f, 0.5f, 0.0f), planet.m_GameObject.transform, true); }
private void GenerateOrreryArms(ref List <RobinPlanet> planets, Vector3 armParentPosition, Transform armParentTransform, bool overrideYOffsetForMoons = false) { // Get the amount of planets in frames between two numbers float step = (m_ArmStartPosition - m_ArmEndPosition) / (m_Planets.Count - 1); // Since unity sets the rotation relative to the parents scale we need to add // an empty parent with a scale of 1 GameObject armParent = new GameObject("ArmParent"); armParent.transform.parent = armParentTransform; armParent.transform.localScale = new Vector3(m_ArmThickness, m_ArmThickness, m_ArmThickness); armParent.transform.localPosition = armParentPosition; // Create only for first (for testing) // int i = 0; for (int i = 0; i < planets.Count; ++i) { RobinPlanet planet = planets[i]; RobinOrreryArm arm = new RobinOrreryArm(); float localY = (m_ArmStartPosition + step * i); if (overrideYOffsetForMoons) { localY = -0.3f; } // Set planet arm.m_Planet = planet; // Create a joint arm.m_Joint = new GameObject(); arm.m_Joint.name = $"Joint for arm {i + 1}"; arm.m_Joint.transform.parent = armParent.transform; float distanceBetweenPlanetAndStart = Vector3.Distance(new Vector3(0.0f, localY, 0.0f), planet.m_GameObject.transform.position); Vector3 orreryWorldPlanetX = armParentTransform.TransformPoint(distanceBetweenPlanetAndStart, 0.0f, 0.0f); arm.m_Joint.transform.position = orreryWorldPlanetX; Vector3 jointPosition = arm.m_Joint.transform.localPosition; jointPosition.y = localY; arm.m_Joint.transform.localPosition = jointPosition; // Save arm start position arm.m_ArmStartPosition = new Vector3(0.0f, localY, 0.0f); // Create a start joint arm.m_StartJoint = new GameObject(); arm.m_StartJoint.name = $"Start joint for arm {i + 1}"; arm.m_StartJoint.transform.parent = armParent.transform; arm.m_StartJoint.transform.localPosition = arm.m_ArmStartPosition; // Set arm lengths arm.m_BaseArmLength = planet.m_Radius * m_BaseArmLengthMultiplier * armParentTransform.localScale.x; arm.m_UpperArmLength = planet.m_Radius * m_UpperArmLengthMultiplier * armParentTransform.localScale.x; // Create arms arm.m_BaseArm = GameObject.CreatePrimitive(PrimitiveType.Cube); arm.m_BaseArm.transform.parent = armParent.transform; arm.m_BaseArm.name = $"Base arm for arm {i + 1}"; Vector3 baseArmScale = arm.m_BaseArm.transform.localScale; baseArmScale.x = 0.15f; baseArmScale.y = 0.15f; baseArmScale.z *= arm.m_BaseArmLength; arm.m_BaseArm.transform.localScale = baseArmScale; arm.m_UpperArm = GameObject.CreatePrimitive(PrimitiveType.Cube); arm.m_UpperArm.transform.parent = armParent.transform; arm.m_UpperArm.name = $"Upper arm for arm {i + 1}"; Vector3 upperArmScale = arm.m_UpperArm.transform.localScale; upperArmScale.x = 0.15f; upperArmScale.y = 0.15f; upperArmScale.z *= arm.m_UpperArmLength; arm.m_UpperArm.transform.localScale = upperArmScale; arm.UpdateArmPositions(); // Add to arm list m_OrreryArms.Add(arm); } }