void BotUpdate() { if (myAiState != oldAiState) { isNewAiState = true; oldAiState = myAiState; } else { isNewAiState = false; } botHandler.isVisible(transform.position, attackTarget, botFov); if (targetVisible && !botHandler.isVisible(transform.position, attackTarget, botFov)) { targetVisible = false; //Debug.Log("cannot see"); } else if (!targetVisible && botHandler.isVisible(transform.position, attackTarget, botFov)) { targetVisible = true; //Debug.Log("can see"); } myController.isBraking = false; switch (myAiState) { case BotLogic.aiState.wander: if (isNewAiState) { Debug.Log("is wandering"); bufferAiState = BotLogic.aiState.wander; navList = navSystem.GetRandomPath(transform.position); botHandler.PlotCourse(ref navList); audioSource.clip = wander[0]; audioSource.Play(); } //if(botHandler.AtPosition()) else if (botHandler.AtNavTarget(botFov, true, 10, 10)) { navList = navSystem.GetRandomPath(transform.position); botHandler.PlotCourse(ref navList); } if (botHandler.BeginAttack(ref attackTarget, ref enemies, botFov)) { myAiState = BotLogic.aiState.attack; } break; case BotLogic.aiState.getAmmo: if (isNewAiState) { Debug.Log("getting ammo"); if (!botHandler.GetNavItem(ref navTarget, ref ammoRestore)) { myAiState = bufferAiState; break; } navList = navSystem.GetPath(transform.position, navTarget.transform.position); botHandler.PlotCourse(ref navList); audioSource.clip = getAmmo[0]; audioSource.Play(); } else if (botHandler.AtNavTarget()) { myAiState = bufferAiState; } break; case BotLogic.aiState.getShield: if (isNewAiState) { Debug.Log("getting shield"); if (!botHandler.GetNavItem(ref navTarget, ref shieldRecharge)) { myAiState = bufferAiState; break; } navList = navSystem.GetPath(transform.position, navTarget.transform.position); botHandler.PlotCourse(ref navList); audioSource.clip = getShield[0]; audioSource.Play(); } else if (botHandler.AtNavTarget()) { myAiState = bufferAiState; } break; case BotLogic.aiState.attack: if (isNewAiState) { Debug.Log("attacking!"); bufferAiState = BotLogic.aiState.attack; audioSource.clip = attack[0]; audioSource.Play(); } //this is where attack behavior comes in //options are: //1: try to ram player //2: keep at some operative distance //3: hit and run tactics //4: try to use special weapon //where possible bots should rotate to show players undamaged shields. maybe don't do explicily //some bots should be smart enough to investigate the lights and lasers of players //bots should also be able to hear player's engines and especially boosting switch (myAttackType) { case BotLogic.attackState.rush: botHandler.AtPosition(attackTarget.transform.position, true, true, true, 10); if (!botHandler.isVisible(transform.position, attackTarget, botFov)) { myAiState = BotLogic.aiState.investigate; } break; case BotLogic.attackState.holdPosition: break; case BotLogic.attackState.hitAndRun: break; case BotLogic.attackState.nimble: break; case BotLogic.attackState.circler: if (myController.isFire2Down) { myController.isFire2Up = true; myController.isFire2Down = false; } else if (targetInCrosshair) //else if (botHandler.isVisible(transform.position, attackTarget, 1)) { if (bombTimer == -1) { bombTimer = Random.Range(minBombTime, maxBombTime); } else if (bombTimer < 0) { bombTimer = -1; myController.isFire2Down = true; } else { bombTimer -= Time.deltaTime; } myController.isFire2Up = false; } if (myController.isFire1Down) { myController.isFire1Up = true; myController.isFire1Down = false; } //else if (botHandler.isVisible(transform.position, attackTarget, 1)) else if (targetInCrosshair) { if (gunTimer == -1) { gunTimer = Random.Range(minGunTime, maxGunTime); } else if (gunTimer < 0) { gunTimer = -1; myController.isFire1Down = true; } else { gunTimer -= Time.deltaTime; } myController.isFire1Up = false; } if (targetInCrosshair && Vector3.Magnitude(attackTarget.transform.position - transform.position) < 30) { myController.isBraking = true; } else if (botHandler.AtPosition(attackTarget.transform.position, true, true, true, 30, false)) { botHandler.AtPosition(attackTarget.transform.position, false, false, true, 0, false); myController.isBraking = true; } else { needRandomVec = true; } if (!botHandler.isVisible(transform.position, attackTarget, botFov)) { myAiState = BotLogic.aiState.investigate; } break; default: break; } break; case BotLogic.aiState.investigate: if (isNewAiState) { Debug.Log("investigating point"); navPoint = attackTarget.transform.position; audioSource.clip = investigate[0]; audioSource.Play(); } if (targetVisible) { myAiState = BotLogic.aiState.attack; } else if (botHandler.AtPosition(navPoint, true, true, true, 0.5f)) { myAiState = BotLogic.aiState.wander; } break; case BotLogic.aiState.guard: break; case BotLogic.aiState.flee: if (isNewAiState) { Debug.Log("fleeing"); bufferAiState = BotLogic.aiState.wander; navList = navSystem.GetRandomPath(transform.position); botHandler.PlotCourse(ref navList); audioSource.clip = flee[0]; audioSource.Play(); } else if (botHandler.AtNavTarget(botFov, true, 10, 10)) { myAiState = BotLogic.aiState.wander; } break; case BotLogic.aiState.none: //botHandler.ResetReactionTime(); //botHandler.isLookingAt(enemies[0].transform.position, 0, 1, true); //botHandler.AtPosition(enemies[0].transform.position, true, true, true, 10); break; default: break; } }