2015-12-10 5 views
1

В настоящее время я работаю над практическим проектом, который предусматривает укладку блоков. Это похоже на игру штабелеров (аркадная игра), за исключением того, что моя версия использует движение свободной формы вместо движения на основе сетки.Результаты Unity Raycast2D не ожидаются?

У меня есть 3 сборника для блоков: SingleBlock, DoubleBlock, TripleBlock.

Я структурировал каждый из них следующим образом: родитель представляет собой пустой объект игры с моим MovementScript, который перемещает их влево/вправо, а дети - это блок-спрайт с BoxCollider2D.

The MovementScript привязан к пустующему игровому объекту (родительскому), так что набор блоков перемещается равномерно влево/вправо, для чего он стоит.

Для фактической логики стекирования я использую Raycast2D, чтобы определить, есть ли блок ниже. Но проблема в том, что результаты, которые я получаю, являются неожиданными.

Вот фрагмент моего текущего кода:

foreach(Transform t in currentBlockSet.transform) 
      { 
       // get all the children of this blockset. to do this, we use the transform beause it is IEnumerable 
       GameObject block = t.gameObject; 
       RaycastHit2D hit = Physics2D.Raycast(block.transform.position, Vector3.down, rayCastLength); // 0.5f raycast length 
       //Debug.DrawRay(block.transform.position, Vector3.down * rayCastLength); 
       if(hit.collider != null) 
       { 
        // this means there is a block below, we hit something 
        Debug.Log("True"); 


       } 
       else 
       { 
        Debug.Log("False"); 
       } 

      } 

Этот код называется каждый раз, когда игрок останавливает текущий Blockset, который движется по пути.

Проблема в том, что я всегда получаю true в своих журналах, хотя я намеренно не выровнял блок правильно. Я никогда не получаю false, даже если я ухожу с моим выравниванием. Почему это так?

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

Есть ли что-то не так с логикой или как я использую Raycast2D?

Цените любую помощь.

+0

Попробуйте увеличить 'rayCastLength'. Также измените 'Vector3.down' на' -Vector2.up' –

ответ

1

Я верю, что происходит, что Raycast2D обнаруживает блок, от которого он стреляет. Поскольку вы используете блок transform.position в качестве источника Raycast, это означает, что Raycast будет снимать с центра блока.

Чтобы проверить это, я слегка изменил ваш код, чтобы он срабатывал так же, как Raycast, но вместо того, чтобы записывать только «True», я зарегистрировал имя удаляемого объекта.

void Update() 
{ 
    RaycastHit2D hit = Physics2D.Raycast(this.transform.position, Vector3.down, 0.5f); // 0.5f raycast length 

    if (hit.collider != null) 
    { 
     Debug.Log(hit.collider.gameObject.name); 
    } 
    else 
    { 
     Debug.Log("False"); 
    } 

При запуске, объект, который был обнаружен Raycast, как и ожидалось, был объект по Raycast был происходящий из.

Чтобы решить эту проблему, я бы предложил добавить пустой объект GameObject для ваших блоков под названием «RaycastOrigin». Расположите этот объект GameObject как раз под блоком так, чтобы он находился вне коллайдера блока. Затем вы стреляете из Raycast из «RaycastOrigin», а не из блоков transform.position Таким образом, Raycast не ударил по блоку с его съемки, а скорее под ним.

+0

Я ценю подробный ответ. Я также пробовал отлаживать с collider.tag и collider.gameObject.name так же, как вы, и я могу подтвердить, что Raycast обнаруживал блок, из которого он был создан. Я попробовал ваше предложение о создании пустого дочернего GameObject под коллайдером блока и получил от него raycast, и теперь он работает как ожидается. – aresz

 Смежные вопросы

  • Нет связанных вопросов^_^