Наведение на цель

Программирование на Юнити.

Наведение на цель

Сообщение crocodile 25 окт 2010, 13:48

Есть турелька, наводится на цель. Как узнать что она уже нацелена, т.е. видит цель, а не в стадии поворота к ней?
crocodile
UNец
 
Сообщения: 21
Зарегистрирован: 15 окт 2010, 13:05
  • ICQ

Re: Наведение на цель

Сообщение AndrewSt 25 окт 2010, 14:10

Выпускай луч (Ray) из ствола турели, и если луч пересекает цель то уже нацелена.

Смотри в справке классы Ray и RaycastHit.
AndrewSt
UNIт
 
Сообщения: 72
Зарегистрирован: 10 дек 2009, 13:36
Откуда: СПБ
  • ICQ

Re: Наведение на цель

Сообщение Zaicheg 25 окт 2010, 14:22

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

Re: Наведение на цель

Сообщение Pyx 25 окт 2010, 14:23

Как вариант, вы можете через Quaternion.LookRotation определить величину поворота,а через Quaternion.Slerp повернуть именно на эту величину.И через булевую переменную определять нацелена или нет.
Pyx
 

Re: Наведение на цель

Сообщение crocodile 25 окт 2010, 15:02

Код: Выделить всё
var hit : RaycastHit;

if(Physics.Linecast(transform.position, target.position, hit))
{
   return true;
}


Не работает. :( Может это не тот код что нужен?

Через какую булевую переменную?
crocodile
UNец
 
Сообщения: 21
Зарегистрирован: 15 окт 2010, 13:05
  • ICQ

Re: Наведение на цель

Сообщение Kann 25 окт 2010, 15:03

Синтаксис:
Используется csharp
Vector3 forward = transform.TransformDirection(Vector3.forward);
        Vector3 targetDirection = VisibleTarget - transform.position;
        float angle = Vector3.Angle(targetDirection, forward);
Kann
Старожил
 
Сообщения: 553
Зарегистрирован: 05 ноя 2009, 14:06

Re: Наведение на цель

Сообщение crocodile 25 окт 2010, 15:05

Плворачиваю как-раз так же:
Код: Выделить всё
var targetRotation = Quaternion.LookRotation(target.position - transform.position, Vector3.up);
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * gunSpeed);
crocodile
UNец
 
Сообщения: 21
Зарегистрирован: 15 окт 2010, 13:05
  • ICQ

Re: Наведение на цель

Сообщение crocodile 25 окт 2010, 15:16

Kann писал(а):
Синтаксис:
Используется csharp
Vector3 forward = transform.TransformDirection(Vector3.forward);
        Vector3 targetDirection = VisibleTarget - transform.position;
        float angle = Vector3.Angle(targetDirection, forward);

Это #?
Значит примерно так:
Код: Выделить всё
forward : Vector3 = transform.TransformDirection(Vector3.forward);
targetDirection : Vector3 = VisibleTarget - transform.position;
angle : float = Vector3.Angle(targetDirection, forward);


А что за переменная VisibleTarget?
crocodile
UNец
 
Сообщения: 21
Зарегистрирован: 15 окт 2010, 13:05
  • ICQ

Re: Наведение на цель

Сообщение crocodile 25 окт 2010, 15:27

:) Разобрался.
Код: Выделить всё
var forward = transform.forward;
var targetDir = target.position - transform.position;
var angle = Vector3.Angle(targetDir, forward);


Это если с углом. А что-нть с видимостью например коллайдера?

Включаю и выключаю партиклы (типа огонь) из ствола.
Враги могут быть разного размера.
crocodile
UNец
 
Сообщения: 21
Зарегистрирован: 15 окт 2010, 13:05
  • ICQ

Re: Наведение на цель

Сообщение Pyx 25 окт 2010, 15:55

Collider.Raycast
Pyx
 

Re: Наведение на цель

Сообщение Kann 25 окт 2010, 16:47

Синтаксис:
Используется javascript
var hit : RaycastHit;
        if (Physics.Linecast (transform.position, target.position, hit))
                return hit.transform == target;
Kann
Старожил
 
Сообщения: 553
Зарегистрирован: 05 ноя 2009, 14:06

Re: Наведение на цель

Сообщение crocodile 25 окт 2010, 23:32

cЯ тоже пользовал такой скрипт:
Код: Выделить всё
if(Physics.Linecast(transform.position, target.position, hit))
   {
      if(hit.collider.gameObject.tag != "enemy")
      {
         barrelFire.renderer.enabled = false;
         return false;
      }
      else
      {
         barrelFire.renderer.enabled = true;
         return true;
      }
   }

Он здесь смотрит тэг.
Но он сразу включает партиклы.
И даже так:
Код: Выделить всё
var hit : RaycastHit;
if (Physics.Linecast (transform.position, target.position, hit))
{
   //return hit.transform == target;
      if(hit.transform == target)
   {
      barrelFire.renderer.enabled = true;
   }
}

он работает аналогично тому что выше. Т.е. башня видит его даже не повернувшись...
crocodile
UNец
 
Сообщения: 21
Зарегистрирован: 15 окт 2010, 13:05
  • ICQ

Re: Наведение на цель

Сообщение Pyx 26 окт 2010, 00:16

Синтаксис:
Используется csharp
if(Quaternion.Angle (transform.rotation, target.rotation)<10f)
{
Atack();
}
 
Pyx
 

Re: Наведение на цель

Сообщение crocodile 26 окт 2010, 01:03

Да, придется остановиться на этом варианте с углом, до лучших времен :)
Код: Выделить всё
var forward = transform.forward;
var targetDir = target.position - transform.position;
var angle = Vector3.Angle(targetDir, forward);
if(angle < 10.0)
{
   barrelFire.renderer.enabled = true;
}
crocodile
UNец
 
Сообщения: 21
Зарегистрирован: 15 окт 2010, 13:05
  • ICQ

Re: Наведение на цель

Сообщение Kann 26 окт 2010, 01:36

вы должны делать проверку на луч и угол, если и то и то совпадает тогда стреляем, FPS Tutorial изучите для лучшего понимания.....
Kann
Старожил
 
Сообщения: 553
Зарегистрирован: 05 ноя 2009, 14:06

След.

Вернуться в Скрипты

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

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