2013-09-20 1 views
0

У меня есть следующий код в функции Update:Физика RayCast Перемещение объекта к камере или происхождения

if (Input.GetButton("Fire1")) 
{ 
    mouseFollow = Camera.main.ScreenPointToRay(Input.mousePosition); 

    if (Physics.Raycast(mouseFollow, out hit)) 
    { 
     target_point = hit.point; 
     if (blade_created == false) 
     { 
      blade = (GameObject)Instantiate(Blade, target_point, Quaternion.Euler(90, 0, 0)); 
      blade_created = true; 
     } 

     if (blade != null) blade.transform.position = hit.point; 
     Debug.DrawLine(mouseFollow.origin, target_point, Color.red); 
    } 
} 

GameObject лезвие следует положение мыши правильно, но когда я, удерживая кнопку (FIRE1), без эффекта перемещения мыши лезвие (GameObject) перемещается к камере, которая является источником пересекающегося луча. Почему это происходит? Возможно, есть проблема с RaycastHit экземпляром?

Я инициализировал его как в области «Обновление функции», так и в верхней части кода (глобальная область.), Но ничего не изменилось. Как это можно исправить? Спасибо заранее.

ответ

0

Я нашел проблему. Его состояние if (blade != null). Когда вы проверяете нулевой клинок. он всегда будет возвращать false, поскольку вы создали клинок при первом щелчке. И проблема начинается. После того, как мы создадим лезвие, мы просто продолжаем проверять hit.point и превращаем лезвие в эту точку. Мы также должны проверить объект, на котором произошел удар.

В вашем случае, предположим, что на заднем плане есть плоскость. Итак, мы получили на нем hit.point. Но как только мы получаем экземпляр клинка, мы нашли «Blade (Clone)» как объект-хит, и он продолжает трансформировать Blade в новую точку попадания (то есть на поверхность этого клинка не по происхождению клинок).

Перед тем, как преобразовать лезвие, вы должны проверить предмет удара, как следующий код.

if (Input.GetButton("Fire1")) 
    { 
     if(Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit)) 
     { 
      target_point = hit.point; 
      if (blade_created == false) 
      { 
       blade = (GameObject)Instantiate(Blade, target_point, Quaternion.Euler(90, 0, 0)); 
       blade_created = true; 
      } 

      if (blade != null && hit.transform.name != "Blade(Clone)") 
       blade.transform.position = hit.point; 

     } 
    } 

Я надеюсь, что это решает вашу проблему, поскольку я протестировал код и вставил его здесь. Ответьте на свой ответ. Для быстрого ответа на любые сомнения посетите chatroom для разработчиков Unity3d

+0

Я думаю, что избиратель не понимал английский. Этот код проверен и работает нормально. – Nick

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