void UpdateState() { switch (state) { case BotState.IDLE: if (Input.GetMouseButtonDown(0)) { Ray r = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(r, out hit)) { agent.SetDestination(hit.point); } } if (Input.GetMouseButtonDown(1)) { Ray r = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(r, out hit)) { Vector3 dir = hit.point - transform.position; bot.ShootInDirection(dir); } } // debug pour afficher si on voit notre drapeau et éventuellement son porteur bool sees_flag = bot.CanSeeObject(team.team_flag.gameObject); bool sees_carrier = false; int carrier_ID = master.GetFlagCarrierID(team.team_ID); if (carrier_ID != -1 && bot.CanSeeObject(master.GetBotFromID(carrier_ID))) { sees_carrier = true; } GizmosService.Text("flag ? " + sees_flag, transform.position - Vector3.right * 4); GizmosService.Text("carrier ? " + sees_carrier, transform.position - Vector3.right * 8); GizmosService.Cone(transform.position, transform.forward, transform.up, 100, 70); break; } }
void Update() { GizmosService.Text(state.ToString(), transform.position + Vector3.forward, 0.01f, Color.white); score = master.GetScore(bot.team_ID); // récupère le score GizmosService.Cone(transform.position, transform.forward, Vector3.up, 10, 70); // --> affiche le cône de vision //LetGo(); // --> CheckFlag(); // --> si je porte le drapeau, passe en mode ReturnHomeWithFlag UpdateState(); // --> exécute les instructions de chaque état //SearchForFlag(); // --> chercher le drapeau allié si je ne le vois pas CheckEnnemy(); // --> permet de tier sur les ennemis if (bot.is_dead == true) { SwitchState(BotState.IDLE); // --> si je suis mort, passe dans l'état Idle team.SendMessageToTeam("ImDead"); // --> si je veux envoyer un message à ma mort } }
public static GizmosService instance() { if (_instance == null) { GameObject o = GameObject.Find("GizmosService"); if (o == null) { o = new GameObject("GizmosService"); _instance = o.AddComponent <GizmosService>(); } else { _instance = o.GetComponent <GizmosService>(); } } return(_instance); }
public void ShootNow(GameObject target, Vector3 targetPos, Vector3 targetDir, float targetSpeed) { if (targetSpeed > maxSpeedNoticed) { maxSpeedNoticed = targetSpeed; } Vector3 aimedPos = targetPos; Vector3 shootDir = aimedPos - transform.position; if (targetPos != targetPos && (targetPos - targetPos).magnitude > 0.004f && Vector3.Angle(transform.forward, targetDir) % 180 > 5) { shootDir += Vector3.Distance(aimedPos, transform.position) * targetDir * targetSpeed / 22; } Ray ray = new Ray(transform.position, shootDir); int layerMask = 1 << 0; RaycastHit hit; if (!Physics.SphereCast(ray, 0.75f, out hit, Vector3.Distance(transform.position, aimedPos), layerMask, QueryTriggerInteraction.Ignore) || (shootDir == aimedPos - transform.position && Vector3.Distance(transform.position, targetPos) <= 15)) { if (Vector3.Angle(transform.forward, shootDir) <= 70 && targetSpeed >= maxSpeedNoticed) { bot.ShootInDirection(shootDir); GizmosService.Line(transform.position, aimedPos, 3); Debug.Log("Shot called by ally"); } } }
private void Feedbacks() { GizmosService.Text(state.ToString() + bot.can_shoot.ToString(), transform.position + Vector3.forward, 0.01f, Color.white); GizmosService.Cone(transform.position, transform.forward, Vector3.up, 10, 70); }
IEnumerator Shoot(GameObject target) { Vector3 targetPos = target.transform.position; /*if (Vector3.Distance (targetPos, transform.position) <= 10) { * * Vector3 shootDir = targetPos - transform.position; * GizmosService.Line (transform.position, targetPos, 2); * * * /*Ray ray = new Ray (transform.position, shootDir); * * int layerMask = ~LayerMask.GetMask(new string[]{ "TeamRed", "TeamBlue", "Rocket", "Flag" }); * /*if (team.team_ID == 0) * layerMask = ~(1 << 9); * else * layerMask = ~(1 << 8);*//* * * if (!Physics.SphereCast(ray, 0.7f, Vector3.Distance(transform.position, targetPos), layerMask)) {*//* * * * if (Vector3.Angle(transform.forward, shootDir) <= 70) * bot.ShootInDirection (shootDir); * * * //} * * * }*/ float timeBetweenShots = 0; yield return(null); timeBetweenShots += Time.deltaTime; if (bot.CanSeeObject(target) && bot.can_shoot) { Vector3 newTargetPos = target.transform.position; Vector3 targetDir = (newTargetPos - targetPos).normalized; Vector3 aimedPos = newTargetPos; Vector3 shootDir = aimedPos - transform.position; if (newTargetPos != targetPos && (newTargetPos - targetPos).magnitude > 0.004f && Vector3.Angle(transform.forward, targetDir) % 180 > 5 /*Vector3.Distance (transform.position, newTargetPos) > 8*/) { //aimedPos = newTargetPos + targetDir * Time.deltaTime * 26 * Vector3.Distance(transform.position, newTargetPos + targetDir * Time.deltaTime * 5); //aimedPos = newTargetPos + targetDir * Time.deltaTime * 30f * Vector3.Distance(transform.position, newTargetPos /*+ targetDir * Time.deltaTime * 1.2f*/) * 0.95f; shootDir += Vector3.Distance(aimedPos, transform.position) * targetDir * Vector3.Distance(newTargetPos, targetPos) / timeBetweenShots /*Time.deltaTime /* * 0.048*/ / 22; } //shootDir = aimedPos - transform.position; Ray ray = new Ray(transform.position, shootDir); //int layerMask = LayerMask.GetMask(new string[]{ "TeamRed", "TeamBlue", "Rocket", "Flag" }); //layerMask = ~layerMask; int layerMask = 1 << 0; /*if (team.team_ID == 0) * layerMask = ~(1 << 9); * else * layerMask = ~(1 << 8);*/ RaycastHit hit; if (!Physics.SphereCast(ray, 0.75f, out hit, Vector3.Distance(transform.position, aimedPos), layerMask, QueryTriggerInteraction.Ignore) || (shootDir == aimedPos - transform.position && Vector3.Distance(transform.position, newTargetPos) <= 15) /*Vector3.Angle(transform.forward, targetDir) % 180 < 15 || Vector3.Distance (transform.position, newTargetPos) < 8*/) { if (Vector3.Angle(transform.forward, shootDir) <= 70) { bot.ShootInDirection(shootDir); GizmosService.Line(transform.position, aimedPos, 3); } } else if (hit.collider.gameObject == target) { Debug.Log("WTF MAN ???"); if (Vector3.Angle(transform.forward, shootDir) <= 70) { bot.ShootInDirection(shootDir); } } //GizmosService.Line (transform.position, aimedPos, 0.5f); foreach (BotBehaviourDeusVult ally in teamController.teamMates) { if (ally != behaviour && !ally.bot.is_dead && ally.bot.can_shoot) { //ally.ShootNow (target, newTargetPos, targetDir, Vector3.Distance (newTargetPos, targetPos) / timeBetweenShots); } } } shooter = null; }
void Update() { GizmosService.Cone(transform.position, transform.forward, Vector3.up, 10, 70); if (comportement != "Camping" && comportement != "Go to the camping") { CampingChange(); } detection(); IsTheFlagInOurBase(); IsThereAnAlly(); ChangeYourComportement(); switch (comportement) { case "Flag": // va directement vers le drapeau enemi agent.SetDestination(team.enemy_base.position); if (bot.team_ID == 0) { if (master.flag_carriers [1] != -1) { if (toKill != null) { comportement = "Go to enemies"; } } } else if (bot.team_ID == 1) { if (master.flag_carriers [0] != -1) { if (toKill != null) { comportement = "Go to enemies"; } } } else if (toKill != null) { comportement = "Hit and run"; } break; case "Hit and run": //continue à aller vers le drapeau enemi tout en tirant sur les adversaires agent.SetDestination(team.enemy_base.position); shoot(); if (toKill == null) { comportement = "Flag"; } if (IsThereAnAlly()) { enterBattle = false; comportement = "Battle"; } break; case "Battle": // si il a un allié avec lui, rentre en mode combat, il se décale sur les cotés et tir if (!enterBattle) { positionBattle = transform.position; enterBattle = true; } shoot(); if (enterBattle) { if (toKill != null && Mathf.Abs(toKill.transform.position.x - transform.position.x) > Mathf.Abs(toKill.transform.position.z - transform.position.z)) { if (minusBattle) { agent.SetDestination(new Vector3(positionBattle.x - 8, 0, positionBattle.z)); if (Vector3.Distance(new Vector3(positionBattle.x - 8, 0, positionBattle.z), transform.position) < 1) { minusBattle = false; } } else if (!minusBattle) { agent.SetDestination(new Vector3(positionBattle.x + 8, 0, positionBattle.z)); if (Vector3.Distance(new Vector3(positionBattle.x + 8, 0, positionBattle.z), transform.position) < 1) { minusBattle = true; } } } else { if (minusBattle) { agent.SetDestination(new Vector3(positionBattle.x, 0, positionBattle.z - 8)); if (Vector3.Distance(new Vector3(positionBattle.x, 0, positionBattle.z - 8), transform.position) < 1) { minusBattle = false; } } else if (!minusBattle) { agent.SetDestination(new Vector3(positionBattle.x, 0, positionBattle.z + 8)); if (Vector3.Distance(new Vector3(positionBattle.x, 0, positionBattle.z + 8), transform.position) < 1) { minusBattle = true; } } } } if (!IsThereAnAlly()) { //si il n'a plus d'allié, va au drapeau enemi comportement = "Hit and run"; } if (toKill == null) { //si il a encore un allié va a la dernière position occupé par l'enemi comportement = "Poursuit enemi"; } break; case "Poursuit enemi": // va a la dernière position occupé par la cible if (toKill == null) { agent.SetDestination(lastPosition); if (transform.position == lastPosition) { comportement = "Flag"; } } if (toKill != null) { //si il retrouve la cible, retourne en mode combat enterBattle = false; comportement = "Battle"; } break; case "Take their flag": // Ramasse le drapeau enemi si il est a terre agent.SetDestination(WhereIsTheirFlag); shoot(); if (!TheirFlagIsDown) { comportement = "Flag"; } break; case "Save our flag": // ramasse notre drapeau si il est a terre et pas sur notre base agent.SetDestination(WhereIsOurFlag); shoot(); if (!OurFlagIsDown) { comportement = "Flag"; } break; case "Protect": //suit le porteur de drapeau allié shoot(); if (bot.team_ID == 0) { if (master.flag_carriers [1] == -1) { comportement = "Flag"; } else { agent.SetDestination(GameObject.Find("bot-" + master.flag_carriers [1] + "_team-" + bot.team_ID).transform.position); } } else if (bot.team_ID == 1) { if (master.flag_carriers [0] == -1) { comportement = "Flag"; } else { agent.SetDestination(GameObject.Find("bot-" + master.flag_carriers [0] + "_team-" + bot.team_ID).transform.position); } } break; case "SearchBegin": //cherche l'endroit le plus proche parmi un tableau de position float near = 9999999; for (int i = 0; i < positionSearch.Length; i++) { if (Vector3.Distance(positionSearch [i], transform.position) < near) { near = Vector3.Distance(positionSearch [i], transform.position); nearest = i; } } comportement = "Search"; break; case "Search": // se déplace de point en points jusqu'a trouver quelquechose agent.SetDestination(positionSearch [nearest]); if (bot.team_ID == 0) { if (Vector3.Distance(positionSearch [nearest], transform.position) < 5f) { nearest++; if (nearest >= positionSearch.Length) { nearest = 0; } } } if (bot.team_ID == 1) { if (Vector3.Distance(positionSearch [nearest], transform.position) < 5f) { nearest--; if (nearest <= -1) { nearest = positionSearch.Length - 1; } } } if (toKill != null) { comportement = "Go to enemies"; } break; case "Go to enemies": // se raproche des enemis si il est top loin shoot(); if (Vector3.Distance(lastPosition, transform.position) > 25f) { agent.SetDestination(lastPosition); } else { enterBattle = false; comportement = "Battle"; } break; case "Go to the camping": float nearCamping = 9999999; /* * if (Vector3.Distance (transform.position, master.spawn_points [team.team_ID].transform.position) > 15f) { * if (team.team_ID == 0) { * for (int i = 0; i < 4; i++) { * Debug.Log ("Camping 2"); * if (Vector3.Distance (positionCampingBottom [i], transform.position) < nearCamping) { * Debug.Log ("Camping 3"); * near = Vector3.Distance (positionCampingBottom [i], transform.position); * nearestCamping = i; * } * } * } else if (team.team_ID == 1) { * for (int i = 0; i < positionCampingTop.Length; i++) { * if (Vector3.Distance (positionCampingTop [i], transform.position) < nearCamping) { * near = Vector3.Distance (positionCampingTop [i], transform.position); * nearestCamping = i; * } * } * } * } else { */ nearestCamping = 0; //} Debug.Log(comportement); clampRotate = false; comportement = "Camping"; Debug.Log(comportement); break; case "Camping": Debug.Log(nearestCamping); if (nearestCamping < positionCampingTop.Length) { if (team.team_ID == 0) { agent.SetDestination(positionCampingBottom [nearestCamping]); } else if (team.team_ID == 1) { agent.SetDestination(positionCampingTop [nearestCamping]); } } if (bot.team_ID == 0) { if (nearestCamping < positionCampingBottom.Length && Mathf.Abs(Vector3.Distance(positionCampingBottom [nearestCamping], bot.transform.position)) < 3f) { nearestCamping++; } } else if (bot.team_ID == 1) { if (nearestCamping < positionCampingTop.Length && Mathf.Abs(Vector3.Distance(positionCampingTop [nearestCamping], bot.transform.position)) < 3f) { nearestCamping++; } } if (nearestCamping >= positionCampingTop.Length && !clampRotate) { agent.enabled = false; bot.transform.localEulerAngles = new Vector3(0, Mathf.Round(bot.transform.localEulerAngles.y), 0); clampRotate = true; agent.enabled = true; } shoot(); break; case "Go to base": // seul le porteur de drapeau peut entrer dans cet état, il retourne a sa base agent.SetDestination(team.team_base.position); shoot(); if (bot.team_ID == 0) { if (master.flag_carriers [1] != bot.ID) { comportement = "Flag"; } } else if (bot.team_ID == 1) { if (master.flag_carriers [0] != bot.ID) { comportement = "Flag"; } } break; } lastPosition1FrameAgo = lastPosition; toKill1FrameAgo = toKill; }
void Update() { GizmosService.Cone(transform.position, bot_object.transform.forward, Vector3.up, 10, 70); // --> affiche le cône de vision //UpdateState(); //Update Perception ThisIsWhatISee(); // STRATEGIE ATTACK FLAG if (teamController.teamStrategy == TeamBehaviourDeusVult.TeamStrategy.AttackFlag) { if ((state != BotState.DefenseProtectBase || state != BotState.DefensePlantATent) && master.GetFlagCarrierID((teamId + 1) % 2) == bot.ID) { if (state == BotState.DefenseProtectBase) { teamController.flagDefenser = teamController.GetCloser(team.team_base.position); teamController.flagDefenser.GetComponent <BotBehaviourDeusVult> ().SwitchState(BotBehaviourDeusVult.BotState.DefenseProtectBase); } else if (state == BotState.DefensePlantATent) { Vector3 posCamping = Vector3.zero; if (teamId == 1) { posCamping = teamController.posCamping1; } else { posCamping = teamController.posCamping0; } teamController.sideCamper = teamController.GetCloser(posCamping); teamController.sideCamper.GetComponent <BotBehaviourDeusVult> ().SwitchState(BotBehaviourDeusVult.BotState.DefensePlantATent); } SwitchState(BotState.AttackBringFlagBack); } if (state != BotState.DefenseProtectBase && state != BotState.DefensePlantATent) { if (!teamController.weStoleTheirFlag) { SwitchState(BotState.AttackGetFlag); } else if (teamController.weStoleTheirFlag) { if (master.GetFlagCarrierID((teamId + 1) % 2) == bot.ID) { teamController.flagCarrier = this; SwitchState(BotState.AttackBringFlagBack); } else { SwitchState(BotState.AttackHelpFlagGetter); } Debug.Log(master.GetFlagCarrierID((teamId + 1) % 2) + ", " + bot.ID + ", " + teamId); } } GetComponent <DeusVultStrategyAttackFlag> ().Act(); } else if (teamController.teamStrategy == TeamBehaviourDeusVult.TeamStrategy.Defense) { if ((state != BotState.DefenseProtectBase || state != BotState.DefensePlantATent) && master.GetFlagCarrierID((teamId + 1) % 2) == bot.ID) { if (state == BotState.DefenseProtectBase) { teamController.flagDefenser = teamController.GetCloser(team.team_base.position); teamController.flagDefenser.GetComponent <BotBehaviourDeusVult> ().SwitchState(BotBehaviourDeusVult.BotState.DefenseProtectBase); } else if (state == BotState.DefensePlantATent) { Vector3 posCamping = Vector3.zero; if (teamId == 1) { posCamping = teamController.posCamping1; } else { posCamping = teamController.posCamping0; } teamController.sideCamper = teamController.GetCloser(posCamping); teamController.sideCamper.GetComponent <BotBehaviourDeusVult> ().SwitchState(BotBehaviourDeusVult.BotState.DefensePlantATent); } SwitchState(BotState.AttackBringFlagBack); } if (state != BotState.DefenseProtectBase && state != BotState.DefensePlantATent) { if (!teamController.weStoleTheirFlag) { SwitchState(BotState.AttackGetFlag); } else if (teamController.weStoleTheirFlag) { if (master.GetFlagCarrierID((teamId + 1) % 2) == bot.ID) { teamController.flagCarrier = this; SwitchState(BotState.AttackBringFlagBack); } else { SwitchState(BotState.AttackHelpFlagGetter); } //Debug.Log (master.GetFlagCarrierID ((teamId + 1) % 2) + ", " + bot.ID +", " + teamId); } } GetComponent <DeusVultStrategyDefense> ().Act(); } else if (teamController.teamStrategy == TeamBehaviourDeusVult.TeamStrategy.Advanced) { if ((state != BotState.DefenseProtectBase || state != BotState.DefensePlantATent) && master.GetFlagCarrierID((teamId + 1) % 2) == bot.ID) { if (state == BotState.DefenseProtectBase) { teamController.flagDefenser = teamController.GetCloser(team.team_base.position); teamController.flagDefenser.GetComponent <BotBehaviourDeusVult> ().SwitchState(BotBehaviourDeusVult.BotState.DefenseProtectBase); } else if (state == BotState.DefensePlantATent) { Vector3 posCamping = Vector3.zero; if (teamId == 1) { posCamping = teamController.posCamping1; } else { posCamping = teamController.posCamping0; } teamController.sideCamper = teamController.GetCloser(posCamping); teamController.sideCamper.GetComponent <BotBehaviourDeusVult> ().SwitchState(BotBehaviourDeusVult.BotState.DefensePlantATent); } SwitchState(BotState.AttackBringFlagBack); } if (state != BotState.DefenseProtectBase && state != BotState.DefensePlantATent) { if (!teamController.weStoleTheirFlag) { SwitchState(BotState.AttackGetFlag); } else if (teamController.weStoleTheirFlag) { if (master.GetFlagCarrierID((teamId + 1) % 2) == bot.ID) { teamController.flagCarrier = this; SwitchState(BotState.AttackBringFlagBack); } else { SwitchState(BotState.AttackHelpFlagGetter); } //Debug.Log (master.GetFlagCarrierID ((teamId + 1) % 2) + ", " + bot.ID +", " + teamId); } } GetComponent <DeusVultStrategyAdvanced> ().Act(); } //GizmosService.Cone(bot_object.transform.position, bot_object.transform.forward, Vector3.up, 10, 70); }