Бот на БОТА

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

Бот на БОТА

Сообщение writendemon 05 июл 2012, 13:17

Хотел сделать атаку бота на бота но замена тега в стандартном AI скрипте непомогоет БОТЫ игрорируют друг друга.
Прошу помощи а то уже заматался чтото исправлять.
Заранее Благодарен!
{S возможно проблема здесть: function Start () {
// Auto setup player as target through tags
if (target == null && GameObject.FindWithTag("Player"))
target = GameObject.FindWithTag("Player").transform;
Но незнаю что можно предпренять.
Синтаксис:
Используется javascript
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;

 // Make sure there is always a character controller
 @script RequireComponent (CharacterController)

 function Start () {
  // Auto setup player as target through tags
  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;
   // Are we close to a waypoint? -> pick the next one!
   if (Vector3.Distance(waypointPosition, transform.position) < pickNextWaypointDistance)
    curWayPoint = PickNextWaypoint (curWayPoint);

   // Attack the player and wait until
   // - player is killed
   // - player is out of sight  
   if (CanSeeTarget ())
    yield StartCoroutine("AttackPlayer");
   
   // Move towards our target
   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 () {
  // Start shoot animation
  animation.CrossFade("shoot", 0.3);

  // Wait until half the animation has played
  yield WaitForSeconds(delayShootTime);
   
  // Fire gun
  BroadcastMessage("Fire");
   
  // Wait for the rest of the animation to finish
  yield WaitForSeconds(animation["shoot"].length - delayShootTime);
 }

 function AttackPlayer () {
  var lastVisiblePlayerPosition = target.position;
  while (true) {
   if (CanSeeTarget ()) {
    // Target is dead - stop hunting
    if (target == null)
     return;

    // Target is too far away - give up  
    var distance = Vector3.Distance(transform.position, target.position);
    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);

    // Start shooting if close and play is in sight
    if (distance < shootRange && angle < shootAngle)
     yield StartCoroutine("Shoot");
   } else {
    yield StartCoroutine("SearchPlayer", lastVisiblePlayerPosition);
    // Player not visible anymore - stop attacking
    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;
  }
   
  // Rotate towards the target
  transform.rotation = Quaternion.Slerp (transform.rotation, Quaternion.LookRotation(direction), rotationSpeed * Time.deltaTime);
  transform.eulerAngles = Vector3(0, transform.eulerAngles.y, 0);

  // Modify speed so we slow down when we are not facing the target
  var forward = transform.TransformDirection(Vector3.forward);
  var speedModifier = Vector3.Dot(forward, direction.normalized);
  speedModifier = Mathf.Clamp01(speedModifier);

  // Move the character
  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;
 }
writendemon
UNец
 
Сообщения: 12
Зарегистрирован: 25 июн 2012, 13:01

Re: Бот на БОТА

Сообщение seaman 05 июл 2012, 15:02

замена тега в стандартном AI скрипте непомогоет

В приведенном ничего не поменяно.
Но незнаю что можно предпренять.

Заменить тэг на тот, который у бота.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Бот на БОТА

Сообщение writendemon 06 июл 2012, 09:34

Заменя тега непомагает!!! Я уже написал. Бот игнорирует своего врага и идет к выйпоинту.
writendemon
UNец
 
Сообщения: 12
Зарегистрирован: 25 июн 2012, 13:01

Re: Бот на БОТА

Сообщение seaman 06 июл 2012, 09:49

на тот, который у бота.

У бота тег какой? В скрипте тег какой?
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Бот на БОТА

Сообщение writendemon 06 июл 2012, 11:54

Bot1
writendemon
UNец
 
Сообщения: 12
Зарегистрирован: 25 июн 2012, 13:01

Re: Бот на БОТА

Сообщение writendemon 06 июл 2012, 11:56

Синтаксис:
Используется javascript
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;

 // Make sure there is always a character controller
 @script RequireComponent (CharacterController)

 function Start () {
  // Auto setup player as target through tags
  if (target == null && GameObject.FindWithTag("Bot1"))
   target = GameObject.FindWithTag("Bot1").transform;

  Patrol();
 }

 function Patrol () {
  var curWayPoint = AutoWayPoint.FindClosest(transform.position);
  while (true) {
   var waypointPosition = curWayPoint.transform.position;
   // Are we close to a waypoint? -> pick the next one!
   if (Vector3.Distance(waypointPosition, transform.position) < pickNextWaypointDistance)
    curWayPoint = PickNextWaypoint (curWayPoint);

   // Attack the player and wait until
   // - player is killed
   // - player is out of sight  
   if (CanSeeTarget ())
    yield StartCoroutine("AttackBot1");
   
   // Move towards our target
   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 () {
  // Start shoot animation
  animation.CrossFade("shoot", 0.3);

  // Wait until half the animation has played
  yield WaitForSeconds(delayShootTime);
   
  // Fire gun
  BroadcastMessage("Fire");
   
  // Wait for the rest of the animation to finish
  yield WaitForSeconds(animation["shoot"].length - delayShootTime);
 }

 function AttackBot1 () {
  var lastVisibleBot1Position = target.position;
  while (true) {
   if (CanSeeTarget ()) {
    // Target is dead - stop hunting
    if (target == null)
     return;

    // Target is too far away - give up  
    var distance = Vector3.Distance(transform.position, target.position);
    if (distance > shootRange * 3)
     return;
     
    lastVisibleBot1Position = target.position;
    if (distance > dontComeCloserRange)
     MoveTowards (lastVisibleBot1Position);
    else
     RotateTowards(lastVisibleBot1Position);

    var forward = transform.TransformDirection(Vector3.forward);
    var targetDirection = lastVisibleBot1Position - transform.position;
    targetDirection.y = 0;

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

    // Start shooting if close and play is in sight
    if (distance < shootRange && angle < shootAngle)
     yield StartCoroutine("Shoot");
   } else {
    yield StartCoroutine("SearchPlayer", lastVisibleBot1Position);
    // Player not visible anymore - stop attacking
    if (!CanSeeTarget ())
     return;
   }

   yield;
  }
 }

 function SearchBot1 (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;
  }
   
  // Rotate towards the target
  transform.rotation = Quaternion.Slerp (transform.rotation, Quaternion.LookRotation(direction), rotationSpeed * Time.deltaTime);
  transform.eulerAngles = Vector3(0, transform.eulerAngles.y, 0);

  // Modify speed so we slow down when we are not facing the target
  var forward = transform.TransformDirection(Vector3.forward);
  var speedModifier = Vector3.Dot(forward, direction.normalized);
  speedModifier = Mathf.Clamp01(speedModifier);

  // Move the character
  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;
 }
writendemon
UNец
 
Сообщения: 12
Зарегистрирован: 25 июн 2012, 13:01

Re: Бот на БОТА

Сообщение Citrus 19 авг 2012, 12:42

Посмотри может у них стоит ignore RAYCAST ВО ВКЛАДКЕ layer
System Of A Down Rock'n'Roll music FOREVER
Скрытый текст:
Аватара пользователя
Citrus
UNIт
 
Сообщения: 147
Зарегистрирован: 05 авг 2012, 12:24

Re: Бот на БОТА

Сообщение AndreyMust19 19 авг 2012, 14:54

Physics.Linecast (transform.position, target.position, hit)

Убедитесь что коллайдерам ботов присвоен одинаковый layer (см. над координатами), а в настройках физики (Project Settings -> Physics) в треугольной матрице на их пересечении стоит галочка. Еще проверьте что попадание действительно происходит.
А если вдруг вместо коллайдеров вы используете триггеры, надо снять галочку "игнорировать пуск лучей для триггеров".
Нужна помощь? Сами, сами, сами, сами, сами... делаем все сами
AndreyMust19
Адепт
 
Сообщения: 1119
Зарегистрирован: 07 июн 2011, 13:19

Re: Бот на БОТА

Сообщение BornFoRdeatH 31 окт 2012, 16:00

Если это ИИ из ангри ботс, то замена тегов нужна в ИИ и в атак контролере.
Не бойся, если ты один, бойся, если ты ноль.
BornFoRdeatH
Адепт
 
Сообщения: 2377
Зарегистрирован: 22 окт 2011, 23:41
Откуда: Украина
Skype: bornfordeath


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

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

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