void InstantiateParticles(int N, GameObject prefab)
 {
     for (int i = 0; i < N; i++)
     {
         Vector3              pos              = DeterminePosition();
         Vector3              velocity         = DetermineInitialVelocity(pos * distanceScale);
         Vector3              truePos          = origin + pos;
         GameObject           particle         = Instantiate(prefab, truePos, Quaternion.identity);
         ParticleMassBehavior particleBehavior = particle.GetComponent <ParticleMassBehavior>();
         // particleBehavior.initialVelocity = velocity; // i don't think this actually does anything
         particleBehavior.velocity = velocity * 0.00001f; // this is way too fast as just velocity
     }
 }
 void Awake()
 {
     environmentController = GameObject.Find("EnvironmentControls").GetComponent <PaceController>();
     distanceScale         = environmentController.SetDistanceScale(environmentController.distanceScale);
     // rigidbody = GetComponent<Rigidbody>();
     // origin = rigidbody.position;
     origin         = transform.position;
     coreController = GetComponent <ParticleMassBehavior>();
     coreMass       = coreController.mass;
     DeterminePopulation();
     InstantiateParticles(nElectrons, electronPrefab);
     InstantiateParticles(nProtons, protonPrefab);
     InstantiateParticles(nNeutrons, neutronPrefab);
 }
    void FixedUpdate()
    {
        particles = GameObject.FindGameObjectsWithTag("Particle");
        Vector3 newVelSum             = Vector3.zero;
        Vector3 collisionVelocity     = Vector3.zero;
        Vector3 magneticFieldVelocity = Vector3.zero;
        float   accMultiplier         = Mathf.Pow(velocityMultiplier, 2f);

        foreach (GameObject particle in particles)
        {
            if (particle != this.gameObject)
            {
                Vector3 dist = FindDistance(particle);
                ParticleMassBehavior otherParticle = particle.GetComponent <ParticleMassBehavior>();
                float otherMass   = otherParticle.mass;
                float otherCharge = otherParticle.charge;
                float deltaR      = (particle.transform.localScale.x - this.transform.localScale.x) / 2;
                if (dist.magnitude < Mathf.Abs(deltaR))
                {
                    Vector3 x1 = transform.position;
                    Vector3 x2 = particle.transform.position;
                    Vector3 v1 = this.velocity;
                    Vector3 v2 = otherParticle.velocity;
                    collisionVelocity = Collision(x1, x2, v1, v2, otherMass);
                }
                dist = dist * distanceMultiplier;
                Vector3 velocityGravity = AccelerationGravity(dist, otherMass) * accMultiplier * Time.fixedDeltaTime;
                Vector3 velocityCharge  = AccelerationElectric(dist, otherCharge) * accMultiplier * Time.fixedDeltaTime;
                if (otherParticle.magneticMoment != Vector3.zero)
                {
                    Vector3 magneticFieldAcceleration = AccelerationMagneticDipole(dist, otherParticle.magneticMoment);
                    magneticFieldVelocity = magneticFieldAcceleration * accMultiplier * Time.fixedDeltaTime;
                }
                newVelSum += velocityGravity;
                newVelSum += velocityCharge;
                newVelSum += collisionVelocity;
                newVelSum += magneticFieldVelocity;
            }

            velocity += newVelSum / distanceMultiplier;
            // Debug.Log(velocity.magnitude);
            Vector3 deltaPos = 0.5f * velocity * Time.fixedDeltaTime;
            transform.position += deltaPos;
        }
    }