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); }
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; }
public void UpdateActivePoint() { if ((-1 < activeIndex) && (activeIndex < points.Count)) activePoint = points[activeIndex]; else activePoint = null; }
protected virtual void Initialize() { gravityPoint = gameObject.AddComponent <GravityPoint>(); dCollider = gameObject.AddComponent <DSphereCollider>(); }
public GravityRange() { startPoint = null; endPoint = null; }
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; } } }
/*----------------------------------------------------------------------------------------------- * //Removes the weaker force as the player leaves one planet * ------------------------------------------------------------------------------------------------*/ public void StopTrackingForce(GravityPoint gravitySource) { trackedForces.Remove(gravitySource); }
/*----------------------------------------------------------------------------------------------- * //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; } } }