public void FixedUpdate() { /* First find the position of the ball on the x axis and than compare it * with the state boundary which is the point where the states meet. * There is no need to make different states for the y axis since * the AI should change its behaviour based on how far away/close he is * from its own and from the opponents goal. */ AIBasicBehaviour.Sprint(player, 0); xPos = ball.transform.position.x; if (xPos >= boundary) { defendState.Run(); } else if (xPos < boundary && xPos > 0) { tackleState.Run(); } else if (xPos < 0 && xPos > -boundary) { attackState.Run(); } else if (xPos <= -boundary) { shootState.Run(); } }
public static void MoveBackward(GameObject player) { // Works the same as above but x and y are flipped Vector2 dir = AIDirectionBehaviour.GetRotationVector(player); AIBasicBehaviour.GetController(player).playerController.playerMovement.MovePlayer(-dir.x, -dir.y); }
public new void RunOnePosition() { /* OGoal | AI | Ball | Player | AIGoal */ if (AICheckBehaviour.FarFromBall(player, ball)) { if (AICheckBehaviour.CheckOpponentsHealth(opponent)) { AIMovementBehaviour.LookAt(player, opponent); AIBasicBehaviour.UseGun(player); } else if (AICheckBehaviour.CheckIfCloseToPickup(GetActivePickups(), player)) { AIMovementBehaviour.LookAt(player, AICheckBehaviour.GetClosestPickup(GetActivePickups(), GetActiveCount(), player)); AIMovementBehaviour.MoveForward(player); } else { AIGlobalBehaviour.PositionAndShoot(player, ball, aIController.lineOfSight.GetAvailablePoint()); } } else { AIGlobalBehaviour.PositionAndShoot(player, ball, aIController.lineOfSight.GetAvailablePoint()); } }
public new void RunOnePosition() { /* OGoal | AI | Ball | Player | AIGoal */ if (AICheckBehaviour.FarFromBall(player, ball)) { AIBasicBehaviour.Sprint(player, 1); if (AICheckBehaviour.CheckIfCloseToPickup(GetActivePickups(), player)) { AIMovementBehaviour.LookAt(player, AICheckBehaviour.GetClosestPickup(GetActivePickups(), GetActiveCount(), player)); AIMovementBehaviour.MoveForward(player); } else { AIMovementBehaviour.LookAt(player, opponent); AIBasicBehaviour.UseGun(player); AIMovementBehaviour.MoveTowards(player, ball); } } else { AIBasicBehaviour.Sprint(player, 1); AIGlobalBehaviour.PositionAndShoot(player, ball, goal); } }
public new void RunTwoPosition() { /* OGoal | Player | Ball | AI | AIGoal */ if (AICheckBehaviour.FarFromBall(player, ball)) { if (AICheckBehaviour.CheckIfCloseToOpponent(player, opponent)) { AIMovementBehaviour.LookAt(player, opponent); AIBasicBehaviour.UseSword(player); AIMovementBehaviour.MoveTowards(player, ball); } else if (AICheckBehaviour.CheckOpponentsHealth(opponent)) { AIMovementBehaviour.LookAt(player, opponent); AIBasicBehaviour.UseGun(player); AIMovementBehaviour.MoveTowards(player, ball); } else { AIMovementBehaviour.LookAt(player, ball); AIBasicBehaviour.UseGun(player); AIMovementBehaviour.MoveTowards(player, ball); } } else { if (AICheckBehaviour.CheckIfBallApproaching(player, ball)) { AIBasicBehaviour.UseShield(player); } AIGlobalBehaviour.PositionAndShoot(player, ball, goal); } }
public new void RunThreePosition() { /* OGoal | Player, AI | Ball | AIGoal */ if (AICheckBehaviour.FarFromBall(player, ball)) { AIBasicBehaviour.Sprint(player, 1); if (AICheckBehaviour.CheckIfCloseToOpponent(player, opponent)) { AIMovementBehaviour.LookAt(player, opponent); AIBasicBehaviour.UseSword(player); AIMovementBehaviour.MoveTowards(player, ball); } else if (AICheckBehaviour.CheckOpponentsHealth(opponent)) { AIMovementBehaviour.LookAt(player, opponent); AIBasicBehaviour.UseGun(player); AIMovementBehaviour.MoveTowards(player, ball); } else { AIGlobalBehaviour.PositionAndShoot(player, ball, goal); } } else { AIBasicBehaviour.Sprint(player, 1); // Move towards the ball as fast as possible. AIGlobalBehaviour.PositionAndShoot(player, ball, goal); } }
public new void RunThreePosition() { /* OGoal | Player, AI | Ball | AIGoal */ AIBasicBehaviour.Sprint(player, 1); AIGlobalBehaviour.PositionAndShoot(player, ball, goal); }
public static void ShootInTheMiddle(GameObject player, GameObject ball, GameObject goal) { /* Same as ShootAtGoal method but this time the player kicks the towards the middle of * the football pitch. */ Vector2 goalDirection = AIDirectionBehaviour.FindPositionOf(ball, goal, 0.9f); AIMovementBehaviour.LookAt(player, ball); if (AICalculate.CalculateLengthBetween(player, ball.transform.position.x, ball.transform.position.y) < 2) // If player is close to the ball { if (AICalculate.CalculateLengthBetween(player, goalDirection.x, goalDirection.y) > 0.3) { PositionInFrontOf(player, ball, goal); } else { AIMovementBehaviour.LookAt(player, player.transform.position.x, player.GetComponent <PlayerController>().globalSettings.stateBoundary); AIBasicBehaviour.UseSword(player); } } else { AIMovementBehaviour.MoveForward(player); } }
// Should be used as the default behaviour. public static void PositionAndShoot(GameObject player, GameObject ball, GameObject goal) { /* First a position of the goal is found, then player is rotated to face the ball. * Next distance from the player to the point from which he would be able to shoot is found. * Then the player is moved closer to it or uses a sword to shot at the goal. */ AIMovementBehaviour.LookAt(player, ball); Vector2 goalDirection = AIDirectionBehaviour.FindPositionOf(ball, goal, 0.9f); // The point where player should position itself if (AICalculate.CalculateLengthBetween(player, ball.transform.position.x, ball.transform.position.y) < 2) // If player is close to the ball { if (AICalculate.CalculateLengthBetween(player, goalDirection.x, goalDirection.y) > 0.3) { PositionInFrontOf(player, ball, goal); } else { AIBasicBehaviour.UseSword(player); } } else { AIMovementBehaviour.MoveForward(player); } }
public new void RunTwoPosition() { /* OGoal | Player | Ball | AI | AIGoal */ if (AICheckBehaviour.FarFromBall(player, ball)) { AIBasicBehaviour.Sprint(player, 1); if (aIController.lineOfSight.CheckIfBallSpotted()) { AIMovementBehaviour.LookAt(player, ball); AIBasicBehaviour.UseGun(player); AIMovementBehaviour.MoveTowards(player, ball); } else { AIGlobalBehaviour.PositionAndShoot(player, ball, goal); } } else { if (AICheckBehaviour.CheckIfBallApproaching(player, ball)) { AIBasicBehaviour.UseShield(player); } AIGlobalBehaviour.PositionAndShoot(player, ball, goal); } }
public static void MoveForward(GameObject player) { /* This method moves player forward but it does not * take care of the direction. To make the player run to the ball * use RunToTheBall method. */ Vector2 dir = AIDirectionBehaviour.GetRotationVector(player); AIBasicBehaviour.GetController(player).playerController.playerMovement.MovePlayer(dir.x, dir.y); }
public static void LookAt(GameObject player, GameObject o) { /* This method makes the player look at the object. * This is usually used to make the player look at the ball. * First, the position of the object we want to look at, in regards of the player * is found and then the player is rotated. */ float x = o.transform.position.x - player.transform.position.x; float y = o.transform.position.y - player.transform.position.y; AIBasicBehaviour.GetController(player).playerRotator.Rotate(x, y); }
public new void RunTwoPosition() { /* OGoal | Player | Ball | AI | AIGoal */ if (AICheckBehaviour.FarFromBall(player, ball)) { AIBasicBehaviour.Sprint(player, 1); AIGlobalBehaviour.PositionAndShoot(player, ball, goal); } else { if (AICheckBehaviour.CheckIfBallApproaching(player, ball)) { AIBasicBehaviour.UseShield(player); } AIGlobalBehaviour.PositionAndShoot(player, ball, goal); } }
public new void RunZeroPosition() { /* OGoal | Ball | Player, AI | AIGoal */ if (AICheckBehaviour.FarFromBall(player, ball)) { if (aIController.lineOfSight.CheckIfBallSpotted()) { AIMovementBehaviour.LookAt(player, ball); AIBasicBehaviour.UseGun(player); } } if (aIController.lineOfSight.CheckIfWallSpotted()) { AIGlobalBehaviour.ShootInTheMiddle(player, ball, goal); } else { AIGlobalBehaviour.PositionAndShoot(player, ball, aIController.lineOfSight.GetAvailablePoint()); } }
public new void RunZeroPosition() { /* OGoal | Ball | Player, AI | AIGoal */ if (AICheckBehaviour.FarFromBall(player, ball)) { // If far from ball if (aIController.lineOfSight.CheckIfWallSpotted()) { AIGlobalBehaviour.ShootInTheMiddle(player, ball, goal); } else { AIGlobalBehaviour.PositionAndShoot(player, ball, aIController.lineOfSight.GetAvailablePoint()); } } else { // If close to a pickup - move towards it if (aIController.lineOfSight.CheckIfBallSpotted()) { AIMovementBehaviour.LookAt(player, ball); AIBasicBehaviour.UseGun(player); AIMovementBehaviour.MoveTowards(player, ball); } else if (AICheckBehaviour.CheckIfCloseToPickup(GetActivePickups(), player)) { AIMovementBehaviour.LookAt(player, AICheckBehaviour.GetClosestPickup(GetActivePickups(), GetActiveCount(), player)); AIMovementBehaviour.MoveForward(player); } else { AIGlobalBehaviour.PositionAndShoot(player, ball, aIController.lineOfSight.GetAvailablePoint()); } } }
public new void RunThreePosition() { /* OGoal | Player, AI | Ball | AIGoal */ if (AICheckBehaviour.FarFromBall(player, ball)) { if (AICheckBehaviour.CheckIfCloseToOpponent(player, opponent)) { AIMovementBehaviour.LookAt(player, opponent); AIBasicBehaviour.UseSword(player); } AIBasicBehaviour.Sprint(player, 1); AIMovementBehaviour.LookAt(player, opponent); AIBasicBehaviour.UseGun(player); AIGlobalBehaviour.PositionAndShoot(player, ball, goal); } else { AIBasicBehaviour.Sprint(player, 1); AIGlobalBehaviour.PositionAndShoot(player, ball, goal); } }
public static void MoveForward(GameObject player, float x, float y) { /* x and y are not the position of the object but the vector towards it. */ AIBasicBehaviour.GetController(player).playerController.playerMovement.MovePlayer(x, y); }
public static void LookAt(GameObject player, float x, float y) { AIBasicBehaviour.GetController(player).playerRotator.Rotate(x - player.transform.position.x, y - player.transform.position.y); }