Пример #1
0
    public void ApplyGravity(Gravitate objToGravitate)
    {
        Rigidbody2D rbToGravitate = objToGravitate.objSpaceObj.objRigidbody;

        Vector2 direction       = objSpaceObj.objRigidbody.position - rbToGravitate.position;
        float   distanceSquared = direction.sqrMagnitude;

        float distanceFromCenter = (objPhysicsProperties.Radius + objToGravitate.objPhysicsProperties.Radius);

        //Debug.Log("Dist from center: " + distanceFromCenter + " | Distance: " + direction.magnitude);

        if (direction.magnitude > distanceFromCenter)
        {
            float   gravitationMag = G * (objSpaceObj.objRigidbody.mass * rbToGravitate.mass) / distanceSquared;
            Vector2 force          = direction.normalized * gravitationMag;

            rbToGravitate.AddRelativeForce(force, ForceMode2D.Force);

            if (force.SqrMagnitude() > MIN_THRESHOLD)
            {
                if (!gravitatingObjects.Contains(objToGravitate))
                {
                    gravitatingObjects.Add(objToGravitate);

                    if (objSpaceObj.objRigidbody.mass >= objToGravitate.objSpaceObj.objRigidbody.mass)
                    {
                        if (OnObjectEnteredGravitationalPull != null)
                        {
                            OnObjectEnteredGravitationalPull(objSpaceObj, objToGravitate.objSpaceObj);
                        }
                    }
                }
            }
            else if (gravitatingObjects.Contains(objToGravitate))
            {
                gravitatingObjects.Remove(objToGravitate);

                if (OnObjectExitedGravitationalPull != null)
                {
                    if (objSpaceObj.objRigidbody.mass >= objToGravitate.objSpaceObj.objRigidbody.mass)
                    {
                        Debug.Log("OUT OF GRAVITATIONAL RANGE");
                        OnObjectExitedGravitationalPull(objSpaceObj, objToGravitate.objSpaceObj);
                    }
                }
            }
        }
        else
        {
            //Absorb!
            PhysicsProperties.AbsorbObject(objSpaceObj, objToGravitate.objSpaceObj);
        }
    }