2017-01-29 11 views
0

У меня есть персонаж в Unity, что я использую raycast, чтобы он прыгал. Но даже когда raycast не ударился о землю (я вижу луч с выходом отладки), игрок все еще может прыгать. Любые идеи, почему луч всегда думает, что он сталкивается? Может ли луч ударить по моему коллайдеру персонажа, что может быть правдой? Я искал онлайн в течение нескольких часов, и ничего не нашел, это исправление ситуации. Вот мой код:Unity Raycast всегда возвращает true

void FixedUpdate() 
{ 
    Ray ray = new Ray(); 
    RaycastHit hit; 
    ray.origin = transform.position; 
    ray.direction = Vector3.down; 
    bool output = Physics.Raycast(ray, out hit); 
    Debug.DrawRay(ray.origin, ray.direction, Color.red); 
    if (Input.GetKey(KeyCode.Space) && output) 
    { 
     r.AddForce(Vector3.up * 1f, ForceMode.VelocityChange); 

    } 

} 
+0

Вы пытались переместить 'ray.origin', чтобы быть вне вашего коллайдера персонажа? – Kolichikov

+0

Да, поэтому, когда я ставлю луч ниже (ниже персонажа и земли), нет прыжка, что имеет смысл. Но я просто положил его ниже персонажа (все еще над землей, как можно ближе к уровню с ногами персонажей), он никогда не обнаруживает землю и постоянно позволяет прыгать – SJR59

+0

также, когда я помещаю луч над моим персонажем, как далеко выше , он все еще позволяет прыгать ... – SJR59

ответ

2

Может луч ударять мой характер коллайдер?

Да, это возможно.

Это на самом деле проблема, которая может быть легко решена с помощью Debug.Log.

Поместите Debug.Log("Ray Hit: " + hit.transform.name); внутри оператора if, и он покажет, какой объект блокирует Raycast.

Если это действительно проблема, сообщение this описывает множество способов исправить это. Этот ответ и код немного меняются, потому что этот вопрос касается 3D не 2D. Просто используйте слой. Поместите игрока в слой 9, тогда проблема должна исчезнуть.

void FixedUpdate() 
{ 
    int playerLayer = 9; 

    //Exclude layer 9 
    int layerMask = ~(1 << playerLayer); 


    Ray ray = new Ray(); 
    RaycastHit hit; 
    ray.origin = transform.position; 
    ray.direction = Vector3.down; 
    bool output = Physics.Raycast(ray, out hit, 100f, layerMask); 



    Debug.DrawRay(ray.origin, ray.direction, Color.red); 
    if (Input.GetKey(KeyCode.Space) && output) 
    { 
     r.AddForce(Vector3.up * 1f, ForceMode.VelocityChange); 
     Debug.Log("Ray Hit: " + hit.transform.name); 
    } 
} 
+0

Привет! из вывода журнала отладки он попал в коллайдер персонажа! Но исправление слоя, о котором вы говорили, похоже, не работает, есть ли что-то большее, чем просто заменить мой код на вышеупомянутый код? Должен ли я «поместить» своего персонажа в слой 9 каким-то другим способом? – SJR59

+0

Создайте слой в слое 9, затем назовите его «Player». Выберите своего персонажа, а слой - «Player». Когда я говорю слой, я не имею в виду * Tag *. Посмотрите [this] (https://unity3d.com/learn/tutorials/topics/interface-essentials/layers) видео youtube о создании и изменении слоев. Когда это будет сделано и не будет работать, увеличьте '100f' примерно до' 800f' и посмотрите, что произойдет. – Programmer

+0

Вы также можете заменить '100' на' Mathf.Infinity' – Programmer