Beispiel #1
0
 /**
  * 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;
     }
 }
Beispiel #2
0
    /**
     * 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> ();
    }
Beispiel #3
0
	/**
	 * 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> ();
	}
Beispiel #4
0
    /**
     * 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();
    }
Beispiel #5
0
    /**
     * 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;
        }
    }
Beispiel #6
0
	/**
	 * 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;
		}
	}
Beispiel #7
0
	/**
	 * 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;
		}
	}