Raycast не работает в методе запуска, но работает в методах fixupdate с тем же кодом - PullRequest
0 голосов
/ 14 июля 2020

Фон

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

Что я сделал

Поэтому я помещаю код в начало, который выглядит следующим образом:

void Start()
    {
        GameObject start = GameObject.CreatePrimitive(PrimitiveType.Cube);
        GameObject end = GameObject.CreatePrimitive(PrimitiveType.Cube);
        start.transform.position = new Vector3(20, 20, 12);
        end.transform.position = new Vector3(-20, 20 , 10);

        GameObject safeZone = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
        safeZone.transform.position = Vector3.zero;
        safeZone.transform.localScale = new Vector3(40, 40 ,40);

        bool ifCross = Physics.Raycast(start.transform.position,
            (end.transform.position - start.transform.position),
            out RaycastHit hit, Mathf.Infinity);
        if (ifCross)
        {
            Debug.Log("success");
            Debug.DrawRay(start.transform.position,
                (end.transform.position - start.transform.position),
                Color.green, 100f);
            Debug.Log(hit.collider.gameObject.name);
        }
        else
        {
            Debug.Log("fail");
            Debug.DrawRay(start.transform.position,
                (end.transform.position - start.transform.position),
                Color.red, 100f);
        }


    }

Этот код всегда возвращает ошибку , но в сцене луч отладки попадает в цилиндр.

То, что я пробовал:

  • Переместите связанный код ifCross для обновления, он работает правильно и возвращает исключенный результат.
  • Вместо создания куба в начале, если я сделаю объект кубов publi c и нарисую кубики в редакторе единства, он будет работать нормально. (работает только тогда, когда позиция установлена ​​в редакторе единства, но это не то, что я хочу, потому что мне нужна случайная позиция для кубов.

Вопрос

Почему raycast работает в обновлении, но не в старте? Почему заранее установленные кубы могут работать в старте? Как сделать случайное положение кубов в старте и заставить работать raycast?

Любые ссылки приветствуются. Спасибо за ваше время.

1 Ответ

1 голос
/ 14 июля 2020

Если вы посмотрите на порядок выполнения жизненного цикла скрипта в Unity , вы увидите, что Start выполняется перед FixedUpdate.

Поскольку FixedUpdate - это место, где физическая система выполняет свои вычисления столкновений вызов Physics.Raycast в вашем методе Start не будет знать, где находятся / будут находиться коллайдеры, и поэтому не сможет определить, пересек ли луч коллайдер.

Возможно, вы сможете найти работоспособный решение с использованием Physics.Simulate .

...