/** *@funtion CalculateMove *@brief Calcula un vector de velocidad dependiendo del comportamiento *@param Player jugador al que le corresponde el comportamiento *@param context Lista de transforms del equipo *@param team Equipo al que pertenece **/ public override Vector3 CalculateMove(SPlayer Player, List <Transform> context, STeam team) { Vector3 centerOffset; centerOffset.x = center.x - Player.transform.position.x; centerOffset.z = center.z - Player.transform.position.z; centerOffset.y = 0f; float x = centerOffset.x / Xlimit; float z = centerOffset.z / Zlimit; if (x < 0.9f && z < 0.95f) { //Debug.Log("adentro de limites"); return(Vector3.zero); } else if (x < 0.95f && z > 0.95f) { //Debug.Log("fuera de limites"); return(centerOffset * z * z); } else if (x > 0.95f && z < 0.95f) { //Debug.Log("fuera de limites"); return(centerOffset * x * x); } //Debug.Log("fuera de limites"); return(centerOffset * x * z); }
//----------------------------------------------- // Use this for initialization void Start() { if (this.transform.name == "GoalKeeper_Local") { TeamName = "Local"; playerTeam = GameObject.Find("Local").GetComponent <STeam>(); opponentTeam = GameObject.Find("Visit").GetComponent <STeam>(); Opponents = opponentTeam.Visitors; Teammates = playerTeam.Locals; } else { TeamName = "Visit"; playerTeam = GameObject.Find("Visit").GetComponent <STeam>(); opponentTeam = GameObject.Find("Local").GetComponent <STeam>(); Opponents = opponentTeam.Locals; Teammates = playerTeam.Visitors; } scorerTime = GameObject.FindObjectOfType(typeof(ScorerTimeHUD)) as ScorerTimeHUD; listPosicion = new List <string>(); initial_Position = transform.position; state = GoalKeeper_State.RESTING; GetComponent <Animation>()["running"].speed = 1.0f; GetComponent <Animation>()["goalkeeper_clear_right_up"].speed = 1.0f; GetComponent <Animation>()["goalkeeper_clear_left_up"].speed = 1.0f; GetComponent <Animation>()["goalkeeper_clear_right_down"].speed = 1.0f; GetComponent <Animation>()["goalkeeper_clear_left_down"].speed = 1.0f; }
public Vector3 CalculateMove(SPlayer Player, List<Transform> context, STeam team) { //handle data mismatch if (weights.Length != behaviors.Length) { Debug.LogError("Data mismatch in " + name, this); return Vector3.zero; } //set up move Vector3 move = Vector3.zero; //iterate through behaviors for (int i = 0; i < behaviors.Length; i++) { Vector3 partialMove = behaviors[i].CalculateMove(Player, context, team) * weights[i]; if (partialMove != Vector3.zero) { if (partialMove.sqrMagnitude > weights[i] * weights[i]) { partialMove.Normalize(); partialMove *= weights[i]; } move += partialMove; } } return move; }
/** *@funtion CalculateMove *@brief Considera los comportamientos y sus respectivos pesos y calcula el movimiento del jugador *@param context contexto del jugador, en este caso equipo y obstaculos *@param team equipo al que pertenece **/ public Vector3 CalculateMove(SPlayer Player, List <Transform> context, STeam team) { //handle data mismatch if (weights.Count != sbehaviors.Length + cbehaviors.Length) { Debug.LogError("Data mismatch in " + name, this); return(Vector3.zero); } //set up move Vector3 move = Vector3.zero; //iterate through sbehaviors for (int i = 0; i < sbehaviors.Length; i++) { Vector3 partialMove = Vector3.zero; if (weights[wkeys[i]] != 0) { partialMove = sbehaviors[i].CalculateMove(Player, context, team) * weights[wkeys[i]]; } if (partialMove != Vector3.zero) { if (partialMove.sqrMagnitude > weights[wkeys[i]] * weights[wkeys[i]]) { partialMove.Normalize(); partialMove *= weights[wkeys[i]]; } move += partialMove; } } for (int i = 0; i < cbehaviors.Length; i++) { Vector3 partialMove = Vector3.zero; if (weights[wkeys[i + sbehaviors.Length]] != 0) { partialMove = cbehaviors[i].CalculateMove(Player, context, team, opponentTeam, sphere, (TeamName == "Local") ? GoalLocal : GoalVisit) * weights[wkeys[i + sbehaviors.Length]]; } if (partialMove != Vector3.zero) { if (partialMove.sqrMagnitude > weights[wkeys[i + sbehaviors.Length]] * weights[wkeys[i + sbehaviors.Length]]) { partialMove.Normalize(); partialMove *= weights[wkeys[i + sbehaviors.Length]]; } //Debug.Log(i+sbehaviors.Length); move += partialMove; } } return(move); }
/** *@funtion CalculateMove *@brief Calcula un vector de velocidad dependiendo del comportamiento *@param Player jugador al que le corresponde el comportamiento *@param context Lista de transforms del equipo *@param team Equipo al que pertenece **/ public override Vector3 CalculateMove(SPlayer Player, List <Transform> context, STeam team) { Vector3 centerOffset; centerOffset.x = Player.center.transform.position.x - Player.transform.position.x; centerOffset.z = Player.center.transform.position.z - Player.transform.position.z; centerOffset.y = 0f; return(centerOffset.normalized); }
/** *@funtion CalculateMove *@brief Calcula un vector de velocidad dependiendo del comportamiento *@param Player jugador al que le corresponde el comportamiento *@param context Lista de transforms del equipo *@param team Equipo al que pertenece *@param Oteam Equipo oponente *@param Ball Balon del juego *@param Goal Cancha objetivo **/ public override Vector3 CalculateMove(SPlayer Player, List <Transform> context, STeam team, STeam Oteam, Sphere Ball, GameObject Goal) { Vector3 centerOffset; centerOffset.x = Goal.transform.position.x - Player.transform.position.x; centerOffset.z = Goal.transform.position.z - Player.transform.position.z; centerOffset.y = 0f; return(centerOffset.normalized); }
public override Vector3 CalculateMove(SPlayer Player, List <Transform> context, STeam team) { //if no neighbors, maintain current alignment if (context.Count == 0) { return(Player.transform.up); } //add all points together and average Vector3 alignmentMove = Vector3.zero; //List<Transform> filteredContext = (filter == null) ? context : filter.Filter(Player, context); foreach (Transform item in context) { alignmentMove += item.transform.up; } alignmentMove /= context.Count; return(alignmentMove); }
public override Vector3 CalculateMove(SPlayer Player, List <Transform> context, STeam team, STeam Oteam, Sphere Ball, GameObject Goal) { Vector3 centerOffset; centerOffset.y = 0f; if (Player.playerTeam.name == "Local") { centerOffset.x = team.local_init_position[Player.PlayerId].x - Player.transform.position.x; centerOffset.z = team.local_init_position[Player.PlayerId].z - Player.transform.position.z; } else { centerOffset.x = team.visit_init_position[Player.PlayerId].x - Player.transform.position.x; centerOffset.z = team.visit_init_position[Player.PlayerId].z - Player.transform.position.z; } if (centerOffset.magnitude < 0.4f)//FIXME: esto se puede ajustar a un mejor valor { return(Vector3.zero); } return(centerOffset.normalized); }
/** *@funtion CalculateMove *@brief Calcula un vector de velocidad dependiendo del comportamiento *@param Player jugador al que le corresponde el comportamiento *@param context Lista de transforms del equipo *@param team Equipo al que pertenece **/ public override Vector3 CalculateMove(SPlayer Player, List <Transform> context, STeam team) { //if no neighbors, maintain current alignment if (context.Count == 0) { return(Player.transform.up); } //add all points together and average Vector3 cohesionMove = Vector3.zero; //List<Transform> filteredContext = (filter == null) ? context : filter.Filter(Player, context); foreach (Transform item in context) { cohesionMove += item.position; } cohesionMove /= context.Count; cohesionMove -= Player.transform.position; cohesionMove = Vector3.SmoothDamp(Player.transform.up, cohesionMove, ref currentVelocity, agentSmoothTime); return(cohesionMove); }
public override Vector3 CalculateMove(SPlayer Player, List <Transform> context, STeam team, STeam Oteam, Sphere Ball, GameObject Goal) { Vector3 centerOffset; centerOffset.y = 0f; if (Player.playerTeam.name == "Local") { centerOffset.x = team.local_position[Player.PlayerId].x - Player.transform.position.x; centerOffset.z = team.local_position[Player.PlayerId].z - Player.transform.position.z; } else { centerOffset.x = team.visit_position[Player.PlayerId].x - Player.transform.position.x; centerOffset.z = team.visit_position[Player.PlayerId].z - Player.transform.position.z; } if (centerOffset.magnitude < 2f) { centerOffset = Vector3.zero; } return(centerOffset.normalized); }
/** *@funtion CalculateMove *@brief Calcula un vector de velocidad dependiendo del comportamiento *@param Player jugador al que le corresponde el comportamiento *@param context Lista de transforms del equipo *@param team Equipo al que pertenece **/ public override Vector3 CalculateMove(SPlayer Player, List <Transform> context, STeam team) { //if no neighbors, maintain current alignment if (context.Count == 0) { return(Player.transform.up); } //add all points together and average Vector3 avoidanceMove = Vector3.zero; int nAvoid = 0; float SquareAvoidanceRadius = 4f; foreach (Transform item in context) { if (Vector3.SqrMagnitude(item.position - Player.transform.position) < SquareAvoidanceRadius) { //Debug.Log(context.Count); nAvoid++; avoidanceMove += (Player.transform.position - item.position); } } if (nAvoid > 0) { avoidanceMove /= nAvoid; } else { return(Vector3.zero); } avoidanceMove = Vector3.SmoothDamp(Player.transform.up, avoidanceMove, ref currentVelocity, agentSmoothTime); avoidanceMove.x *= 10; avoidanceMove.z /= 3; return(avoidanceMove); }
/** *@funtion CalculateMove *@brief Calcula un vector de velocidad dependiendo del comportamiento *@param Player jugador al que le corresponde el comportamiento *@param context Lista de transforms del equipo *@param team Equipo al que pertenece *@param Oteam Equipo oponente *@param Ball Balon del juego *@param Goal Cancha objetivo **/ public override Vector3 CalculateMove(SPlayer Player, List <Transform> context, STeam team, STeam Oteam, Sphere Ball, GameObject Goal) { Player.Walking = false; GoalMod.z = Goal.transform.position.z; GoalMod.y = 0f; if (Player.playerTeam.name == "Local") { GoalMod.x = team.local_position[Player.PlayerId].x; } else { GoalMod.x = team.visit_position[Player.PlayerId].x; } slowDown = false; centerOffset.x = 0f; //La posicion en x realmente no importa if (Ball.owner == null) { return(Vector3.zero); } centerOffset.y = 0f; centerOffset.z = Player.transform.InverseTransformPoint(Ball.owner.transform.position).z; // if (!Player.bFirstHalf) { centerOffset = -centerOffset; } if (Player.type == SPlayer.TypePlayer.DEFENDER)//Si es defensor empezar a seguir cuando la distancia llega a 40 { if (centerOffset.magnitude < 40f) { slowDown = true; } } if (Player.type == SPlayer.TypePlayer.MIDDLER && centerOffset.magnitude < 20f)//Si es mediocampista empezar a seguir cuando la distancia llega a 15 { slowDown = true; } if (Player.type == SPlayer.TypePlayer.ATTACKER && centerOffset.magnitude < 10f) { slowDown = true; } if (slowDown) { Player.Walking = true; centerOffset.x = GoalMod.x - Player.transform.position.x; centerOffset.z = GoalMod.z - Player.transform.position.z; centerOffset /= 3; return(centerOffset.normalized); } //centerOffset = centerOffset.normalized*Player.MAXSPEED; //centerOffset = Vector3.SmoothDamp(Player.transform.forward, centerOffset, ref currentVelocity, agentSmoothTime); //Debug.Log(centerOffset.normalized,this); return(centerOffset.normalized); }
public override Vector3 CalculateMove(SPlayer Player, List <Transform> context, STeam team, STeam Oteam, Sphere Ball, GameObject Goal) { Vector3 centerOffset; centerOffset.y = 0f; if (Player.bFirstHalf) //ataque en derecha { if (Ball.OutPosition.z < 0) //Defensa de corner { centerOffset.x = -team.defend_corner_position[Player.PlayerId].x - Player.transform.position.x; //negativa porque se define en la derecha centerOffset.z = -team.defend_corner_position[Player.PlayerId].z - Player.transform.position.z; } else { if (Ball.OutPosition.x < 0 && Player.PlayerId == 8) { centerOffset.x = -50 - Player.transform.position.x; centerOffset.z = 57 - Player.transform.position.z; } else if (Ball.OutPosition.x > 0 && Player.PlayerId == 9) { centerOffset.x = 38.5f - Player.transform.position.x; centerOffset.z = 57 - Player.transform.position.z; } else { centerOffset.x = team.attack_corner_position[Player.PlayerId].x - Player.transform.position.x; centerOffset.z = team.attack_corner_position[Player.PlayerId].z - Player.transform.position.z; } } } else { if (Ball.OutPosition.z < 0) //ataque en corner { if (Ball.OutPosition.x < 0 && Player.PlayerId == 8) { centerOffset.x = -38.5f - Player.transform.position.x; centerOffset.z = -57 - Player.transform.position.z; } else if (Ball.OutPosition.x > 0 && Player.PlayerId == 9) { centerOffset.x = 38.5f - Player.transform.position.x; centerOffset.z = -57 - Player.transform.position.z; } else { centerOffset.x = -team.attack_corner_position[Player.PlayerId].x - Player.transform.position.x; centerOffset.z = -team.attack_corner_position[Player.PlayerId].z - Player.transform.position.z; //Negativa por que se define a la derecha } } else { centerOffset.x = team.defend_corner_position[Player.PlayerId].x - Player.transform.position.x; centerOffset.z = team.defend_corner_position[Player.PlayerId].z - Player.transform.position.z; } } if (centerOffset.magnitude < 2f) { centerOffset = Vector3.zero; } return(centerOffset.normalized); }
/** *@funtion Initialize *@brief Crea las variables iniciales de comportamiento y nodos *@param **/ public void Initialize() { playerTeam = transform.parent.GetComponent <STeam>(); sbehaviors[0] = ScriptableObject.CreateInstance("Alignment") as Sbehavior; weights.Add("Alignment", 0.1f); wkeys[0] = "Alignment"; sbehaviors[1] = ScriptableObject.CreateInstance("Avoidance") as Sbehavior; weights.Add("Avoidance", 0.1f); wkeys[1] = "Avoidance"; sbehaviors[2] = ScriptableObject.CreateInstance("Cohesion") as Sbehavior; weights.Add("Cohesion", 0.1f); wkeys[2] = "Cohesion"; sbehaviors[3] = ScriptableObject.CreateInstance("StayInStadium") as Sbehavior; weights.Add("StayInStadium", 0.1f); wkeys[3] = "StayInStadium"; sbehaviors[4] = ScriptableObject.CreateInstance("GoCenter") as Sbehavior; weights.Add("GoCenter", 0.1f); wkeys[4] = "GoCenter"; sbehaviors[5] = ScriptableObject.CreateInstance("TackleMove") as Sbehavior; weights.Add("TackleMove", 0.1f); wkeys[5] = "TackleMove"; cbehaviors[0] = ScriptableObject.CreateInstance("FollowBall") as Cbehavior; weights.Add("FollowBall", 0.1f); wkeys[sbehaviors.Length] = "FollowBall"; cbehaviors[1] = ScriptableObject.CreateInstance("FollowGoal") as Cbehavior; weights.Add("FollowGoal", 0.1f); wkeys[sbehaviors.Length + 1] = "FollowGoal"; cbehaviors[2] = ScriptableObject.CreateInstance("ReturnDefault") as Cbehavior; weights.Add("ReturnDefault", 0.1f); wkeys[sbehaviors.Length + 2] = "ReturnDefault"; cbehaviors[3] = ScriptableObject.CreateInstance("ReturnInit") as Cbehavior; weights.Add("ReturnInit", 0.1f); wkeys[sbehaviors.Length + 3] = "ReturnInit"; cbehaviors[4] = ScriptableObject.CreateInstance("AvoidOpponents") as Cbehavior; weights.Add("AvoidOpponents", 0.1f); wkeys[sbehaviors.Length + 4] = "AvoidOpponents"; cbehaviors[5] = ScriptableObject.CreateInstance("FollowOwner") as Cbehavior; weights.Add("FollowOwner", 0.1f); wkeys[sbehaviors.Length + 5] = "FollowOwner"; cbehaviors[6] = ScriptableObject.CreateInstance("Defend") as Cbehavior; weights.Add("Defend", 0.1f); wkeys[sbehaviors.Length + 6] = "Defend"; cbehaviors[7] = ScriptableObject.CreateInstance("CornerSetup") as Cbehavior; weights.Add("CornerSetup", 0.1f); wkeys[sbehaviors.Length + 7] = "CornerSetup"; ///Inicialización de nodos KICK_OFFER_Node = new ActionNode(KICK_OFFER); CHECK_ATTACK_Node = new ActionNode(CHECK_ATTACK); GO_ORIGIN_Node = new ActionNode(GO_ORIGIN); CONTROLLING_Node = new ActionNode(CONTROLLING); PASSING_Node = new PublicNode(); SHOOTING_Node = new ActionNode(SHOOTING); MOVE_AUTOMATIC_ATTACK_Node = new ActionNode(MOVE_AUTOMATIC_ATTACK); MOVE_AUTOMATIC_DEFFEND_Node = new ActionNode(MOVE_AUTOMATIC_DEFFEND); ONE_STEP_BACK_Node = new ActionNode(ONE_STEP_BACK); STOLE_BALL_Node = new ActionNode(STOLE_BALL); PICK_BALL_Node = new ActionNode(PICK_BALL); CHANGE_DIRECTION_Node = new ActionNode(CHANGE_DIRECTION); CORNER_KICK_Node = new ActionNode(CORNER_KICK); ThrowIn_Node = new ActionNode(ThrowIn); TACKLE_Node = new ActionNode(TACKLE); Medio_Tiempo_Node = new ActionNode(Medio_Tiempo); Celebration_Node = new ActionNode(Celebration); LOOK_FOR_BALL_Node = new ActionNode(LOOK_FOR_BALL); Oclusion_Node = new ActionNode(Oclusion); //Behavior Tree Nodes //############################################################################### FootballMatch = new Inverter(KICK_OFFER_Node); //############################################################################### //public Sequence FootballMatch; Attack = new Sequence(new List <Node> { CHECK_ATTACK_Node, MOVE_AUTOMATIC_ATTACK_Node, //PASSING_Node, SHOOTING_Node, }); Deffend = new Sequence(new List <Node> { MOVE_AUTOMATIC_DEFFEND_Node, TACKLE_Node, STOLE_BALL_Node, }); RootNode = new Selector(new List <Node> { Oclusion_Node, FootballMatch, CORNER_KICK_Node, ThrowIn_Node, Attack, LOOK_FOR_BALL_Node, Deffend, }); TestRoot = new Selector(new List <Node> { FootballMatch, SHOOTING_Node, }); //Bools de control; ControlStates.Add("Kick_Offer", false); Ckeys.Add("Kick_Offer"); ControlStates.Add("Animate", true); Ckeys.Add("Animate"); ControlStates.Add("Passing", false); Ckeys.Add("Passing"); ControlStates.Add("OnArea", false); Ckeys.Add("OnArea"); ControlStates.Add("Tackling", false); Ckeys.Add("Tackling"); ControlStates.Add("StoleBall", false); Ckeys.Add("StoleBall"); ControlStates.Add("Shooting", false); Ckeys.Add("Shooting"); //Tiempos de espera ControlTimes.Add("Thinking", 0f); Tkeys.Add("Thinking"); ControlTimes.Add("Tackle", 0f); Tkeys.Add("Tackle"); ControlTimes.Add("Pass", 0f); Tkeys.Add("Pass"); ControlTimes.Add("Reanimate", 0f); Tkeys.Add("Reanimate"); }
// Start is called before the first frame update void Start() { inGame = FindObjectOfType <InGameState_Script>(); center = GameObject.Find("Center_Field").GetComponent <Transform>(); bFirstHalf = inGame.bFirstHalf; //Inicializacion de variables de comportamiento sbehaviors = new Sbehavior[6]; cbehaviors = new Cbehavior[8]; weights = new Dictionary <string, float>(); pweights = new float[sbehaviors.Length + cbehaviors.Length]; wkeys = new string[sbehaviors.Length + cbehaviors.Length]; ControlStates = new Dictionary <string, bool>(); Ckeys = new List <string>(); //FIXME: esto no tiene sentido ControlTimes = new Dictionary <string, float>(); Tkeys = new List <string>(); //FIXME: esto no tiene sentido //Inicializacion de variables de ambiente sphere = GameObject.Find("soccer_ball").GetComponent <Sphere>(); GoalLocal = GameObject.Find("GoalRight"); GoalVisit = GameObject.Find("GoalLeft"); if (this.transform.parent.name == "Local") { TeamName = "Local"; playerTeam = GameObject.Find("Local").GetComponent <STeam>(); opponentTeam = GameObject.Find("Visit").GetComponent <STeam>(); Opponents = opponentTeam.Visitors; Teammates = playerTeam.Locals; } else { TeamName = "Visit"; playerTeam = GameObject.Find("Visit").GetComponent <STeam>(); opponentTeam = GameObject.Find("Local").GetComponent <STeam>(); Opponents = opponentTeam.Locals; Teammates = playerTeam.Visitors; } Initialize(); playerCollider = GetComponent <Collider>(); GetComponentInChildren <SkinnedMeshRenderer>().material = Resources.Load("Materials/" + "player_texture_" + PlayerPrefs.GetString(transform.parent.name)) as Material; //Animaciones------------------------------------------------------------------------------------------------ GetComponent <Animation>()["jump_backwards_bucle"].speed = 1.5f; GetComponent <Animation>()["starting"].speed = 1.0f; GetComponent <Animation>()["starting_ball"].speed = 1.0f; GetComponent <Animation>()["running"].speed = 1.2f; GetComponent <Animation>()["running_ball"].speed = 1.0f; GetComponent <Animation>()["pass"].speed = 1.8f; GetComponent <Animation>()["rest"].speed = 1.0f; GetComponent <Animation>()["turn"].speed = 2f; GetComponent <Animation>()["tackle"].speed = 4.0f; GetComponent <Animation>()["fight"].speed = 1.2f; // para el movimiento de la cabeza de los jugadores GetComponent <Animation>().Play("rest"); }
// Use this for initialization void SetVariables() { //Debug.Log("Error de inicio"); center = GameObject.Find("Center_Field").GetComponent <Transform>(); sphere = GameObject.Find("soccer_ball").GetComponent <Sphere>(); //Buscar tiempo scorerTime = GameObject.Find("UI").GetComponentInChildren <ScorerTimeHUD>(); Local = GameObject.Find("Local").GetComponent <STeam>(); Visit = GameObject.Find("Visit").GetComponent <STeam>(); // search PLayers, opponents and goalkeepers keeper = GameObject.FindGameObjectWithTag("GoalKeeper"); keeper_oponent = GameObject.FindGameObjectWithTag("GoalKeeper_Oponent"); Locals = Local.Locals; Visitors = Visit.Visitors; //##########################Nodes############################ PLAYING_Node = new ActionNode(PLAYING); PREPARE_TO_KICK_OFF_Node = new ActionNode(PREPARE_TO_KICK_OFF); KICK_OFF_Node = new ActionNode(KICK_OFF); GOAL_Node = new ActionNode(GOAL); THROW_IN_Setup_Node = new ActionNode(THROW_IN_Setup); THROW_IN_DOING_Node = new ActionNode(THROW_IN_DOING); THROW_IN_DONE_Node = new ActionNode(THROW_IN_DONE); CORNER_Setup_Node = new ActionNode(CORNER_Setup); CORNER_DOING_Node = new ActionNode(CORNER_DOING); CORNER_DONE_Node = new ActionNode(CORNER_DONE); GOAL_KICK_Node = new ActionNode(GOAL_KICK); GOAL_KICK_RUNNING_Node = new ActionNode(GOAL_KICK_RUNNING); GOAL_KICK_KICKING_Node = new ActionNode(GOAL_KICK_KICKING); Medio_Tiempo_Node = new ActionNode(Medio_Tiempo); Cambio_Cancha_Node = new ActionNode(Cambio_Cancha); FIN_Node = new ActionNode(FIN); //##########################Custom_Nodes############################ CheckCornerSim_Node = new ActionNode(CheckCornerSim); CheckThrowInSim_Node = new ActionNode(CheckThrowInSim); CheckOclusionSim_Node = new ActionNode(CheckOclusionSim); PlayingNS_Node = new ActionNode(PlayingNS); Oclusion_Node = new ActionNode(Oclusion); //---------------------------Sequence----------------------- KickOff_Sequence = new Sequence(new List <Node> { PREPARE_TO_KICK_OFF_Node, KICK_OFF_Node, }); HalfTime_Secuence = new Sequence(new List <Node> { Medio_Tiempo_Node, Cambio_Cancha_Node, }); Corner_Sequence = new Sequence(new List <Node> { CORNER_Setup_Node, CORNER_DOING_Node, CORNER_DONE_Node, }); Throw_In_Sequence = new Sequence(new List <Node> { THROW_IN_Setup_Node, THROW_IN_DOING_Node, THROW_IN_DONE_Node }); FootballMatch = new Selector(new List <Node> { PLAYING_Node, Corner_Sequence, Throw_In_Sequence, GOAL_KICK_Node, GOAL_Node, }); RootNode = new Sequence(new List <Node> { KickOff_Sequence, FootballMatch, HalfTime_Secuence, }); CornerSim = new Sequence(new List <Node> { CheckCornerSim_Node, Corner_Sequence, PlayingNS_Node, }); ThrowInSim = new Sequence(new List <Node> { CheckThrowInSim_Node, Throw_In_Sequence, PlayingNS_Node, }); OclusionSim = new Sequence(new List <Node> { CheckOclusionSim_Node, }); CustomSim = new Selector(new List <Node> { CornerSim, ThrowInSim, OclusionSim, RootNode }); }
/** *@funtion CalculateMove *@brief Calcula un vector de velocidad dependiendo del comportamiento *@param Player jugador al que le corresponde el comportamiento *@param context Lista de transforms del equipo *@param team Equipo al que pertenece **/ public override Vector3 CalculateMove(SPlayer Player, List <Transform> context, STeam team) { return(Player.transform.forward.normalized); }
/** *@funtion CalculateMove *@brief Calcula un vector de velocidad dependiendo del comportamiento *@param Player jugador al que le corresponde el comportamiento *@param context Lista de transforms del equipo *@param team Equipo al que pertenece *@param Oteam Equipo oponente *@param Ball Balon del juego *@param Goal Cancha objetivo **/ public override Vector3 CalculateMove(SPlayer Player, List <Transform> context, STeam team, STeam Oteam, Sphere Ball, GameObject Goal) { //Debug.Log("Defending"); Vector3 centerOffset = Vector3.zero; //attacker = null; List <SPlayer> opponents; if (Ball.owner != null) { if (Player.type == SPlayer.TypePlayer.DEFENDER && Ball.owner.OnAreaCheck())//Fixme, no dejar a otros jugadores solos { centerOffset.y = 0f; centerOffset.x = Ball.owner.transform.position.x - Player.transform.position.x; centerOffset.z = Ball.owner.transform.position.z - Player.transform.position.z; attacker = Ball.owner; return(centerOffset.normalized); } } if (Player.bFirstHalf) { if (Player.transform.position.z > 0f) { AttackingSide = true; } else { AttackingSide = false; } offset = -3f; } else { if (Player.transform.position.z < 0f) { AttackingSide = true; } else { AttackingSide = false; } offset = 3f; } if (Player.TeamName == "Local") { opponents = Oteam.Visitors; } else { opponents = Oteam.Locals; } if (Timeb4changeAtt <= 0) { Timeb4changeAtt = 2f; Vector3 tempOffset = new Vector3(0, 10, 0); if (!AttackingSide) { //Debug.Log("Defendiendo"); for (int i = 0; i < opponents.Count; i++) { //Debug.Log(opponents[i].CheckAround(3)); if (opponents[i].CheckAround(3) <= 2) //Checks for other defenders near the attacker { TempValue = (opponents[i].transform.position - Player.transform.position).magnitude; if (opponents[i] == Ball.owner)//Prioridad al dueno del balon { TempValue /= 2; } if (opponents[i].PlayerId == Player.PlayerId) { TempValue /= 4; } if (TempValue < tempOffset.magnitude) { centerOffset.y = 0f; centerOffset.x = opponents[i].transform.position.x - Player.transform.position.x; centerOffset.z = opponents[i].transform.position.z - Player.transform.position.z; tempOffset = centerOffset; attacker = opponents[i]; } } } } //Debug.Log(attacker); if (centerOffset.magnitude == 0) { if (Player.playerTeam.name == "Local") { centerOffset.x = team.local_position[Player.PlayerId].x - Player.transform.position.x; centerOffset.z = team.local_position[Player.PlayerId].z - Player.transform.position.z; if (centerOffset.magnitude < 2f) { centerOffset = Vector3.zero; } } else { centerOffset.x = team.visit_position[Player.PlayerId].x - Player.transform.position.x; centerOffset.z = team.visit_position[Player.PlayerId].z - Player.transform.position.z; if (centerOffset.magnitude < 2f) { centerOffset = Vector3.zero; } } } } else { Timeb4changeAtt -= Time.deltaTime; if (attacker != null) { centerOffset.y = 0f; centerOffset.x = attacker.transform.position.x - Player.transform.position.x; centerOffset.z = attacker.transform.position.z - Player.transform.position.z + offset; } else { if (Player.playerTeam.name == "Local") { centerOffset.x = team.local_position[Player.PlayerId].x - Player.transform.position.x; centerOffset.z = team.local_position[Player.PlayerId].z - Player.transform.position.z; if (centerOffset.magnitude < 2f) { centerOffset = Vector3.zero; } } else { centerOffset.x = team.visit_position[Player.PlayerId].x - Player.transform.position.x; centerOffset.z = team.visit_position[Player.PlayerId].z - Player.transform.position.z; if (centerOffset.magnitude < 2f) { centerOffset = Vector3.zero; } } } } //Debug.Log(centerOffset,Player); return(centerOffset.normalized); }
/** *@funtion CalculateMove *@brief Calcula un vector de velocidad dependiendo del comportamiento *@param Player jugador al que le corresponde el comportamiento *@param context Lista de transforms del equipo *@param team Equipo al que pertenece *@param Oteam Equipo oponente *@param Ball Balon del juego *@param Goal Cancha objetivo **/ public override Vector3 CalculateMove(SPlayer Player, List <Transform> context, STeam team, STeam Oteam, Sphere Ball, GameObject Goal) { //add all points together and average Vector3 AvoidOpponents = Vector3.zero; int nAvoid = 0; List <SPlayer> temp; if (Player.transform.parent.name == "Local") { temp = Oteam.Visitors; } else { temp = Oteam.Locals; } float SquareAvoidanceRadius = 25; foreach (SPlayer item in temp) { if (Vector3.SqrMagnitude(item.transform.position - Player.transform.position) < SquareAvoidanceRadius) { nAvoid++; AvoidOpponents += (Player.transform.position - item.transform.position); } } if (nAvoid > 0) { AvoidOpponents /= nAvoid; } else { return(Player.transform.up); } float speedDivider = 20; if (Player.transform.parent.name == "Local") //Reduce el movimiento hacia atras { if (Player.bFirstHalf) { if (AvoidOpponents.z < 0) { AvoidOpponents.z = 0; } } else { if (AvoidOpponents.z > 0) { AvoidOpponents.z = 0; } } } else { if (!Player.bFirstHalf) { if (AvoidOpponents.z < 0) { AvoidOpponents.z = 0; } } else { if (AvoidOpponents.z > 0) { AvoidOpponents.z = 0; } } } AvoidOpponents.x *= 10; AvoidOpponents = Vector3.SmoothDamp(Player.transform.up, AvoidOpponents, ref currentVelocity, agentSmoothTime); return(AvoidOpponents); }
/** *@funtion CalculateMove *@brief Calcula un vector de velocidad dependiendo del comportamiento *@param Player jugador al que le corresponde el comportamiento *@param context Lista de transforms del equipo *@param team Equipo al que pertenece *@param Oteam Equipo oponente *@param Ball Balon del juego *@param Goal Cancha objetivo **/ public abstract Vector3 CalculateMove(SPlayer Player, List <Transform> context, STeam team, STeam Oteam, Sphere Ball, GameObject Goal);
/** *@funtion CalculateMove *@brief Calcula un vector de velocidad dependiendo del comportamiento *@param Player jugador al que le corresponde el comportamiento *@param context Lista de transforms del equipo *@param team Equipo al que pertenece **/ public abstract Vector3 CalculateMove(SPlayer Player, List <Transform> context, STeam team);