protected virtual GravityPoint GetClosestGravityPoint()
    {
        if (_gravityPoints.Count == 0)
        {
            return(null);
        }

        GravityPoint closestGravityPoint = null;
        float        closestDistanceSqr  = Mathf.Infinity;
        Vector3      currentPosition     = _controller.ColliderCenterPosition;

        foreach (GravityPoint gravityPoint in _gravityPoints)
        {
            Vector3 directionToTarget = gravityPoint.transform.position - currentPosition;
            float   dSqrToTarget      = directionToTarget.sqrMagnitude;

            // if we're outside of this point's zone of effect, we do nothing and exit
            if (directionToTarget.magnitude > gravityPoint.DistanceOfEffect)
            {
                continue;
            }

            if (dSqrToTarget < closestDistanceSqr)
            {
                closestDistanceSqr  = dSqrToTarget;
                closestGravityPoint = gravityPoint;
            }
        }

        return(closestGravityPoint);
    }
Пример #2
0
    public int AddPoint()
    {
        GravityPoint newPoint = new GravityPoint();
        switch (points.Count)
        {
            case 0:
                break;
            case 1:
                newPoint.position = points[points.Count - 1].position;
                newPoint.position += Vector3.forward * offset;
                break;
            default:
                newPoint.position = points[points.Count - 1].position;
                newPoint.position += (points[points.Count - 1].position - points[points.Count - 2].position).normalized * offset;
                break;
        }

        if (useLastPointGravity && (points.Count > 0))
            newPoint.gravity = points[points.Count - 1].gravity;
        else
            newPoint.gravity = gravity;

        points.Add(newPoint);

        UpdateActivePoint();

        return points.Count - 1;
    }
Пример #3
0
 public void UpdateActivePoint()
 {
     if ((-1 < activeIndex) && (activeIndex < points.Count))
         activePoint = points[activeIndex];
     else
         activePoint = null;
 }
Пример #4
0
 protected virtual void Initialize()
 {
     gravityPoint = gameObject.AddComponent <GravityPoint>();
     dCollider    = gameObject.AddComponent <DSphereCollider>();
 }
Пример #5
0
 public GravityRange()
 {
     startPoint = null;
     endPoint   = null;
 }
Пример #6
0
 public GravityRange(GravityPoint sPoint, GravityPoint ePoint)
 {
     startPoint = sPoint;
     endPoint   = ePoint;
 }
    // Start is called before the first frame update
    protected virtual void ComputeGravityPoints()
    {
        // if we're not affected by gravity points, we do nothing and exit
        if (!SubjectToGravityPoints)
        {
            return;
        }
        // if we're in a gravity zone, we do nothing and exit
        if (_inAGravityZone)
        {
            return;
        }

        // we grab the closest gravity point
        _closestGravityPoint = GetClosestGravityPoint();

        // if it's not null
        if (_closestGravityPoint != null)
        {
            // our new gravity point becomes the closest if we didn't have one already, otherwise we stay on the last gravity point met for now
            _newGravityPoint = (_lastGravityPoint == null) ? _closestGravityPoint : _lastGravityPoint;
            // if we've got a new gravity point
            if ((_lastGravityPoint != _closestGravityPoint) && (_lastGravityPoint != null))
            {
                // if we haven't entered a new gravity point in a while, we switch to that new gravity point
                if (Time.time - _entryTimeStampPoints >= InactiveBufferDuration)
                {
                    _entryTimeStampPoints = Time.time;
                    _newGravityPoint      = _closestGravityPoint;
                    Transition(true, _newGravityPoint.transform.position - _controller.ColliderCenterPosition);
                    StartRotating();
                }
            }
            // if we didn't have a gravity point last time, we switch to this new one
            if (_lastGravityPoint == null)
            {
                if (Time.time - _entryTimeStampPoints >= InactiveBufferDuration)
                {
                    _entryTimeStampPoints = Time.time;
                    _newGravityPoint      = _closestGravityPoint;
                    Transition(true, _newGravityPoint.transform.position - _controller.ColliderCenterPosition);
                    StartRotating();
                }
            }
            // we override our gravity
            _gravityPointDirection = _newGravityPoint.transform.position - _controller.ColliderCenterPosition;
            float gravityAngle = 180 - MMMaths.AngleBetween(Vector2.up, _gravityPointDirection);
            _gravityOverridden    = true;
            _overrideGravityAngle = gravityAngle;
            _lastGravityPoint     = _newGravityPoint;
        }
        else
        {
            // if we don't have a gravity point in range, our gravity is not overridden
            if (Time.time - _entryTimeStampPoints >= InactiveBufferDuration)
            {
                if (_lastGravityPoint != null)
                {
                    Transition(false, _newGravityPoint.transform.position - _controller.ColliderCenterPosition);
                    StartRotating();
                }
                _entryTimeStampPoints = Time.time;
                _gravityOverridden    = false;
                _lastGravityPoint     = null;
            }
        }
    }
Пример #8
0
    /*-----------------------------------------------------------------------------------------------
     * //Removes the weaker force as the player leaves one planet
     * ------------------------------------------------------------------------------------------------*/

    public void StopTrackingForce(GravityPoint gravitySource)
    {
        trackedForces.Remove(gravitySource);
    }
Пример #9
0
 /*-----------------------------------------------------------------------------------------------
  * //track a force from a gravity source, so we can later calculate what the up direction is
  * //based on the summation of all the currently applied external forces
  * ------------------------------------------------------------------------------------------------*/
 public void ApplyPlanetForce(GravityPoint gravitySource, Vector3 force)
 {
     body.AddForce(force);
     trackedForces[gravitySource] = force;
 }
        protected virtual void ComputeGravityPoints()
        {
            // if not affected by gravity ponts, do nothing and exit
            if (!subjectToGravityPoints)
            {
                return;
            }

            // grab closest gravity point
            _closestGravityPoint = GetClosestGravityPoint();
            Debug.Log(_closestGravityPoint.transform.position);

            // if it's not null
            if (_closestGravityPoint != null)
            {
                _newGravityPoint = (_lastGravityPoint == null) ? _closestGravityPoint : _lastGravityPoint;
                // if we have a new gravity point
                if ((_lastGravityPoint != _closestGravityPoint) && (_lastGravityPoint != null))
                {
                    // time check to switch gravity point
                    if (Time.time - _entryTimeStampPoints >= InactiveBufferDuration)
                    {
                        _entryTimeStampPoints = Time.time;
                        _newGravityPoint      = _closestGravityPoint;
                        Transition(true, _newGravityPoint.transform.position - this.transform.position);
                        // StartRotating();
                    }
                }
                // if we didn't have a gravity point last time
                if (_lastGravityPoint == null)
                {
                    // time check to switch gravity point
                    if (Time.time - _entryTimeStampPoints >= InactiveBufferDuration)
                    {
                        _entryTimeStampPoints = Time.time;
                        _newGravityPoint      = _closestGravityPoint;
                        Transition(true, _newGravityPoint.transform.position - this.transform.position);
                        // StartRotating();
                    }
                }
                // ovveride gravity
                _gravityPointDirection = _newGravityPoint.transform.position - this.transform.position;
                float gravityAngle = 180 - MMMaths.AngleBetween(Vector2.up, _gravityPointDirection);
                _gravityOverridden    = true;
                _overrideGravityAngle = gravityAngle;
                _lastGravityPoint     = _newGravityPoint;
            }
            else
            {
                // without gravity point in range, our gravity is not overridden
                if (Time.time - _entryTimeStampPoints >= InactiveBufferDuration)
                {
                    if (_lastGravityPoint != null)
                    {
                        Transition(false, _newGravityPoint.transform.position - this.transform.position);
                        // StartRotating();
                    }
                    _entryTimeStampPoints = Time.time;
                    _gravityOverridden    = false;
                    _lastGravityPoint     = null;
                }
            }
        }