public override Vector2 CalculateSteering(Vehicle agent, List <Vehicle> targets)
    {
        List <Vehicle> neighbors = new List <Vehicle>();

        foreach (Vehicle v in Vehicle.AllVehicles)
        {
            if (v != agent && (v.position - agent.position).magnitude < neighborRadius)
            {
                neighbors.Add(v);
            }
        }

        Vector2 sepSteering  = Steering.Separation(agent, neighbors) * separation;
        Vector2 aliSteering  = Steering.Alignment(agent, neighbors) * alignment;
        Vector2 cohSteering  = Steering.Cohesion(agent, neighbors) * cohesion;
        Vector2 wanSteering  = Steering.Wander(agent, 2f, 2f, 1f);
        Vector2 fleeSteering = Steering.Flee(agent, targets[0], fleeRange);

        Vector2 steering = Vector2.zero;

        if (AccumulateForce(agent, fleeSteering, ref steering) &&
            AccumulateForce(agent, sepSteering, ref steering) && AccumulateForce(agent, cohSteering, ref steering) &&
            AccumulateForce(agent, aliSteering, ref steering) && AccumulateForce(agent, wanSteering, ref steering))
        {
            return(steering);
        }

        return(steering);
    }
Example #2
0
 public override Vector2 CalculateSteering(Vehicle agent, List <Vehicle> targets)
 {
     if (targets.Count == 0)
     {
         return(Vector2.zero);
     }
     else
     {
         return(Steering.Flee(agent, targets[0], fleeRange));
     }
 }
Example #3
0
    //Uses the various Movement Behaviors to calculate the vector to
    // determine the next position of the agent
    private void CalcSteeringForce()
    {
        steeringForce = Vector3.zero;

        for (int i = 0; i < gameManager.Werewolves.Count; i++)
        {
            float wDist = Vector3.Distance(this.transform.position, gameManager.Werewolves[i].transform.position);

            if (wDist < 20)
            {
                if (wDist < 5)
                {
                    steeringForce += steering.Flee(gameManager.Werewolves[i].transform.position);

                    if (leaderFollowBool == true)
                    {
                        gameManager.Followers.Remove(this);
                    }


                    leaderFollowBool = false;
                }
                else
                {
                    steeringForce += steering.Evasion(gameManager.Werewolves[i].transform.position
                                                      + gameManager.Werewolves[i].transform.forward);
                }
            }
            else if (Vector3.Distance(this.transform.position, gameManager.Mayor.transform.position) < 40 && leaderFollowBool == false)
            {
                gameManager.Followers.Add(this);
                steeringForce += 10 * leaderFollow();
                steeringForce += gameManager.separationWt * Separation();
                steeringForce += gameManager.cohesionWt * Cohesion();
            }
            else if (leaderFollowBool == true)
            {
                steeringForce += 15 * leaderFollow();
                steeringForce += gameManager.separationWt * Separation();
                steeringForce += gameManager.cohesionWt * Cohesion();
            }
            else
            {
                steeringForce += 2 * wander();
            }
        }

        steeringForce += gameManager.inBoundsWt * StayInBounds(200, new Vector3(469, 0, 454));

        //avoid close obstacles
        for (int i = 0; i < gameManager.Obstacles.Length; i++)
        {
            if (Vector3.Distance(this.transform.position, gameManager.Obstacles[i].transform.position) < 60)
            {
                //steeringForce += steering.AvoidObstacle(gameManager.Obstacles[i], gameManager.avoidDist);
            }
        }
    }
Example #4
0
    private void Update()
    {
        Vector3 position   = transform.position;
        Vector3 target     = targetPos.position;
        bool    isSteering = GlobalSettings.isInSteering;

        //C
        if (Vector3.Distance(position, target) <= distance)
        {
            //C i)
            if (isSteering)
            {
                Steering.Flee(rb, transform, targetPos.position, acceleration, speed);
            }
            else
            {
                Kinematic.Flee(rb, transform, targetPos.position, speed);
            }
        }
        else
        {
            rb.velocity = Vector3.zero;
            //C ii)
            //if angle btw forward and target close to 0,
            if (Vector3.Angle(-transform.forward, target - position) <= 2f)
            {
                // then move forward
                if (isSteering)
                {
                    Steering.Flee(rb, transform, targetPos.position, acceleration, speed);
                }
                else
                {
                    Kinematic.Flee(rb, transform, targetPos.position, speed);
                }
            }
            else
            {
                // else turn towards target
                if (isSteering || rb.velocity.magnitude < 1f)
                {
                    Helper.Alignment(transform, position - target, stopRotationSpeed);
                }
                else
                {
                    Helper.Alignment(transform, position - target, stopRotationSpeed);
                }
            }
        }
    }
Example #5
0
    private void CalcSteeringForce()
    {
        steeringForce = Vector3.zero;

        //Keeps werewolves away from Villager Spawn point
        steeringForce += gameManager.avoidWt * steering.AvoidObstacle(respawnPont, 100f);


        float mayDist = Vector3.Distance(this.transform.position, gameManager.Mayor.transform.position);

        //Choose new villager to chase (closest villager)
        target = gameManager.Villagers[0];
        findTarget();

        float tarDist = Vector3.Distance(this.transform.position, target.transform.position);

        if (tarDist > 30)
        {
            steeringForce += 10 * steering.Pursuit(target.transform.forward +
                                                   target.transform.position);
        }
        else
        {
            steeringForce += 6 * steering.Seek(target);
        }

        if (mayDist < 20)
        {
            steeringForce += 20 * steering.Flee(gameManager.Mayor);
        }
        else
        {
            steeringForce += 5 * steering.Evasion(gameManager.Mayor.transform.forward +
                                                  gameManager.Mayor.transform.position);
        }

        //avoid close obstacles
        for (int i = 0; i < gameManager.Obstacles.Length; i++)
        {
            if (Vector3.Distance(this.transform.position, gameManager.Obstacles[i].transform.position) < 60)
            {
                steeringForce += gameManager.avoidWt * steering.AvoidObstacle(gameManager.Obstacles[i], gameManager.avoidDist);
            }
        }
    }
Example #6
0
    void Update()
    {
        if (!alive)
        {
            return;
        }

        Vector2 dir = target.position - transform.position;

        if (dir.magnitude > seekDist)
        {
            Vector2 seek = Steering.Seek(transform.position, rigidbody2D.velocity, target.position, maxSpeed);
            seek = Steering.ObstacleSweep2D(transform.position, 1, seek, 10, avoidLayers);
            rigidbody2D.AddForce(seek, ForceMode.Force);
        }
        else
        {
            Vector3 flee = Steering.Flee(transform.position, rigidbody2D.velocity, target.position, maxSpeed);
            flee = Steering.ObstacleSweep2D(transform.position, 1, flee, 10, avoidLayers);
            rigidbody2D.AddForce(flee, ForceMode.Force);
        }
    }
Example #7
0
        void ICmpUpdatable.OnUpdate()
        {
            var ship = ControlledShip;
            var body = GameObj.GetComponent <RigidBody>();

            if (Target == null)
            {
                return;
            }

            var targetPos = Target.Transform.Pos.Xy;

            _elapsedTime += Time.TimeMult;

            var thrustVector = Steering.Pursuit(GameObj.Transform, Target.Transform);
            var turnVector   = thrustVector;

            ship.ThrustVector = thrustVector + (Steering.Flee(GameObj.Transform.Pos.Xy, GameObj.Transform.GetWorldPoint(_evadeVector)) * 100);

            if (turnVector.LengthSquared > 0)
            {
                var   fps          = Time.Fps <= 0 ? 60 : Time.Fps;
                float desiredAngle = MathF.NormalizeAngle(turnVector.Angle);
                //var angle = Utilities.FindAngleBetweenTwoVectors(ship.CurrentDirection, turnVector);
                float nextAngle     = ship.GameObj.Transform.Angle + body.AngularVelocity / fps;
                float totalRotation = desiredAngle - nextAngle;

                //while (totalRotation < -MathF.Pi) totalRotation += MathF.TwoPi;
                //while (totalRotation > MathF.Pi) totalRotation -= MathF.TwoPi;


                float desiredAngularVelocity = totalRotation * fps;
                float torque = body.Inertia * (body.AngularDamping + 1) + desiredAngularVelocity / (1 / fps);

                ship.DesiredTorque = torque;

                /*
                 * var limit = MathF.DegToRad(RotationDampingAngle);
                 * if (angle > limit)
                 *  ship.TurnDirection = Rotation.CCW;
                 * else if(angle < -limit)
                 *  ship.TurnDirection = Rotation.CW;
                 * else
                 * {
                 *  if (Math.Abs(angle) < limit) // damp rotation if we are close to desired facing
                 *      body.AngularVelocity *= RotationDamping;
                 * }
                 */
            }

            GameObj.Transform.Pos   = ship.GameObj.Transform.Pos;
            GameObj.Transform.Angle = ship.GameObj.Transform.Angle;

            /*
             * if (components.IsValid)
             * {
             *  //_vehicle.Ship.ThrustVector = (components.SteeringForce + _vehicle.Velocity).Normalized * components.Thrust;
             *
             *  if (components.Rotation < 0)
             *      _vehicle.Ship.TurnDirection = Rotation.CW;
             *  else if (components.Rotation > 0)
             *      _vehicle.Ship.TurnDirection = Rotation.CCW;
             *
             * }*/
        }