/** * 3.3.Poszukiwanie celu * -Gdy utracimy cel z zasięgu zmysłów, idziemy do jego ostatniej znanej pozycji. * -Po dojściu do niej przerywamy poszukiwania. * -Można w przyszłości zaimplementować inne rozwiązania * */ private void SearchTarget() { standByTimeElapsed += Time.deltaTime; if (Vector3.Distance(transform.position, lastTargetLocation) > destinationTolerence && standByTimeElapsed < searchTime) { navAgent.destination = lastTargetLocation; } else { standByTimeElapsed = 0; targetResolve = TargetResolveEnum.DONE; aiState = PatrolAI_States.STAND_BY; } }
/** * Inicjalizacja po utworzeniu. * */ void Start() { rightListMovement = true; targetResolve = TargetResolveEnum.DONE; lastTargetLocation = new Vector3(0, 0, 0); lastAgentLocationOnPath = new Vector3(0, 0, 0); if (patrolPoints == null) { patrolPoints = new List <Vector3>(); } patrolPointsIndex = 0; navAgent = GetComponent <NavMeshAgent>(); health = GetComponent <Health>(); sense = GetComponent <OmniSense>(); equipmentAI = GetComponent <EquipmentAI> (); }
/** * Inicjalizacja po utworzeniu. * */ void Start() { rightListMovement = true; targetResolve = TargetResolveEnum.DONE; lastTargetLocation = new Vector3(0, 0, 0); lastAgentLocationOnPath = new Vector3(0, 0, 0); if(patrolPoints == null) { patrolPoints = new List<Vector3>(); } patrolPointsIndex = 0; navAgent = GetComponent<NavMeshAgent>(); health = GetComponent<Health>(); sense = GetComponent<OmniSense>(); equipmentAI = GetComponent<EquipmentAI> (); }
/** * Inicjalizacja po utworzeniu. * */ void Start() { mutex.WaitOne(); rightListMovement = true; targetResolve = TargetResolveEnum.DONE; lastTargetLocation = new Vector3(0, 0, 0); lastAgentLocationOnPath = new Vector3(0, 0, 0); if (patrolPoints == null) { patrolPoints = new List <Vector3>(); } patrolPointsIndex = 0; isActive = true; mutex.ReleaseMutex(); }
/** * 3.Obsługa celu * -Następuje gdy jedna z dostępnych broni wykryje poprawny dla niej cel. * -Bieżąca pozycja aktora jest zapamiętywana, by można było powrócić do niej celem kontynuowania scieżki patrolu. * -Obsługa ma trzy możliwe wersje: pościg(A), obrona(B) i utrzymanie pozycji(C). * -Po zakończeniu obsługi następuje odczekanie. * */ private void TargetResolve() { switch (targetResolvePolicy) { /** * * 3A.Pościg * -Rozpoczyna się od zbliżania do celu. * -Zbliżanie do celu dpoóki: nie jest w zasięgu i jest widoczny i żyje. * -Interakcja z celem dopóki: jest w zasięgu i jest widoczny i żyje. * -Poszukiwanie celu dopóki: nie jest widoczny i skończą się poszukiwania. * -Zakończenie obsługi gdy: cel nie żyje lub nie odnaleziono celu po zgubieniu. * */ case TargetResolvePolicy.CHASE: if (equipmentAI.currentTarget == null) { //zgubiono cel targetResolve = TargetResolveEnum.SEARCH_TARGET; } else { standByTimeElapsed = 0; if (Vector3.Distance(transform.position, equipmentAI.currentTarget.transform.position) > equipmentAI.optimalDistanceToTarget) { //trzeba zbliżyć się do celu targetResolve = TargetResolveEnum.CLOSE_IN_ON_TARGET; } else { //jesteśmy dostatecznie blisko celu targetResolve = TargetResolveEnum.TARGET_INTERACTION; } } break; /** * * 3B.Obrona * -Rozpoczyna się od zbliżania do celu. * -Zbliżanie do celu dpoóki: nie jest w zasięgu i jest widoczny i żyje i nie oddalimy się zanadto od scieżki patrolu. * -Interakcja z celem dopóki: jest w zasięgu i jest widoczny i żyje. * -Poszukiwanie celu dopóki: nie jest widoczny i skończą się poszukiwania i nie oddalimy się zanadto od scieżki patrolu. * -Zakończenie obsługi gdy: cel nie żyje lub nie odnaleziono celu po zgubieniu lub oddaliliśmy się zanadto od scieżki patrolu. * */ case TargetResolvePolicy.DEFEND: if (equipmentAI.currentTarget == null) { //cel niewidoczny if (Vector3.Distance(lastAgentLocationOnPath, lastTargetLocation) <= defendChaseDistance) { //ostatnia pozycja w zasięgu pogoni targetResolve = TargetResolveEnum.SEARCH_TARGET; } else { //ostatnia pozycja poza zasięgiem pogoni targetResolve = TargetResolveEnum.DONE; } } else { //cel widoczny if (Vector3.Distance(lastAgentLocationOnPath, equipmentAI.currentTarget.transform.position) <= defendChaseDistance) { //można się zbliżyć if (Vector3.Distance(transform.position, equipmentAI.currentTarget.transform.position) <= equipmentAI.optimalDistanceToTarget) { //cel w pożądanym zasięgu targetResolve = TargetResolveEnum.TARGET_INTERACTION; } else { //cel poza pożądanym zasięgiem targetResolve = TargetResolveEnum.CLOSE_IN_ON_TARGET; } } else { //nie można się zbliżyć if (Vector3.Distance(transform.position, equipmentAI.currentTarget.transform.position) <= equipmentAI.maximalDistanceToTarget) { //cel w dopuszczalnym zasięgu targetResolve = TargetResolveEnum.TARGET_INTERACTION; } else { //cel poza pożądanym zasięgiem targetResolve = TargetResolveEnum.DONE; } } } break; /** * * 3C.Utrzymanie pozycji * -Rozpoczyna się od interakcji z celem. * -Interakcja z celem dopóki: jest w zasięgu i jest widoczny i żyje. * -Zakończenie obsługi gdy: cel nie żyje lub nie jest w zasięgu lub nie jest widoczny. * */ case TargetResolvePolicy.HOLD_POSITION: if (equipmentAI.currentTarget == null) { //zgubiono cel targetResolve = TargetResolveEnum.DONE; } else { standByTimeElapsed = 0; if (Vector3.Distance(transform.position, equipmentAI.currentTarget.transform.position) > equipmentAI.maximalDistanceToTarget) { //cel poza zasięgiem targetResolve = TargetResolveEnum.DONE; } else { //jesteśmy dostatecznie blisko celu targetResolve = TargetResolveEnum.TARGET_INTERACTION; } } break; /** * Nigdy nie powinno mieć miejsca. * */ default: //Assert(true, "Default call in TargetResolve()"); break; } switch (targetResolve) { case TargetResolveEnum.CLOSE_IN_ON_TARGET: CloseOnTarget(); break; case TargetResolveEnum.TARGET_INTERACTION: TargetInteraction(); break; case TargetResolveEnum.SEARCH_TARGET: SearchTarget(); break; case TargetResolveEnum.DONE: standByTimeElapsed = 0; aiState = PatrolAI_States.STAND_BY; break; default: break; } if (equipmentAI.currentTarget != null) { lastTargetLocation = equipmentAI.currentTarget.transform.position; } }
/** * 3.3.Poszukiwanie celu * -Gdy utracimy cel z zasięgu zmysłów, idziemy do jego ostatniej znanej pozycji. * -Po dojściu do niej przerywamy poszukiwania. * -Można w przyszłości zaimplementować inne rozwiązania * */ private void SearchTarget() { standByTimeElapsed += Time.deltaTime; if(Vector3.Distance(transform.position, lastTargetLocation) > destinationTolerence && standByTimeElapsed < searchTime) { if(navAgent != null) { navAgent.destination = lastTargetLocation; } } else { standByTimeElapsed = 0; targetResolve = TargetResolveEnum.DONE; aiState = PatrolAI_States.STAND_BY; } }
/** * 3.Obsługa celu * -Następuje gdy jedna z dostępnych broni wykryje poprawny dla niej cel. * -Bieżąca pozycja aktora jest zapamiętywana, by można było powrócić do niej celem kontynuowania scieżki patrolu. * -Obsługa ma trzy możliwe wersje: pościg(A), obrona(B) i utrzymanie pozycji(C). * -Po zakończeniu obsługi następuje odczekanie. * */ private void TargetResolve() { switch (targetResolvePolicy) { /** * * 3A.Pościg * -Rozpoczyna się od zbliżania do celu. * -Zbliżanie do celu dpoóki: nie jest w zasięgu i jest widoczny i żyje. * -Interakcja z celem dopóki: jest w zasięgu i jest widoczny i żyje. * -Poszukiwanie celu dopóki: nie jest widoczny i skończą się poszukiwania. * -Zakończenie obsługi gdy: cel nie żyje lub nie odnaleziono celu po zgubieniu. * */ case TargetResolvePolicy.CHASE: if(equipmentAI.currentTarget == null) { //zgubiono cel targetResolve = TargetResolveEnum.SEARCH_TARGET; } else { standByTimeElapsed = 0; if(Vector3.Distance(transform.position, equipmentAI.currentTarget.transform.position) > equipmentAI.optimalDistanceToTarget) { //trzeba zbliżyć się do celu targetResolve = TargetResolveEnum.CLOSE_IN_ON_TARGET; } else { //jesteśmy dostatecznie blisko celu targetResolve = TargetResolveEnum.TARGET_INTERACTION; } } break; /** * * 3B.Obrona * -Rozpoczyna się od zbliżania do celu. * -Zbliżanie do celu dpoóki: nie jest w zasięgu i jest widoczny i żyje i nie oddalimy się zanadto od scieżki patrolu. * -Interakcja z celem dopóki: jest w zasięgu i jest widoczny i żyje. * -Poszukiwanie celu dopóki: nie jest widoczny i skończą się poszukiwania i nie oddalimy się zanadto od scieżki patrolu. * -Zakończenie obsługi gdy: cel nie żyje lub nie odnaleziono celu po zgubieniu lub oddaliliśmy się zanadto od scieżki patrolu. * */ case TargetResolvePolicy.DEFEND: if(equipmentAI.currentTarget == null) { //cel niewidoczny if(Vector3.Distance(lastAgentLocationOnPath, lastTargetLocation) <= defendChaseDistance) { //ostatnia pozycja w zasięgu pogoni targetResolve = TargetResolveEnum.SEARCH_TARGET; } else { //ostatnia pozycja poza zasięgiem pogoni targetResolve = TargetResolveEnum.DONE; } } else { //cel widoczny if(Vector3.Distance(lastAgentLocationOnPath, equipmentAI.currentTarget.transform.position) <= defendChaseDistance) { //można się zbliżyć if(Vector3.Distance(transform.position, equipmentAI.currentTarget.transform.position) <= equipmentAI.optimalDistanceToTarget) { //cel w pożądanym zasięgu targetResolve = TargetResolveEnum.TARGET_INTERACTION; } else { //cel poza pożądanym zasięgiem targetResolve = TargetResolveEnum.CLOSE_IN_ON_TARGET; } } else { //nie można się zbliżyć if(Vector3.Distance(transform.position, equipmentAI.currentTarget.transform.position) <= equipmentAI.maximalDistanceToTarget) { //cel w dopuszczalnym zasięgu targetResolve = TargetResolveEnum.TARGET_INTERACTION; } else { //cel poza pożądanym zasięgiem targetResolve = TargetResolveEnum.DONE; } } } break; /** * * 3C.Utrzymanie pozycji * -Rozpoczyna się od interakcji z celem. * -Interakcja z celem dopóki: jest w zasięgu i jest widoczny i żyje. * -Zakończenie obsługi gdy: cel nie żyje lub nie jest w zasięgu lub nie jest widoczny. * */ case TargetResolvePolicy.HOLD_POSITION: if(equipmentAI.currentTarget == null) { //zgubiono cel targetResolve = TargetResolveEnum.DONE; } else { standByTimeElapsed = 0; if(Vector3.Distance(transform.position, equipmentAI.currentTarget.transform.position) > equipmentAI.maximalDistanceToTarget) { //cel poza zasięgiem targetResolve = TargetResolveEnum.DONE; } else { //jesteśmy dostatecznie blisko celu targetResolve = TargetResolveEnum.TARGET_INTERACTION; } } break; /** * Nigdy nie powinno mieć miejsca. * */ default: //Assert(true, "Default call in TargetResolve()"); break; } switch(targetResolve) { case TargetResolveEnum.CLOSE_IN_ON_TARGET: CloseOnTarget(); break; case TargetResolveEnum.TARGET_INTERACTION: TargetInteraction(); break; case TargetResolveEnum.SEARCH_TARGET: SearchTarget(); break; case TargetResolveEnum.DONE: standByTimeElapsed = 0; aiState = PatrolAI_States.STAND_BY; break; default: break; } if( equipmentAI.currentTarget != null) { lastTargetLocation = equipmentAI.currentTarget.transform.position; } }