Страница 1 из 1

Raycast

СообщениеДобавлено: 01 дек 2015, 10:54
zarex
Как правильно делать Raycast с проверкой на пересечение с колайдерами?

Допустим у нас есть бластер который не должен стрелять если на пути между его transform и transform цели находится нечто, например стена.

Re: Raycast

СообщениеДобавлено: 01 дек 2015, 11:28
samana
Синтаксис:
Используется 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);
}

Re: Raycast

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

Re: Raycast

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

А, да, точно, вы правы... я частенько об этом забываю. Спасибо.