Beispiel #1
0
            public Vector3 GetForce(Steering steering)
            {
                return(SteeringUtilities.getSeekForce(steering, target));
                // TODO: actually use stopping distance to arrive

                /*
                 * // can approximate with (if too close : break)
                 * // alternatively stopdist from current pos and current speed
                 * // or expected stopdist after the current frame assuming accel wont change the current frame much
                 *
                 * // for the duration it takes to go from maxV to 0
                 * //stoptime = v/ACCEL;
                 * //stopdist = stoptime * v/2;
                 * //dist = desiredv * desiredV/(2 * accel)
                 * //desiredv = sqrt(dist * 2 * accel)
                 *
                 * Vector3 offset = dest - ((Vector3) transform.position + (dt * rb.velocity));
                 *
                 * float dist = offset.magnitude;
                 * float stopdist = MAXV * MAXV / (2 * ACCEL);
                 * float desiredV = dist < stopdist ? Mathf.Sqrt(dist * 2 * ACCEL) : MAXV;
                 * Vector3 deltaV = scaled (desiredV, offset) - rb.velocity;
                 * float dvmagn = deltaV.magnitude;
                 * if (dvmagn > forceRemaining * forceRemaining * dt * dt) {
                 *      rb.AddForce(scaled(forceRemaining, deltaV));
                 *      forceRemaining = 0f;
                 * } else {
                 *      rb.AddForce(deltaV);
                 *      forceRemaining -= dvmagn;
                 * }
                 */
            }
Beispiel #2
0
            public Vector3 GetForce(Steering steering)
            {
                if (steering.GetVelocity().sqrMagnitude == 0f)
                {
                    float initialAngle = Random.Range(0f, 2 * Mathf.PI);
                    float sinAngle     = Mathf.Sin(initialAngle);
                    wanderPoint = 2.4f * new Vector3(Mathf.Cos(initialAngle), Steering.YMult * sinAngle, Steering.ZMult * sinAngle);
                }
                if (steering.GetVelocity().sqrMagnitude > 0f && !hasMoved)
                {
                    hasMoved    = true;
                    wanderPoint = SteeringUtilities.scaledVector(2.4f, steering.GetVelocity());
                }
                float xNoise  = Time.fixedDeltaTime * wanderNoise * Random.Range(-1f, 1f);
                float yzNoise = Time.fixedDeltaTime * wanderNoise * Random.Range(-1f, 1f);

                wanderPoint += new Vector3(xNoise, Steering.YMult * yzNoise, Steering.ZMult * yzNoise);
                Vector3 forwardPoint = steering.GetPosition() + SteeringUtilities.scaledVector(1.41f, steering.GetVelocity());

                // Constrain the wander point to the unit circle in front of the player.
                wanderPoint = forwardPoint + (wanderPoint - forwardPoint).normalized;
                //return SteeringUtilities.getForceForDirection(steering, wanderDirection);
                //SteeringUtilities.drawDebugCircle(forwardPoint, 1f, Color.black, 32);
                SteeringUtilities.drawDebugPoint(wanderPoint, Color.red);
                return(SteeringUtilities.getSeekForce(steering, wanderPoint));
            }
Beispiel #3
0
 public Vector3 GetForce(Steering steering)
 {
     if (_target != null)
     {
         return(SteeringUtilities.getSeekForce(steering, _target.GetPosition()));
     }
     else
     {
         return(SteeringUtilities.getSeekForce(steering, _point));
     }
 }
Beispiel #4
0
 public Vector3 GetForce(Steering steering)
 {
     return(-SteeringUtilities.getSeekForce(steering, target));
 }