/// <summary> /// Возвращает аудиофайл сообщения соответствующего статуса AgressionStateAI /// </summary> /// <param name="state">Статус агрессии AI</param> /// <returns>Возвращает аудиофайл</returns> public AudioClip getStateMessage(AgressionStateAI state) { switch (state) { case AgressionStateAI.Normal: return getCollectionItem(ref oldNormalIndex, ref normalMessagesList); case AgressionStateAI.Warning: return getCollectionItem(ref oldWarningIndex, ref warningMessagesList); case AgressionStateAI.Enemy: return getCollectionItem(ref oldEnemyIndex, ref enemyMessagesList); default: return null; } }
public void OnStartWalker() { agent = gameObject.GetComponent<NavMeshAgent>(); animator = GetComponent<Animator>(); base.OnStartEnemyBehaviorAI(animator); State = AgressionStateAI.Normal; }
public void OnUpdateWalker() { if(destroyed) return; if (states.health <= 0) // ходок умер DoDie(); bool moveFlag = true; // Пытаемся просканировать видимую местность не чаще раза в SEE_UPDATE_TIME сек. if (Time.time - seeDelayTimeStamp >= SEE_UPDATE_TIME) { OnSeeIteration(); seeDelayTimeStamp = Time.time; } if(Time.time - moveDelayTimeStamp >= MOVE_UPDATE_TIME) { // проверка на "заторы" if(Vector3.Distance(transform.position, oldPosition) <= 0.1f) // дистанция практически не сменилась switch (walkState) { case WALK: // врагов поблизости нет, ходок идёт на точку, но, дистанция не меняется OnFindNewIdlePoint(); // пытаемся идти на другую точку break; case RUN: // есть враг, но, ходок во что то упёрся target = null; State = AgressionStateAI.Normal; // пытаемся забыть цель, до неё не достать break; } moveDelayTimeStamp = Time.time; oldPosition = transform.position; } // Проверяем, if (isMinIdleDistance(transform.position, point, minMovDistance)) { OnIdleIteration(); moveFlag = false; } if(isMinAttackDistance(transform, target, minAttackDistance, target)) { OnAttackIteration(); moveFlag = false; } if(moveFlag) OnMoveIteration(); if (target != null && isSeeDistanceGameObject(target,transform)) { memoryTimeStamp = Time.time; transform.LookAt(target); } else { if (Time.time - memoryTimeStamp >= enemyMemory) { // смотрим, как долго персонаж пропадает из вида // если время больше "памяти" AI, забываем цель State = AgressionStateAI.Normal; target = null; } } }
public void OnSeeIteration() { if(target!=null) return; List<IStateAI> seeNPC = LookViewService.getInstance().getSeeAIObjects(this, new Ray(transform.position, transform.forward),seeDistance,seeAngle); foreach(IStateAI ai in seeNPC) { if (getFraction() != ai.getFraction()) { // ходок видит врага State = AgressionStateAI.Enemy; target = ai.toObject().transform; memoryTimeStamp = Time.time; // запоминаем момент когда видим цель return; } } }