Exemplo n.º 1
0
    public override Vector2 CalculateSteering(MovingEntity vehicle)
    {
        Vector2 steeringForce = new Vector2();

        if (seek)
        {
            steeringForce += SteeringBehaviors.Seek(vehicle);
        }
        if (flee)
        {
            steeringForce += SteeringBehaviors.Flee(vehicle);
        }
        if (arrive)
        {
            steeringForce += SteeringBehaviors.Arrive(vehicle, SteeringBehaviors.Deceleration.normal);
        }
        if (separation)
        {
            steeringForce += SteeringBehaviors.Separation(vehicle) * 3;
        }
        if (pursuit)
        {
            steeringForce += SteeringBehaviors.Pursuit(vehicle);
        }

        return(steeringForce);
    }
Exemplo n.º 2
0
    private void Flee(Vector3 targetPosition)
    {
        Vector3 steering = steeringBehaviors.Flee(body, targetPosition) * FLEE_VELOCITY;

        movement.KeepConstantVelocity(body, FLEE_VELOCITY);

        body.AddForce(steering);
    }
Exemplo n.º 3
0
    public override Vector2 CalculateSteering(MovingEntity vehicle)
    {
        Vector2 steeringForce = Vector2.zero;
        Vector2 force;

        if (separation)
        {
            force = SteeringBehaviors.Separation(vehicle) * 1.0f;
            if (AccumulateForce(vehicle, ref steeringForce, force) && force != Vector2.zero)
            {
                return(steeringForce);
            }
        }
        if (seek)
        {
            force = SteeringBehaviors.Seek(vehicle) * 1.0f;
            if (AccumulateForce(vehicle, ref steeringForce, force))
            {
                return(steeringForce);
            }
        }
        if (flee)
        {
            force = SteeringBehaviors.Flee(vehicle) * 1.0f;
            if (AccumulateForce(vehicle, ref steeringForce, force))
            {
                return(steeringForce);
            }
        }
        if (arrive)
        {
            force = SteeringBehaviors.Arrive(vehicle) * 1.0f;
            if (AccumulateForce(vehicle, ref steeringForce, force))
            {
                return(steeringForce);
            }
        }
        if (pursuit)
        {
            force = SteeringBehaviors.Pursuit(vehicle) * 1.0f;
            if (AccumulateForce(vehicle, ref steeringForce, force))
            {
                return(steeringForce);
            }
        }

        return(steeringForce);
    }
Exemplo n.º 4
0
    private void FixedUpdate()
    {
        var steeringForce = new Vector2();

        if (Target != null && settings.Seek > 0)
        {
            steeringForce = settings.Seek * SteeringBehaviors.Seek(this, Target.position);
        }

        foreach (var boid in allBoids)
        {
            if ((object)boid != this)
            {
                if ((boid.GetPosition() - GetPosition()).sqrMagnitude < 1f)
                {
                    if (settings.Flee > 0)
                    {
                        steeringForce += settings.Flee * SteeringBehaviors.Flee(this, boid.GetPosition()) / ((Vector2)transform.position - boid.GetPosition()).magnitude;
                    }
                    if (settings.GetClose > 0)
                    {
                        steeringForce += settings.GetClose * SteeringBehaviors.Seek(this, boid.GetPosition());
                    }
                    ;
                    if (settings.Align > 0)
                    {
                        steeringForce += settings.Align * SteeringBehaviors.Aling(this, boid);
                    }
                }
            }
        }

        _rigidbody.AddForce(Vector2.ClampMagnitude(steeringForce, _maxForce));

        TurnTowardsVelocity();
    }
    public void UpdateSteering()
    {
        steeringVector = transform.forward;

        if (isSeeking && targetTransform != null)
        {
            steeringVector = SteeringBehaviors.Seek(cachedTransform.position, velocity, maxSpeed, targetTransform.position);
        }

        if (isFleeing && targetTransform != null)
        {
            steeringVector = SteeringBehaviors.Flee(cachedTransform.position, velocity, maxSpeed, targetTransform.position);
        }

        if (isPursuing && movingTarget != null)
        {
            steeringVector = SteeringBehaviors.Pursuit(cachedTransform.position, velocity, maxSpeed, movingTarget.transform.position, movingTarget.velocity);
        }

        if (isEvading && movingTarget != null)
        {
            steeringVector = SteeringBehaviors.Evasion(cachedTransform.position, velocity, maxSpeed, movingTarget.transform.position, movingTarget.velocity);
        }

        if (isArriving && targetTransform != null)
        {
            steeringVector = SteeringBehaviors.Arrival(cachedTransform.position, velocity, maxSpeed, targetTransform.position, arrivalSlowingDistance);
        }

        if (IsWandering)
        {
            steeringVector = Wander(0.5f, 0.1f, false);
        }

        if (isLeaderFollowing)
        {
            Vector3 leaderFollowPoint = leader.transform.position + leader.transform.forward * -2f;
            steeringVector = SteeringBehaviors.Arrival(cachedTransform.position, velocity, maxSpeed, leaderFollowPoint, arrivalSlowingDistance);
        }

        if (isPathFollowing)
        {
            Vector3 possibleSteeringVector = PathFollowing(simplePath);

            if (possibleSteeringVector != Vector3.zero)
            {
                steeringVector = possibleSteeringVector;
            }
        }

        if (isSeperating)
        {
            Vector3 repulsionLocation = cachedTransform.position + Seperation();

            if (repulsionLocation != cachedTransform.position)
            {
                Vector3 desiredVelocity = (repulsionLocation - cachedTransform.position).normalized * maxSpeed;

                steeringVector = desiredVelocity - velocity;
            }
        }

        if (isAvoidingCollision)
        {
            Vector3 collisionSteeringVector = CollisionAvoidance();

            if (collisionSteeringVector != velocity)
            {
                if (collisionSteeringVector == transform.forward * maxSpeed && steeringVector != transform.forward)
                {
                    // The previously applied steering vector should not be modified.
                }
                else
                {
                    steeringVector = collisionSteeringVector;
                }
            }
        }

        if (velocity != Vector3.zero) //Check is to prevent the log message "Look rotation viewing vector is zero"
        {
            transform.rotation = Quaternion.LookRotation(velocity);
        }

        UpdateMovement();
    }