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); }
public override Vector2 CalculateSteering(Vehicle agent, List <Vehicle> targets) { if (targets.Count == 0) { return(Vector2.zero); } else { return(Steering.Flee(agent, targets[0], fleeRange)); } }
//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); } } }
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); } } } }
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); } } }
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); } }
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; * * }*/ }