2015-09-17 3 views
1

Я создаю игру для третьего лица, в которой игрок является вертолетом, и он может стрелять в другие объекты во время движения. Проблема в том, что я пытаюсь найти объекты противника, которые находятся внутри круга в центре камеры, и мне нужно отслеживать их и стрелять в них.Столкновение Обнаружение объектов в определенной области камеры в Unity3d

Raycast не поможет, поскольку мне нужен более толстый raycast, и поэтому я попробовал сферический и капсулирующий. У меня есть элемент GUI, который дает игроку представление о том, где он может стрелять. При использовании Spherecast или Capsulecast, он работает, когда враг близок, но когда враг находится далеко позади, я думаю, что сферический каток становится маленьким при движении по z и не делает Лучше всего поражать объект.

if (Physics.SphereCast (startPoint, 1f, transform.forward, out hit)) { 
      if (hit.collider.CompareTag ("Shootable")){ 
       Debug.Log(hit.collider.name); 
       Destroy(hit.collider.gameObject); 
      } 
     } 

I want to track objects which are inside the circle in the center

Я видел raycast из камеры и поэтому мне было интересно, если есть что-то делать, как circlecast с камеры, которая была бы подходящей для этого. Если нет, то как я могу продолжить?

Любая помощь действительно оценена.

+1

Если вы хотите обнаружить врагов, находящихся внутри конической области в окне просмотра вашей камеры, вместо использования сферы/raycast, вы можете попробовать проверить угол позиции врага относительно передней части камеры вектор. (Взято из [этого единственного ответа] (http://answers.unity3d.com/questions/261539/how-to-make-a-raycast-have-a-waider-range-of-hit.html).) – Serlite

+0

Спасибо за ответ. Чтобы сделать это, мы должны пропустить все враги, видимые в камере. Если у меня много врагов на сцене ... это не повлияет на производительность, так как я должен запустить это в обновлении –

+0

Хм, какой порядок составляет ожидаемое/максимальное количество врагов? Вероятно, стоит попробовать, чтобы проверить, действительно ли ваша производительность. – Serlite

ответ

1

Если вы хотите обнаружить, находятся ли враги в пределах конической области перед вашей камерой, использование SphereCast или RayCast не будет отвечать вашим потребностям.

Вместо этого вы можете проверить угол между относительным положением противника и вектором вперед камеры, чтобы увидеть, находится ли он ниже определенного значения и, следовательно, внутри конуса.

Для 60-градусного поля зрения, и если вы храните враг Transform компонентов в массиве/List, ваш код может выглядеть следующим образом:

foreach (Transform enemy in enemies){ 
    if (Vector3.Angle(transform.forward, enemy.position - transform.position) < 30){ 
     Destroy(enemy.gameObject); 
    } 
} 

Надеется, что это помогает! Дайте знать, если у вас появятся вопросы. (Ответ адаптирован из this Unity question.)

+0

Спасибо. Я не испытывал резкого снижения производительности, поэтому я думаю, что буду придерживаться этого метода. –

+0

Отличный, рад, что я смог помочь. – Serlite

Смежные вопросы