void RandomizeObjects()
 {
     GBody[] bodies = sim.GetGBodyObjects();
     foreach (GBody b in bodies)
     {
         Vector3 pos = UnityEngine.Random.insideUnitSphere;
         pos.Scale(genRadii);
         Vector3 vel = UnityEngine.Random.insideUnitSphere;
         vel.Scale(genVelocityRange);
         if (perpendicularVelocities)
         {
             vel = new Vector3(pos.z / perpendicularVelocitiesScaling, 0, -pos.x / perpendicularVelocitiesScaling);
         }
         float mass = UnityEngine.Random.Range(genMinMass, genMaxMass);
         b.Position = pos;
         b.Velocity = vel;
         b.Mass     = mass;
     }
 }
    // Use this for initialization
    void Start()
    {
        //Get the simulation variable
        NBodySimulation[] sims = gameObject.GetComponents <NBodySimulation>();

        if (sims == null)
        {
            Debug.LogWarning("Warning: No NBodySimulation attached to object " + gameObject.name + " which has NBodyDemoMode component; demo will not run.");
            return;
        }

        if (sims.Length != 1)
        {
            Debug.LogWarning("Warning: More than one NBodySimulation attached to object " + gameObject.name + "; using first found.");
        }

        sim = sims[0];

        //Load saved preferences
        if (loadPlayerPrefs)
        {
            LoadPlayerPrefsValues();
        }

        //Generate Body Objects
        GBody[] bodies = new GBody[numberOfBodies];
        for (int i = 0; i < bodies.Length; i++)
        {
            GameObject renderObject;
            if (i == trailsBodyIndex)
            {
                renderObject           = (GameObject)GameObject.Instantiate(trailsObjectPrefab);
                trail                  = (GameObject)GameObject.Instantiate(trailObject);
                trail.transform.parent = renderObject.transform;
                trailsBodyObject       = renderObject;
            }
            else
            {
                renderObject = (GameObject)GameObject.Instantiate(bodyObjectPrefab);
            }
            renderObject.transform.parent = this.transform;
            Vector3 pos = UnityEngine.Random.insideUnitSphere;
            pos.Scale(genRadii);
            Vector3 vel = UnityEngine.Random.insideUnitSphere;
            vel.Scale(genVelocityRange);
            if (perpendicularVelocities)
            {
                vel = new Vector3(pos.z / perpendicularVelocitiesScaling, 0, -pos.x / perpendicularVelocitiesScaling);
            }
            float mass = UnityEngine.Random.Range(genMinMass, genMaxMass);

            bodies[i] = new GBody(pos, vel, mass, renderObject, renderScale);

            if (i == trailsBodyIndex)
            {
                trailsBody = bodies[i];
            }
        }
        sim.SetGBodyObjects(bodies);

        lookCamera.gameObject.AddComponent <SimpleObjectLogger>();
        trailsBodyObject.AddComponent <SimpleObjectLogger>();

        //Configure look response parameters
        startMass  = trailsBody.Mass;
        lookMass   = startMass * massScaling;
        startScale = trailsBodyObject.transform.localScale;
        lookScale  = trailsBodyObject.transform.localScale * sizeScaling;

        //Configure particle emitter
        particles = trailsBodyObject.GetComponent <ParticleSystem>();
        particles.enableEmission = false;

        //Populate UI element components
        progressSlider          = accuracySliderObject.GetComponent <Slider>();
        progressSlider.maxValue = sim.GetGBodyObjects().Length;
        itemsRemainingText      = itemsRemainingTextObject.GetComponent <Text>();
        timerText         = timerTextObject.GetComponent <Text>();
        bestScoreText     = bestScoreTextObject.GetComponent <Text>();
        totalTaskTimeText = totalTaskTimeTextObject.GetComponent <Text>();

        //Initialize High Score UI Component
        bestScoreText.text = "\r\nBest Score\r\n" + bestScore.ToString("F3") + "s";

        //Initialize System State Parameters
        isLooking = false;

        startTime   = DateTime.Now;
        restartTime = DateTime.Now;

        if (PlayerPrefs.HasKey("showTime"))
        {
            bool showTime = PlayerPrefs.GetFloat("showTime") != 0;
            if (!showTime)
            {
                totalTaskTimeTextObject.GetComponent <Text>().enabled = false;
            }
        }
        if (PlayerPrefs.HasKey("taskTime"))
        {
            taskTime = PlayerPrefs.GetFloat("taskTime") * 60;
        }
        totalTaskTimeText.text = taskTime + "s";

        log = gameObject.GetComponent <Logger>();
        log.GenerateLoggableObjectsList();
        log.BeginLogging();
    }