Объекты все еще сталкиваются с Raycast, не понимаю, почему - PullRequest
0 голосов
/ 04 октября 2018

В моей сцене пара машин, все помечены как машины.У них есть сценарий под названием «Вождение», и я не понимаю, почему они до сих пор иногда рушатся с машиной впереди.К машинам прикреплен только сценарий и коробка-коллайдер.Что я делаю не так?

    Ray stopray = new Ray(transform.position, transform.forward);
    RaycastHit stophit;

    Ray carray = new Ray(transform.position, transform.forward);
    RaycastHit carhit;

    //here we have to slow down
    if (Physics.Raycast(carray, out carhit, 50) && carhit.transform.gameObject.tag == "car")
    {
        if (carhit.distance < 50 && carhit.distance> 12)
        {
            transform.Translate(0, 0, speed / 6 * Time.deltaTime);
        }
    }

    if (Physics.Raycast(carray, out carhit, 12) && carhit.transform.gameObject.tag == "car" || Physics.Raycast(stopray, out stophit, 8) && stophit.transform.gameObject.tag == "stop")
    {
        // Here we have to stop
        if (carhit.distance < 12)
        {
            transform.Translate(0, 0, 0);
        }

    }
    else
    {
        transform.Translate(0, 0, speed * Time.deltaTime);
    }

(на карте также есть невидимые стоп-кубы) Это заканчивается примерно так, и этого не должно происходить: enter image description here

Ответы [ 3 ]

0 голосов
/ 04 октября 2018

Убедитесь, что ваш raycast идет в том направлении, в котором вы определенно думаете.Вы можете просто добавить строку «Отладка», когда ваш Raycast ударит по чему-либо.Я бы предложил создать пустую сцену, а затем импортировать только две машины и любую «землю», на которой они остановились, чтобы проверить это.

Где-то есть документация (кажется, сейчас я ее не могу найти)) при создании радиопередач на самом деле рисуются в редакторе в виде красных линий, чтобы вы могли видеть, что происходит.

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

0 голосов
/ 05 октября 2018

Я предлагаю вам ввести локальную переменную скорости и инициализировать ее в соответствии с вашими условиями, а затем вызывать translate только один раз после проверки всех условий.Попробуйте это:

Ray stopray = new Ray(transform.position, transform.forward);
RaycastHit stophit;

Ray carray = new Ray(transform.position, transform.forward);
RaycastHit carhit;

// speed for the current frame
var currentSpeed = speed;

//here we have to slow down
if (Physics.Raycast(carray, out carhit, 50) && carhit.transform.gameObject.tag == "car")
{
    if (carhit.distance < 50 && carhit.distance> 12)
    {
        currentSpeed = speed / 6;
    }
}

if (Physics.Raycast(carray, out carhit, 12) && carhit.transform.gameObject.tag == "car" || Physics.Raycast(stopray, out stophit, 8) && stophit.transform.gameObject.tag == "stop")
{
    // Here we have to stop
    if (carhit.distance < 12)
    {
        currentSpeed = 0f;
    }
}

// move the car with right speed
transform.Translate(0, 0, currentSpeed * Time.deltaTime);
0 голосов
/ 04 октября 2018

Проблема решена: Луч прошел под машинами и никогда не видел ни одного, решение:

        Ray carray = new Ray(new Vector3 (transform.position.x, transform.position.y +1, transform.position.z), transform.forward);
    RaycastHit carhit;

Луч теперь немного выше и видит машину.

...