2016-11-01 2 views
1

я создал текущую установку: enter image description hereRaycast детектирования от GameObject до геймобжекты

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

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

Мой код выглядит следующим образом:

int tileNumber = 0; 
     for (float y = 0; y > mapHeight; y--) 
     { 
      for (float x = 0; x < mapWidth; x++) 
      { 
       tile.GetComponent<Renderer>().enabled = true; 
       GameObject go = Instantiate(tile, new Vector3(x/3, y/3, -2), Quaternion.identity) as GameObject; 
       tileNumber++; 
       go.name = "tile" + tileNumber; 
       go.tag = "grid"; 

       RaycastHit hit; 
       Vector3 fwd = go.transform.TransformDirection(Vector3.forward); 
       Debug.DrawRay(go.transform.position, fwd * 50, Color.green); 
       if(Physics.Raycast(go.transform.position, fwd, out hit, 200)){ 
        go.tag = "walkableGrid"; 
       } 

      } 
     } 

Но луч Debug даже не показывает, а тег не изменяется.

Изображение, которое показывает лучи действительно работают, просто не обнаруживает свою карту сетку: enter image description here

EDIT: программист пытался мне помочь, но его решение не работает для меня. Он упомянул этот вопрос может лежать в другом месте, так что если кому-то интересно, как он есть, Heres мой проект: https://www.dropbox.com/s/535soeswrgq37b4/MTA16336_Project_Boardgame.rar?dl=0

+0

«Но это не работает. Даже отладка не появляется». В вашем коде нет Debug.Log. Что не работает и что работает? – Programmer

+0

Я верю, что «Debug.DrawRay (go.transform.position, fwd * 50, Color.green); должен показать видимый луч –

+0

Да, но это зависит от того, как часто он называется. Будет сложно понять, не вызван ли он каждый кадр. Вам нужно также добавить Debug.Log, чтобы убедиться, что часть кода достигнута. – Programmer

ответ

0

Это ничего не стоит, что ни один из моих «Карта» не возражает ни у rigibody ни коллайдер.

Physics.Raycast будет никогда работы без коллайдера.

Поскольку это 2D-игра, вы должны использовать Коробчик для коробки 2D. Кроме того, прикрепите к нему Rigidbody 2D.

И, наконец, Physics.Raycast используется только с none 2D-коллайдеры. Вы должны заменить это на RaycastHit2D.Raycast. Также необходимо заменить RaycastHitRaycastHit2D.

Чтобы сделать это проще, просто изменить:

RaycastHit hit; 
Vector3 fwd = go.transform.TransformDirection(Vector3.forward); 
Debug.DrawRay(go.transform.position, fwd * 50, Color.green); 
if (Physics.Raycast(go.transform.position, fwd, out hit, 200)) 
{ 
    go.tag = "walkableGrid"; 
} 

в

RaycastHit2D hit; 
Vector3 fwd = go.transform.TransformDirection(Vector3.forward); 
Debug.DrawRay(go.transform.position, fwd * 50, Color.green); 
hit = Physics2D.Raycast(go.transform.position, fwd, 200); 

if (hit) 
{ 
    go.tag = "walkableGrid"; 
} 

Теперь должно работать до тех пор, как Box Collider 2D прилагается к каждому блоку. Также присоедините к ним Rigidbody 2D. Если он падает, установите Гравитационная шкала на 0.

+0

Я использовал ваш точный код, добавил жесткое тело, протестировав как с краем-коллайдером, так и с коробкой-коллайдером, но код до сих пор не достигает кода внутри скобки. Он все еще работает как 2D-обнаружение, когда я конвертирую объекты в GameObjects в моем экземпляре? –

+0

«Он все еще работает как 2D-обнаружение, когда я конвертирую объекты в GameObjects в моем экземпляре?» Да. Помните, я сказал «Box Collider 2D» ** не ** «Box Collider». Это совершенно разные вещи. – Programmer

+0

В настоящее время я использую EdgeCollider2D, который дал этот результат. Затем тестировали с помощью Box Collider2D, все тот же результат. Хотел бы я дать больше информации, но это все, что я могу понять. –

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