private AI_BehaviorBrain[] FindManagers(AI_BehaviorBrain brain, float range, int minimumFound)
    {
        List <AI_BehaviorBrain> returnedBrainList = new List <AI_BehaviorBrain>();

        GameObject[] tempManagerList = GameObject.FindGameObjectsWithTag(Tags.manager);
        // Sort by distance
        Array.Sort(tempManagerList,
                   delegate(GameObject g1, GameObject g2)
        {
            float dist1 = Vector3.Distance(g1.transform.position, brain.transform.position);
            float dist2 = Vector3.Distance(g2.transform.position, brain.transform.position);
            return((int)(100 * (dist1 - dist2)));
        });

        // Remove unwanted Managers (outside of range and/or more than min)
        for (int i = 0; i < tempManagerList.Length; i++)
        {
            if (i < minimumFound || Vector3.Distance(tempManagerList[i].transform.position, brain.transform.position) <= range)
            {
                returnedBrainList.Add(tempManagerList[i].GetComponent <AI_BehaviorBrain>());
            }
            else
            {
                break;
            }
        }
        return(returnedBrainList.ToArray());
    }
示例#2
0
 /// <summary>
 /// Executes all the actions (and BeforeActions and AfterActions) then return the next State
 /// </summary>
 /// <param name="brain"> behavior brain </param>
 /// <returns></returns>
 public AI_State UpdateState(AI_BehaviorBrain brain)
 {
     BeforeActions(brain);
     DoActions(brain);
     AfterActions(brain);
     return(CheckTransitions(brain));
 }
    private void SetStates(AI_BehaviorBrain brain, AI_BehaviorBrain[] brainList, AI_State state)
    {
        foreach (AI_BehaviorBrain currbrain in brainList)
        {
            //Debug.Log(currbrain.gameObject.name+" from:"+ currbrain.currentState.ToString()+" to:"+state.ToString());
            AI_State currBrainState = currbrain.currentState;
            if (currBrainState != state)
            {
                bool replace = true;
                foreach (AI_State curState in noReplacedState)
                {
                    if (currBrainState == curState)
                    {
                        replace = false;
                        break;
                    }
                }
                if (replace)
                {
                    currbrain.ChangeState(state);
                    //currbrain.currentState = state;
                }
            }

            AI_GoToData goToData = currbrain.GetComponent <AI_GoToData>();
            if (goToData != null)
            {
                if (goToData.destination != brain.transform.position)
                {
                    goToData.destination = brain.transform.position;
                }
                goToData.stopDist = stopDist;
            }
        }
    }
示例#4
0
    public override bool Evaluate(AI_BehaviorBrain brain)
    {
        //\\ METHOD RAYCASTING
        //RaycastHit[] rayCastHits;
        //rayCastHits = Physics.SphereCastAll(brain.transform.position+ height*brain.transform.up, watchSphereRadius, brain.transform.forward, watchRange);
        ////Gizmos.DrawRay(brain.transform.position + height * brain.transform.up, brain.transform.forward);
        //foreach (RaycastHit rayCastHit in rayCastHits)
        //{
        //    if (gameObjectToWatchFor.tag.Equals(rayCastHit.transform.gameObject.tag))
        //    {
        //        return true;
        //    }
        //}
        //return false;

        //\\ METHOD SIGHT CONE
        //gameObjectToWatchFor = GameObject.FindGameObjectsWithTag(tag)[0];
        //Vector3 gORelatPos = gameObjectToWatchFor.transform.position- brain.transform.position;
        //Debug.Log("gameObjectToWatchFor" + gameObjectToWatchFor.transform.position);
        //if (gORelatPos.magnitude < watchRange)
        //{
        //    Vector3 frwdVect = brain.transform.forward;
        //    float angle = Vector3.Angle(frwdVect, gORelatPos);
        //    if (angle < watchRadius) return true;
        //}
        //return false;

        //\\ METHODE SPRITE WITH COLLIDER



        return(false);
    }
 private void CallManager(AI_BehaviorBrain brain)
 {
     managerBrainList = FindManagers(brain, range, minimumChanged);
     if (managerBrainList.Length > 0)
     {
         SetStates(brain, managerBrainList, newState);
     }
 }
示例#6
0
 public void EndStateForBrain(AI_BehaviorBrain brain)
 {
     for (int i = 0; i < brainAnimBoolList.Length; i++)
     {
         brain.brain_animator.SetBool(brainAnimBoolList[i], false);
     }
     for (int i = 0; i < transitionsList.Length; i++)
     {
         transitionsList[i].condition.EndStateForBrain(brain);
     }
 }
示例#7
0
 private AI_State CheckTransitions(AI_BehaviorBrain brain)
 {
     for (int i = 0; i < transitionsList.Length; i++)
     {
         TransitionListElement currTransListElmt = transitionsList[i];
         if (currTransListElmt.condition.Evaluate(brain) &&
             currTransListElmt.nextState != null)
         {
             return(currTransListElmt.nextState);
         }
     }
     return(null);
 }
 // Use this for initialization
 void Awake()
 {
     navMeshAgent = gameObject.GetComponent <NavMeshAgent>();
     brain        = gameObject.GetComponent <AI_BehaviorBrain>();
     animator     = gameObject.GetComponent <Animator>();
     if (brain.initialState.brainAnimBoolList != null && brain.initialState.brainAnimBoolList.Length > 0 && brain.initialState.brainAnimBoolList[0] == "isSitting")
     {
         navMeshAgent.enabled = false;
     }
     else if (!animator.GetBool("isSitting"))
     {
         navMeshAgent.enabled = true;
     }
 }
示例#9
0
    public override bool Evaluate(AI_BehaviorBrain brain)
    {
        //\\ METHOD RAYCASTING
        //RaycastHit[] rayCastHits;
        //rayCastHits = Physics.SphereCastAll(brain.transform.position+ height*brain.transform.up, watchSphereRadius, brain.transform.forward, watchRange);
        ////Gizmos.DrawRay(brain.transform.position + height * brain.transform.up, brain.transform.forward);
        //foreach (RaycastHit rayCastHit in rayCastHits)
        //{
        //    if (gameObjectToWatchFor.tag.Equals(rayCastHit.transform.gameObject.tag))
        //    {
        //        return true;
        //    }
        //}
        //return false;

        //\\ METHOD SIGHT CONE
        gameObjectToWatchFor = GameObject.FindGameObjectsWithTag(tag)[0];
        SplinePlayerCharacterController spcc = gameObjectToWatchFor.GetComponent <SplinePlayerCharacterController>();

        if ((!isNinjaOnly && !isSalarymanOnly) ||
            (isNinjaOnly && spcc.currPlayerStatus[PlayerCharacterController.StatusListElement.NINJA]) ||
            (isSalarymanOnly && !spcc.currPlayerStatus[PlayerCharacterController.StatusListElement.NINJA]))
        {
            if (!spcc.currPlayerStatus[statusHIDDEN])
            {
                Vector3 gORelatPos = gameObjectToWatchFor.transform.position - brain.transform.position;
                //Debug.Log("gameObjectToWatchFor" + gameObjectToWatchFor.transform.position);
                if (gORelatPos.magnitude < watchRange)
                {
                    Vector3 frwdVect = brain.transform.forward;
                    float   angle    = Vector3.Angle(frwdVect, gORelatPos);
                    //Debug.Log(brain.gameObject.name + "Player (angle: "+angle+" ) Found at " + brain.currentState.ToString());
                    if (angle < watchRadius)
                    {
                        if (setIsDetected && (spcc.dectectionCd < Time.timeSinceLevelLoad - spcc.lastDectectionTime))
                        {
                            spcc.lastDectectionTime = Time.timeSinceLevelLoad;
                            gameObjectToWatchFor.GetComponent <PlayerCharacterController>().ChangeStatus(PlayerCharacterController.StatusListElement.BLOCKED, true);
                            gameObjectToWatchFor.GetComponent <PlayerCharacterController>().ChangeStatus(PlayerCharacterController.StatusListElement.DETECTED, true);
                        }
                        return(true);
                    }
                }
            }
        }

        return(false);

        //\\ METHODE SPRITE WITH COLLIDER
    }
示例#10
0
    protected void ArrivedAtDestination(AI_BehaviorBrain brain)
    {
        NavMeshAgent  agent      = brain.navMeshAgent;
        AI_PatrolData patrolData = brain.GetComponent <AI_PatrolData>();

        ptrSplineLine = patrolData.ptrSplineLine;

        if (agent != null && ptrSplineLine != null)
        {
            BeforeChangingDestination(brain);
            patrolData.currentPreviousSplinePoint = ptrSplineLine.GetNextControlPointIndex(patrolData.currentPreviousSplinePoint);
            AfterChangingDestination(brain);
        }
    }
示例#11
0
    public override void Act(AI_BehaviorBrain brain)
    {
        spcc = GameObject.FindGameObjectWithTag(Tags.player).GetComponent <SplinePlayerCharacterController>();
        if (spcc.currPlayerStatus[PlayerCharacterController.StatusListElement.GAMEOVER] != true)
        {
            spcc.currPlayerStatus[PlayerCharacterController.StatusListElement.GAMEOVER] = true;
            spcc.currPlayerStatus[PlayerCharacterController.StatusListElement.ROOTED]   = true;
            FadeInOutController.instance.FadeIn(() =>
            {
                GameMasterManager.instance.Restart(brain);
            }, fadeInDuration, text);
        }

        //GameMasterManager.Instance.Restart(brain);
    }
示例#12
0
 public void InitializeStateForBrain(AI_BehaviorBrain brain)
 {
     if (isToStopOnEnter)
     {
         brain.navMeshAgent.isStopped = true;
     }
     if (brainAnimBoolList != null)
     {
         for (int i = 0; i < brainAnimBoolList.Length; i++)
         {
             brain.brain_animator.SetBool(brainAnimBoolList[i], true);
         }
     }
     for (int i = 0; i < transitionsList.Length; i++)
     {
         transitionsList[i].condition.InitializeStateForBrain(brain);
     }
 }
 public override bool Evaluate(AI_BehaviorBrain brain)
 {
     if (brainList.ContainsKey(brain))
     {
         float startTime = brainList[brain];
         if (duration > Time.realtimeSinceStartup - startTime)
         {
             return(false);
         }
         else
         {
             return(true);
         }
     }
     else
     {
         return(false);
     }
 }
示例#14
0
    private void GoTo(AI_BehaviorBrain brain)
    {
        NavMeshAgent agent    = brain.navMeshAgent;
        AI_GoToData  goToData = brain.GetComponent <AI_GoToData>();


        if (agent != null && goToData.destination != null)
        {
            agent.destination      = goToData.destination;
            agent.stoppingDistance = goToData.stopDist;
            //if(Vector3.Distance(brain.transform.position, agent.destination)<= agent.stoppingDistance)
            //{
            //    agent.isStopped = true;
            //}
            //else
            //{
            //    agent.isStopped = false;
            //}
        }
    }
示例#15
0
    private void DoActions(AI_BehaviorBrain brain)
    {
        for (int i = 0; i < actionsList.Length; i++)
        {
            if (actionsList[i].condition.Evaluate(brain))
            {
                Dictionaries.AudioName aN = actionsList[i].action.audioToPlay;
                if (aN != Dictionaries.AudioName.NONE)
                {
                    int ID = Dictionaries.instance.dic_audioID[aN];
                    if (!SoundManager.GetAudio(ID).playing)
                    {
                        SoundManager.GetAudio(ID).Play();
                    }
                }

                actionsList[i].action.Act(brain);
            }
            BetweenActions(brain);
        }
    }
示例#16
0
    protected void Patrol(AI_BehaviorBrain brain)
    {
        NavMeshAgent  agent      = brain.navMeshAgent;
        AI_PatrolData patrolData = brain.GetComponent <AI_PatrolData>();

        ptrSplineLine = patrolData.ptrSplineLine;

        if (agent != null && ptrSplineLine != null)
        {
            currentPreviousSplinePoint = patrolData.currentPreviousSplinePoint;

            agent.destination      = ptrSplineLine.transform.TransformPoint(ptrSplineLine.GetNextControlPoint(currentPreviousSplinePoint));
            agent.isStopped        = false;
            agent.stoppingDistance = stopDist;
            if (agent.remainingDistance <= agent.stoppingDistance && !agent.pathPending)
            {
                //int pointCnt = ptrSplineLine.GetControlPointCount;
                //int nextPointIndex = ptrSplineLine.GetNextControlPointIndex(currentPreviousSplinePoint);
                ArrivedAtDestination(brain);
            }
        }
    }
示例#17
0
 public override void InitializeStateForBrain(AI_BehaviorBrain brain)
 {
 }
 public override void EndStateForBrain(AI_BehaviorBrain brain)
 {
     brainList.Remove(brain);
 }
 public override void InitializeStateForBrain(AI_BehaviorBrain brain)
 {
     brainList.Add(brain, Time.realtimeSinceStartup);
 }
示例#20
0
 public override void AfterActions(AI_BehaviorBrain brain)
 {
 }
示例#21
0
 public abstract void InitializeStateForBrain(AI_BehaviorBrain brain);
示例#22
0
 public override void BeforeActions(AI_BehaviorBrain brain)
 {
 }
 protected override void AfterChangingDestination(AI_BehaviorBrain brain)
 {
     //Debug.Log("NEW AFTER");
 }
示例#24
0
 public override void Act(AI_BehaviorBrain brain)
 {
     CallManager(brain);
 }
示例#25
0
 public abstract void EndStateForBrain(AI_BehaviorBrain brain);
示例#26
0
 public override void EndStateForBrain(AI_BehaviorBrain brain)
 {
 }
示例#27
0
 public override void BetweenActions(AI_BehaviorBrain brain)
 {
 }
示例#28
0
 public abstract bool Evaluate(AI_BehaviorBrain brain);
示例#29
0
 public override void Act(AI_BehaviorBrain brain)
 {
 }
示例#30
0
 public abstract void AfterActions(AI_BehaviorBrain brain);