AI Zombie

Форум для всего, что связано с ИИ.

AI Zombie

Сообщение WebWolf 10 янв 2010, 19:56

Что то не пойму как переделать стандартный скрипт AI из FPS Tutorial
Мне нужно сделать что бы зомби мог видеть игрока постоянно... т.е где бы он ни был он должен добежать до игрока и нанести удар... но почему то когда attackRange делаю больше то ничего не меняется как он терял цель так и теряет...
Если конечно есть код получше с поиском путей что бы зомби могли обойти здание например.... то обьясните чет некоторые моменты в коде не понятны...
Код: Выделить всё
var speed = 3.0;
var rotationSpeed = 5.0;
//Растояние до стрельбы
var shootRange = 15.0;
//На каком расстоянии он будет видеть цель
var attackRange = 30.0;
//хз зачем
var shootAngle = 4.0;
// тоже хз зачем
var dontComeCloserRange = 5.0;
var delayShootTime = 0.35;
var pickNextWaypointDistance = 2.0;
var target : Transform;

private var lastShot = -10.0;

// Удостоверься, что всегда есть CharacterController
@script RequireComponent (CharacterController)

function Start () {
   //  Проверяем есль ли цель. т.е игрок
   if (target == null && GameObject.FindWithTag("Player"))
      target = GameObject.FindWithTag("Player").transform;

   Patrol();
}

function Patrol () {
   var curWayPoint = AutoWayPoint.FindClosest(transform.position);
   while (true) {
      var waypointPosition = curWayPoint.transform.position;
      // Мы близко к waypoint?-> выбирают следующий!
      if (Vector3.Distance(waypointPosition, transform.position) < pickNextWaypointDistance)
         curWayPoint = PickNextWaypoint (curWayPoint);

      //Напади на игрока и жди до того как
      //-игрок убит
      //-игрок вне поля зрения
      if (CanSeeTarget ())
         yield StartCoroutine("AttackPlayer");
      
      // Двинь нашу цель
      MoveTowards(waypointPosition);
      
      yield;
   }
}


function CanSeeTarget () : boolean {
// как я понимаю если расстояние от зомби до игрока больше чем заданное расстояние на атаку то до свидания..
   if (Vector3.Distance(transform.position, target.position) > attackRange)
      return false;
   
//Стреляем лучем в нашу цель   
   var hit : RaycastHit;
   if (Physics.Linecast (transform.position, target.position, hit))
      return hit.transform == target;

   return false;
}

function Shoot () {
   // Анимация выстрела
   animation.CrossFade("shoot", 0.3);

   // Ждать
   yield WaitForSeconds(delayShootTime);
   
   // Огонь
   BroadcastMessage("Fire");
   
   // Ждать пока анимация не проиграется
   yield WaitForSeconds(animation["shoot"].length - delayShootTime);
}

function AttackPlayer () {
//Получаем позицию цели .те игрока
   var lastVisiblePlayerPosition = target.position;
   while (true) {
      if (CanSeeTarget ()) {
         // Если цель (игрок )мертв, то прекратить атаку
         if (target == null)
            return;

         // Получаем расстояние от зомби до цели
         var distance = Vector3.Distance(transform.position, target.position);
         // Если это расстояние больше чем расстояние до стрельбы умножение на 3 (хз почему)
         if (distance > shootRange * 3)
         return;
         
         // Снова зачем то присваиваем позицию игрока
         lastVisiblePlayerPosition = target.position;
         //Если растояние от игрока до цели меньше чет хз что то двигатся
         if (distance > dontComeCloserRange)
            MoveTowards (lastVisiblePlayerPosition);
         else
            RotateTowards(lastVisiblePlayerPosition); // В противном случае разворачиваемся к цели лицом

            //Получаем наверно направление
         var forward = transform.TransformDirection(Vector3.forward);
         var targetDirection = lastVisiblePlayerPosition - transform.position;
         targetDirection.y = 0;

         var angle = Vector3.Angle(targetDirection, forward);

         // Начинаем атаку
         if (distance < shootRange && angle < shootAngle)
            yield StartCoroutine("Shoot");
      } else {
         yield StartCoroutine("SearchPlayer", lastVisiblePlayerPosition);
         // Потеряли игрока... прекращаем атаку
         if (!CanSeeTarget ())
            return;
      }

      yield;
   }
}

function SearchPlayer (position : Vector3) {
   // Run towards the player but after 3 seconds timeout and go back to Patroling
   var timeout = 3.0;
   while (timeout > 0.0) {
      MoveTowards(position);

      // We found the player
      if (CanSeeTarget ())
         return;

      timeout -= Time.deltaTime;
      yield;
   }
}

function RotateTowards (position : Vector3) {
   SendMessage("SetSpeed", 0.0);
   
   var direction = position - transform.position;
   direction.y = 0;
   if (direction.magnitude < 0.1)
      return;
   
   // Rotate towards the target
   transform.rotation = Quaternion.Slerp (transform.rotation, Quaternion.LookRotation(direction), rotationSpeed * Time.deltaTime);
   transform.eulerAngles = Vector3(0, transform.eulerAngles.y, 0);
}

function MoveTowards (position : Vector3) {
   var direction = position - transform.position;
   direction.y = 0;
   // хз что это и зачем(
   if (direction.magnitude < 0.5) {
      SendMessage("SetSpeed", 0.0);
      return;
   }
   
   // Поворачиваемся к цели
   transform.rotation = Quaternion.Slerp (transform.rotation, Quaternion.LookRotation(direction), rotationSpeed * Time.deltaTime);
   transform.eulerAngles = Vector3(0, transform.eulerAngles.y, 0);

   // Измени скорость, таким образом мы замедляемся, когда мы не оказываемся перед целью
   var forward = transform.TransformDirection(Vector3.forward);
   var speedModifier = Vector3.Dot(forward, direction.normalized);
   speedModifier = Mathf.Clamp01(speedModifier);

   // Двигаемся
   direction = forward * speed * speedModifier;
   GetComponent (CharacterController).SimpleMove(direction);
   
   SendMessage("SetSpeed", speed * speedModifier, SendMessageOptions.DontRequireReceiver);
}

function PickNextWaypoint (currentWaypoint : AutoWayPoint) {
   // We want to find the waypoint where the character has to turn the least

   // The direction in which we are walking
   var forward = transform.TransformDirection(Vector3.forward);

   // The closer two vectors, the larger the dot product will be.
   var best = currentWaypoint;
   var bestDot = -10.0;
   for (var cur : AutoWayPoint in currentWaypoint.connected) {
      var direction = Vector3.Normalize(cur.transform.position - transform.position);
      var dot = Vector3.Dot(direction, forward);
      if (dot > bestDot && cur != currentWaypoint) {
         bestDot = dot;
         best = cur;
      }
   }
   
   return best;
}
WTF? _WolfGames3D.com / Все в Tanks Heroes Вконтакте!
Аватара пользователя
WebWolf
Старожил
 
Сообщения: 532
Зарегистрирован: 19 дек 2009, 15:49
Откуда: Russian Federation
  • Сайт
  • ICQ

Re: AI Zombie

Сообщение Zaicheg 10 янв 2010, 20:19

Метод CanSeeTarget(). Или убери его совсем или сделай возвращаемое значение всегда true
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: AI Zombie

Сообщение WebWolf 10 янв 2010, 22:45

Zaicheg писал(а):Метод CanSeeTarget(). Или убери его совсем или сделай возвращаемое значение всегда true

угу получилось)) только вот как мне генерить новых зобби? ) ну например среспаунилось 20 зоби.. потом я их уничтожил и снова появляются)) т.к есть ли где нить пример... что бы сделать что то похожее))
В общем надо вот как в целом сделать... Выходят 10 зомби и 1 бос... убиваем 10 зомби и боса... выходят ещё.. а из боса вываливается оружие) т.е чем дольше держишься чет лучше оружие достается...
WTF? _WolfGames3D.com / Все в Tanks Heroes Вконтакте!
Аватара пользователя
WebWolf
Старожил
 
Сообщения: 532
Зарегистрирован: 19 дек 2009, 15:49
Откуда: Russian Federation
  • Сайт
  • ICQ

Re: AI Zombie

Сообщение Fatalix3d 11 янв 2010, 09:21

Сделай переменную : "var zombie_count=0;" и при каждом создание нового зомби к этой переменной прибавляй +1, так же поставь условие на генератор зомби что бы он тебе армию не на генерировал:
Код: Выделить всё
if(zombie_count<10)
spawn_zombie()

Так зомбаков не будет более 10, ну а для босов сделай тоже пару переменных :
Код: Выделить всё

и если ты убиваешь боса 1 , то там условие сделай:
if (bos_1_dead=true)
spawn_bos_2()
Fatalix3d
UNец
 
Сообщения: 47
Зарегистрирован: 23 дек 2009, 17:43

Re: AI Zombie

Сообщение WebWolf 11 янв 2010, 15:19

Fatalix3d писал(а):Сделай переменную : "var zombie_count=0;" и при каждом создание нового зомби к этой переменной прибавляй +1, так же поставь условие на генератор зомби что бы он тебе армию не на генерировал:
Код: Выделить всё
if(zombie_count<10)
spawn_zombie()

Так зомбаков не будет более 10, ну а для босов сделай тоже пару переменных :
Код: Выделить всё

и если ты убиваешь боса 1 , то там условие сделай:
if (bos_1_dead=true)
spawn_bos_2()

Спасибо тебе большое))) а вот что в себя должен включать метод spawn_zombie() ? ну всмысле что можно выдрасть из FPS Tutorial )
Это конечно все понятно.. Значит надо создать какой какой то обьект к примеру Spawns и сделать дочерние объекты Spawn ... пото надо повесить кода на Spawns и заставить а этом коде появляются зомбиков именно в этих Spawn местах)) так вот для начал как мне вызвать зомби и поставить его туда?
WTF? _WolfGames3D.com / Все в Tanks Heroes Вконтакте!
Аватара пользователя
WebWolf
Старожил
 
Сообщения: 532
Зарегистрирован: 19 дек 2009, 15:49
Откуда: Russian Federation
  • Сайт
  • ICQ

Re: AI Zombie

Сообщение Zaicheg 11 янв 2010, 18:49

WebWolf писал(а): так вот для начал как мне вызвать зомби и поставить его туда?

Object.Instantiate
Transform.position
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: AI Zombie

Сообщение WebWolf 11 янв 2010, 19:53

Zaicheg писал(а):
WebWolf писал(а): так вот для начал как мне вызвать зомби и поставить его туда?

Object.Instantiate
Transform.position

Благодарю все получилось)))
WTF? _WolfGames3D.com / Все в Tanks Heroes Вконтакте!
Аватара пользователя
WebWolf
Старожил
 
Сообщения: 532
Зарегистрирован: 19 дек 2009, 15:49
Откуда: Russian Federation
  • Сайт
  • ICQ

Re: AI Zombie

Сообщение WebWolf 12 янв 2010, 01:38

var Zombies : Transform;
var BosZombie : Transform;
var zombie_count = 10;
// transform.childCount - количетво респаунов
for (var i=0;i<transform.childCount;i++)
{
for (var k=0;k<zombie_count;k++)
{
Instantiate (Zombies, transform.transform.GetChild(i).position, Quaternion.identity);
yield WaitForSeconds(2);
}

}

Так вот что получилось.. как теперь сделать что бы зомби не по несколько подряд в одной точке появлялись а рандомно в любом из респаунов... Или ещё хлеще как сделать что бы они на глазах у игрока не появлялись.. к примеру в том месте где игрок не разрешать появляться.. или там куда смотрит игрок.... во как))
WTF? _WolfGames3D.com / Все в Tanks Heroes Вконтакте!
Аватара пользователя
WebWolf
Старожил
 
Сообщения: 532
Зарегистрирован: 19 дек 2009, 15:49
Откуда: Russian Federation
  • Сайт
  • ICQ

Re: AI Zombie

Сообщение Zaicheg 12 янв 2010, 11:28

Так вот что получилось.. как теперь сделать что бы зомби не по несколько подряд в одной точке появлялись а рандомно в любом из респаунов... Или ещё хлеще как сделать что бы они на глазах у игрока не появлялись.. к примеру в том месте где игрок не разрешать появляться.. или там куда смотрит игрок.... во как)

Random.Range
Vector3.Distance
Renderer.isVisible (или что-то похожее)
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: AI Zombie

Сообщение WebWolf 12 янв 2010, 16:08

Zaicheg писал(а):
Так вот что получилось.. как теперь сделать что бы зомби не по несколько подряд в одной точке появлялись а рандомно в любом из респаунов... Или ещё хлеще как сделать что бы они на глазах у игрока не появлялись.. к примеру в том месте где игрок не разрешать появляться.. или там куда смотрит игрок.... во как)

Random.Range
Vector3.Distance
Renderer.isVisible (или что-то похожее)

Спасибо рандом сделал...
WTF? _WolfGames3D.com / Все в Tanks Heroes Вконтакте!
Аватара пользователя
WebWolf
Старожил
 
Сообщения: 532
Зарегистрирован: 19 дек 2009, 15:49
Откуда: Russian Federation
  • Сайт
  • ICQ

Re: AI Zombie

Сообщение TenebrosiUltories 27 фев 2013, 04:45

зачем тебе что-то переделывать?Вот держи скрипт:
Синтаксис:
Используется javascript
var idleAnimation : AnimationClip;
var walkAnimation : AnimationClip;
var attackAnimation : AnimationClip;
var hp : float = 100.0f;
var dead : GameObject;
var damage : float = 3.5f;
var delay : float = 1.0f;
var seeDistance : float = 100.0f;
var attackDistance : float = 2.0f;
private var time : float;
private var nav : NavMeshAgent;
private var Target : GameObject;

function Start () {
animation.AddClip(idleAnimation, "idle");
animation.AddClip(walkAnimation, "walk");
animation.AddClip(attackAnimation, "attack");
target = GameObject.FindWithTag("Player").transform;
nav = GetComponent(NavMeshAgent);
}

function ApplyDamage(d : float) {
hp -=d;
if(hp<=0) {
Instantiate(dead, transform.position, transform.rotation);
Destroy(gameObject);
}
}

function Update () {

if(Vector3.Distance(transform.position, target.transform.position) < seeDistance) {
if(Vector3.Distance(transform.position, target.transform.position) > attackDistance) {
animation.CrossFade("walk");
nav.enabled = true;
nav.SetDestination(target.position);
}else{
if(Time.time > time) {
animation.CrossFade("attack");
nav.enabled = false;
target.SendMessage("ApplyDamage", damage, SendMessageOptions.DontRequireReceiver);
time = Time.time + delay;
}

}
}else{
animation.CrossFade("idle");
nav.enabled = false;
}

}


Добавь NavMeshAgent на зомби, затем Window->Navigation за место меню инспектора появится меню навигатора, нажми All и внизу кнопку Bake
Аватара пользователя
TenebrosiUltories
UNец
 
Сообщения: 15
Зарегистрирован: 21 фев 2013, 16:51
Откуда: Россия, Чита
  • Сайт

Re: AI Zombie

Сообщение seaman 27 фев 2013, 07:40

Некро детектед. Тема уже давно соответствует названию.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: AI Zombie

Сообщение elf01 10 окт 2013, 21:29

TenebrosiUltories писал(а):зачем тебе что-то переделывать?Вот держи скрипт:

Добавь NavMeshAgent на зомби, затем Window->Navigation за место меню инспектора появится меню навигатора, нажми All и внизу кнопку Bake


За AI Спасибо, но скажите почему там где в скрипте прописан target вылазит ошибка :
Код: Выделить всё
BCE0005: Unknown identifier: 'target'.
? Пробовал их прибрать, так вообще выкинуло из unity.
elf01
UNIверсал
 
Сообщения: 370
Зарегистрирован: 07 июл 2013, 08:59

Re: AI Zombie

Сообщение som2001 04 дек 2013, 17:43

Поменяй на Target (с большой буквы)
Должно получиться.
Если тема старая, то сорь заранее. ^:)^ :-bd
Аватара пользователя
som2001
UNец
 
Сообщения: 19
Зарегистрирован: 04 дек 2013, 17:09

Re: AI Zombie

Сообщение Hamel2517 01 фев 2014, 21:15

Вы не могли бы написать для меня весь скрипт ото я полный нуб [curved_hands] [curved_hands]
Hamel2517
UNец
 
Сообщения: 7
Зарегистрирован: 23 ноя 2013, 16:53


Вернуться в Искуственный Интеллект

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1