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