// OnStateEnter is called when a transition starts and the state machine starts to evaluate this state //override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { // //} // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { AI_StateMachine_Helper helper = animator.GetComponent <AI_StateMachine_Helper>(); Movement movement = helper.getMovement(); AI_Movement aiMovement = helper.getAIMovement(); Orient orient = helper.getOrient(); AI_Memory aiMemory = helper.getMemory(); List <Memory> memoryCache = aiMemory.getMemoryCache(); if (memoryCache.Count == 0) { Debug.LogWarning("flee target not found"); return; } // Go to last combat location Vector2 lastSeenEnemyPos = memoryCache[0].lastSeenPosition; orient.lookAtStep(lastSeenEnemyPos); aiMovement.Move(lastSeenEnemyPos); // Combat point reach bool positionReached = movement.positionReached(lastSeenEnemyPos); if (positionReached) { memoryCache.RemoveAt(0); animator.SetTrigger("CombatPointReached"); } }
// OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { AI_StateMachine_Helper helper = animator.GetComponent <AI_StateMachine_Helper>(); Movement movement = helper.getMovement(); AI_Movement aiMovement = helper.getAIMovement(); Orient orient = helper.getOrient(); int patrolIndex = animator.GetInteger("PatrolLocationIndex"); // Patrol if location available if (patrolIndex > 0) { Transform randomPatrolSpot = Navigation_manual.getPatrolLocation(patrolIndex); Vector2 visitPos = randomPatrolSpot.position; orient.lookAtStep(visitPos); aiMovement.Move(visitPos); // Patrol point reach bool positionReached = movement.positionReached(visitPos); if (positionReached) { animator.SetTrigger("PatrolPointReached"); } } else { Debug.LogWarning("Patrol location not found"); animator.SetTrigger("PatrolPointReached"); } }
public void ChangeAIToAppropriateOne(int ID) { if (ID > 1) { Debug.LogError("Wrong ID! Too high!"); return; } if ((GameStateManager.Instance.GameState == GameStates.IdleState || GameStateManager.Instance.GameState == GameStates.AttackState) && TurnManager.Instance.CurrentPhase == TurnPhases.Attack && TurnManager.Instance.PlayerHavingTurn == TurnManager.Instance.PlayerToMove && IsCurrentTurnHuman() == false) { PlayerAIs[ID] = new AI_Attack(ID); return; } if ((GameStateManager.Instance.GameState == GameStates.IdleState || GameStateManager.Instance.GameState == GameStates.ShootingState) && TurnManager.Instance.CurrentPhase == TurnPhases.Shooting) { PlayerAIs[ID] = new AI_Shooting(ID); return; } if ((GameStateManager.Instance.GameState == GameStates.IdleState || GameStateManager.Instance.GameState == GameStates.MoveState) && TurnManager.Instance.CurrentPhase == TurnPhases.Movement) { if (!didAllTheQCDecisionsHappen) { PlayerAIs[ID] = new AI_QuitCombat(ID); } else { PlayerAIs[ID] = new AI_Movement(ID); } return; } }
public static bool Prefix( // ReSharper disable InconsistentNaming AI_Movement __instance, ref float target, ref float speed // ReSharper restore InconsistentNaming ) { var aiNetworkBehaviourDomestic = __instance.GetComponentInParent(typeof(AI_NetworkBehaviour_Domestic)) as AI_NetworkBehaviour_Domestic; if (aiNetworkBehaviourDomestic == null) { return(true); } var speedFactor = aiNetworkBehaviourDomestic.scaledSize; var aiStateMachineDomestic = __instance.GetComponentInParent(typeof(AI_StateMachine_Domestic)) as AI_StateMachine_Domestic; // is running const int stateRunning = 1; if (aiStateMachineDomestic != null && aiStateMachineDomestic.currentState != null && aiStateMachineDomestic.currentState.stateIndex == stateRunning && speedFactor > 3) { speedFactor = 3; } target *= speedFactor; speed *= speedFactor; return(true); }
public NavRequest(AI_Movement who, Vector2 whereTo, Vector2 fromWhere, float yourSize) { subject = who; destineLocation = whereTo; currLocation = fromWhere; agentSize = yourSize; }
//Need optimization //Initialize every subject seekers' surrounding nodes as startnodes; spreading from target and pickup start node and assign to according subject's path void Update() { int process_count = process_thredshold; while (pathRequestQueue.Count > 0 && process_count > 0)//something missing here? { process_count -= 1; for (int i = 0; i < area_dict.Count; i++) { area_dict[i].initialize(); } NavRequest navRequest = pathRequestQueue[0]; pathRequestQueue.RemoveAt(0); if (navRequest.subject != null) { AI_Movement ai = navRequest.subject; //Navigate List <Vector2> solution = Astar_Algorithm_pathVector2(navRequest.currLocation, navRequest.destineLocation, navRequest.agentSize); ai.setNavigationPath(solution); } } }
// OnStateEnter is called when a transition starts and the state machine starts to evaluate this state //override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) //{ // Vector2 enemyPos = aiEnemyFinder.getClosestEnemy().position; // Vector2 thisPos = movement.getPosition(); // movement.SetDirectionVector(thisPos - enemyPos); //} // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { AI_StateMachine_Helper helper = animator.GetComponent <AI_StateMachine_Helper>(); Movement movement = helper.getMovement(); AI_Movement aiMovement = helper.getAIMovement(); Orient orient = helper.getOrient(); AI_Memory aiMemory = helper.getMemory(); Vector2 thisPos = movement.getPosition(); List <Memory> memoryCache = aiMemory.getMemoryCache(); if (memoryCache.Count == 0) { Debug.LogWarning("flee target not found"); return; } // Get closest Vector2 tmp = memoryCache[0].lastSeenPosition; Vector2 enemyPos = tmp; float closestDistSqrTmp = (tmp - thisPos).sqrMagnitude; float closestDistSqr = closestDistSqrTmp; for (int i = 1; i < memoryCache.Count; i++) { tmp = memoryCache[i].lastSeenPosition; closestDistSqrTmp = (tmp - thisPos).sqrMagnitude; if (closestDistSqr > closestDistSqrTmp) { closestDistSqr = closestDistSqrTmp; enemyPos = tmp; } } // Get hiding spot Transform hidingSpot = Navigation_manual.nearest_cover(thisPos, enemyPos); // Flee to hiding spot if (hidingSpot != null) { orient.lookAtStep(hidingSpot.position); aiMovement.Move(hidingSpot.position); // Combat point reach bool positionReached = movement.positionReached(hidingSpot.position); if (positionReached) { animator.SetTrigger("CoverPointReached"); } } // Flee from enemy else { Vector2 moveDir = thisPos - enemyPos; orient.lookAtStep(enemyPos); movement.Move(moveDir); } }
// Use this for initialization void Start() { anim = GetComponent <Animator>(); ai = GetComponent <AI_Movement>(); controller = GetComponent <AI_Controller>(); state = animationState.IDLE; prevState = state; }
// OnStateEnter is called when a transition starts and the state machine starts to evaluate this state //override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { // //} // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { AI_StateMachine_Helper helper = animator.GetComponent <AI_StateMachine_Helper>(); Movement movement = helper.getMovement(); AI_Movement aiMovement = helper.getAIMovement(); Orient orient = helper.getOrient(); Equipment equipment = helper.getEquipment(); AI_Finder aiEnemyFinder = helper.getEnemyFinder(); Vector2 thisPos = movement.getPosition(); List <Transform> memoryCache = aiEnemyFinder.getSightCache(); if (memoryCache.Count == 0) { Debug.LogWarning("attack target not found"); return; } // Get closest Vector2 tmp = memoryCache[0].position; Vector2 closestPos = tmp; float closestDistSqrTmp = (tmp - thisPos).sqrMagnitude; float closestDistSqr = closestDistSqrTmp; for (int i = 1; i < memoryCache.Count; i++) { tmp = memoryCache[i].position; closestDistSqrTmp = (tmp - thisPos).sqrMagnitude; if (closestDistSqr > closestDistSqrTmp) { closestDistSqr = closestDistSqrTmp; closestPos = tmp; } } // Engage orient.lookAtStep(closestPos); aiMovement.Move(closestPos); // Attack when close AI_Weapon_Helper weaponAIHelper = equipment.getWeapon().GetComponent <AI_Weapon_Helper>(); Assert.IsNotNull(weaponAIHelper); float meleeRange = weaponAIHelper.getAttackRange(); float enemyDistSqr = (closestPos - thisPos).sqrMagnitude; if (enemyDistSqr < meleeRange * meleeRange) { equipment.initPrimaryAttack(); } }
// OnStateEnter is called when a transition starts and the state machine starts to evaluate this state //override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { // //} // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { AI_StateMachine_Helper helper = animator.GetComponent <AI_StateMachine_Helper>(); Movement movement = helper.getMovement(); AI_Movement aiMovement = helper.getAIMovement(); Orient orient = helper.getOrient(); Equipment equipment = helper.getEquipment(); AI_Finder weaponFinder = helper.getWeaponFinder(); List <Transform> sightCache = weaponFinder.getSightCache(); if (sightCache.Count == 0) { Debug.LogWarning("Weapon not found"); return; } // Find closest weapon Vector2 thisPos = movement.getPosition(); Transform tmp = sightCache[0]; Transform weaponClosest = tmp; float closestDistSqrTmp = ((Vector2)tmp.position - thisPos).sqrMagnitude; float closestDistSqr = closestDistSqrTmp; for (int i = 1; i < sightCache.Count; i++) { tmp = sightCache[i]; closestDistSqrTmp = ((Vector2)tmp.position - thisPos).sqrMagnitude; if (closestDistSqr > closestDistSqrTmp) { closestDistSqr = closestDistSqrTmp; weaponClosest = tmp; } } // Move & Face enemy Vector2 enemyPos = weaponClosest.position; orient.lookAtStep(enemyPos); aiMovement.Move(enemyPos); // Fetch when close float pickupRadius = equipment.getPickUpRadius(); float enemyDistSqr = (enemyPos - thisPos).sqrMagnitude; if (enemyDistSqr < pickupRadius * pickupRadius) { equipment.pickUp(); } }
public override GameObject AI_ChooseTarget() { // I admit this is some HORRIBLE code down there. Maybe i should have just made this random, since my AI code is in general SICKly bad.. It should just generally work as follows in final version (as it does now): // Just take the normal movement AI and make it find the best move from legal tiles for this ability. AI_Movement TemporaryMovementAI = new AI_Movement(myUnit.PlayerID); var dictionary = new Dictionary <Tile, float>(); foreach (Tile tile in AI_GetTheLegalMoves()) { dictionary.Add(tile, TemporaryMovementAI.EvaluateTile(myUnit, tile, TemporaryMovementAI.FindDirectionOfEnemies(myUnit), TemporaryMovementAI.GetAllEnemyMoves())); } return(TemporaryMovementAI.GetTheMove(myUnit, dictionary).Key.gameObject); }
// How the enemy think IEnumerator Brain() { do { float waitTime = atb.MinimumTimeOnAction; // decide if will shoot/punch if (atb.AtkPriority > atb.FleePriority) { _attack = false; } else { _attack = true; } // random action int action = UnityEngine.Random.Range(0, 3); switch (action) { case 0: myMovement = AI_Movement.flee; if (atb.Classe == 1) { waitTime += UnityEngine.Random.Range(0, atb.MaxTimeOnFlee); } break; case 1: myMovement = AI_Movement.stand; if (atb.Classe == 1) { waitTime += UnityEngine.Random.Range(0, atb.MaxTimeOnStand); } break; default: myMovement = AI_Movement.followPlayer; _attack = true; if (atb.Classe == 0) { waitTime += UnityEngine.Random.Range(0, atb.MaxTimeFollowingPlayer); } break; } yield return(new WaitForSeconds(waitTime)); } while (_isAlive); }
private void Start() { //base.Initialize(); BlackBoard.b_AIs.Add(this); m_Movement = GetComponent <AI_Movement>(); m_Eyes = GetComponent <AI_Eyes>(); if (BlackBoard.b_player == null) { BlackBoard.Init(); } PrevPos = BlackBoard.b_player.transform.position; NewPos = PrevPos; CanBeAlertedByAI = true; }
public override float EvaluateTile(UnitScript currentUnit, Tile tile, int enemiesDirection, Dictionary <UnitMovement, List <Tile> > EnemyMovementRange) { // we want to evaluate if a tile is a proper "end" tile for a unit to QC into float Evaluation = 0f; // first lets check if a unit WANTS to QC at all! If not lets give a -infinity if (DoesUnitWantToQC(currentUnit) == false) { Evaluation = -Mathf.Infinity; } else { // lets see if the tile is good for QC in a NORMAL way we would do it in movement! AI_Movement tempAI = new AI_Movement(ID); Evaluation = tempAI.EvaluateTile(currentUnit, tile, enemiesDirection, EnemyMovementRange); } return(Evaluation); }
private bool ableToSpawn = false; // True if respawnTimer == 0 (except by default as AI already loaded) // Use this for initialization void Start() { if (GetComponent <AI_Animation_Controller>() != null) { animController = GetComponent <AI_Animation_Controller>(); } else { Debug.LogError("You need to add an animation controller to this AI"); } if (GetComponent <AI_Movement>() != null) { movement = GetComponent <AI_Movement>(); } else { Debug.LogError("You need to add an AI_Movement script to this AI"); } player = GameObject.FindGameObjectWithTag("Player"); state = aiState.ALIVE; }
public static void CancelRequestPath(AI_Movement subject) { NavRequest request = Singleton.pathRequestQueue.Find(x => x.subject == subject); Singleton.pathRequestQueue.Remove(request); }