2015-12-01 4 views
0

Я объясню свою проблему (мой английский немного извините).Unity 3D: UI Изображение в направлении игрового объекта

У меня есть плеер (камера), который способен перемещаться по сцене Unity. В этой сцене есть некоторые GameObjects. Те GameObjects Может быть слишком далеко для камеры, чтобы видеть. Я хочу добиться того, чтобы изображение пользовательского интерфейса отображалось в направлении каждого объекта. Даже если объекты слишком далеко.

Пример: Игрок стоит на позиции. Перед ним есть объект, который далеко. Я хочу иметь графический интерфейс на экране, который говорит «есть объект на расстоянии 200 м». Если за ним стоит объект, я не хочу, чтобы что-то появлялось. Но если он вернется, это будет означать, что игрок находится в направлении указанного GameObject.

Я действительно надеюсь, что я сделал себя ясным. Скажите, пожалуйста, если вам нужны дальнейшие объяснения. Благодарим вас!

ответ

1

Отвечая на старый вопрос о себе:

Вот что я сделал:

if (markIsOp) //Check if it's worth calculating 
{ 

     //Calculs the Viewport Position of the object 
     Vector3 ViewportPosition = Camera.main.WorldToViewportPoint (transform.position); 

     //Calculs it's Unity Canvas position (O.5f because UI anchor is middle) 
     Vector2 WorldObject_ScreenPosition = new Vector2 (
               ((ViewportPosition.x * mainCanvasRect.sizeDelta.x) - (mainCanvasRect.sizeDelta.x * 0.5f)), 
               ((ViewportPosition.y * mainCanvasRect.sizeDelta.y) - (mainCanvasRect.sizeDelta.y * 0.5f))); 

     //Making sure it's forward (markRect is my UI Element's RectTransform) 
     if (ViewportPosition.z > 0) 
      markRect.anchoredPosition = WorldObject_ScreenPosition; 
} 

Спасибо за ваши ответы. Имейте хороший

0

Используйте raycast от игрока к игровому объекту и вычислите разницу.

+0

Что значит разница? Я считаю, что недостаточно отображать пользовательский интерфейс в нужном месте? Извините, я новичок во всем этом. – tinkz

+0

Нет необходимости в raycast, просто Vector3.Distance (objA, objB); – Everts

+0

Спасибо, ребята, это прекрасно работает для дистанционной части. Моя самая большая проблема заключается в отображении пользовательского интерфейса в правильном направлении объекта. – tinkz

0

Вы можете использовать Camera.WorldToScreenPoint для вычисления «UI-Position» ваших GameObjects, а затем рассчитать расстояние, используя z-координаты Gameobjects и Camera.

+0

Эй, спасибо за ответ. Вот немного моего кода: \t Vector3 tempPos1 = arCam.WorldToScreenPoint (pos); \t \t tempPos1.z = -40; \t \t img1.rectTransform.localPosition = tempPos1; pos - позиция gameObject. Я блокирую позицию Z, чтобы не считать расстояние объекта, не имеет значения для отображения пользовательского интерфейса. В любом случае, это отображает пользовательский интерфейс, но не в нужном месте, я не знаю, что делаю неправильно. В любом случае благодарим вас за вашего приятеля – tinkz