Raycast

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

Raycast

Сообщение zarex 01 дек 2015, 10:54

Как правильно делать Raycast с проверкой на пересечение с колайдерами?

Допустим у нас есть бластер который не должен стрелять если на пути между его transform и transform цели находится нечто, например стена.
zarex
UNITрон
 
Сообщения: 178
Зарегистрирован: 31 июл 2015, 19:49

Re: Raycast

Сообщение samana 01 дек 2015, 11:28

Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class Shoot : MonoBehaviour
{
    // объект-цель, в который будем пускать луч
    public Transform target;
   
    void Update()
    {
        //сюда запишется инфо о пересечении луча, если оно будет
        RaycastHit hit;
        //сам луч, начинается от позиции этого объекта и направлен в сторону цели
        Ray ray = new Ray(transform.position, target.position - transform.position);
        //пускаем луч
        Physics.Raycast(ray, out hit);

        //если луч с чем-то пересёкся, то..
        if (hit.collider != null)
        {
            //если луч не попал в цель
            if (hit.collider.gameObject != target.gameObject)
                Debug.Log("Путь к врагу преграждает объект: "+hit.collider.name);
            //если луч попал в цель
            else
                Debug.Log("Попадаю во врага!!!");

            //просто для наглядности рисуем луч в окне Scene
            Debug.DrawLine(ray.origin, hit.point,Color.red);
        }
    }
}


Либо, принимать за цель, все объекты с каким нибудь тегом (например Enemy).
Синтаксис:
Используется csharp
RaycastHit hit;
//сам луч, начинается от позиции этого объекта и направлен по оси Z
Ray ray = new Ray(transform.position, transform.forward);
Physics.Raycast(ray, out hit);

Debug.DrawRay(ray.origin, ray.direction * 100, Color.blue);
//если луч с чем-то пересёкся, то..
if (hit.collider != null)
{
    //если луч попал в объект с тегом Enemy
    if (hit.collider.CompareTag("Enemy"))
        Debug.Log("Попадаю во врага!!!");
    //если луч попал куда-то в другой объект
    else
        Debug.Log("Путь к врагу преграждает объект: " + hit.collider.name);

    Debug.DrawLine(ray.origin, hit.point, Color.red);
}
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Raycast

Сообщение Cr0c 01 дек 2015, 14:24

Рейкаст даст true только при коллизии в коллайдер (подпадающий под маску слоёв), иначе даст false.
Поэтому
Синтаксис:
Используется csharp
if (Physics.Raycast(что-то-там-с-параметрами))
а не просто Raycast
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: Raycast

Сообщение samana 01 дек 2015, 14:43

Cr0c писал(а):Рейкаст даст true только при коллизии в коллайдер (подпадающий под маску слоёв), иначе даст false.
Поэтому
Синтаксис:
Используется csharp
if (Physics.Raycast(что-то-там-с-параметрами))
а не просто Raycast

А, да, точно, вы правы... я частенько об этом забываю. Спасибо.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск


Вернуться в Почемучка

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

Сейчас этот форум просматривают: GoGo.Ru [Bot] и гости: 37