Unity 3D: изображение пользовательского интерфейса в направлении игрового объекта

Я объясню свою проблему (мой английский немного хромает, извините).

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

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

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


person tinkz    schedule 01.12.2015    source источник


Ответы (3)


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

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

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;
}   

Спасибо за ваши ответы. Приятного вам

person tinkz    schedule 21.03.2016

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

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

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

person christopher clark    schedule 01.12.2015
comment
В чем разница? Я считаю, что недостаточно отображать пользовательский интерфейс в нужном месте? Извините, я новичок во всем этом. - person tinkz; 01.12.2015
comment
Нет необходимости в raycast, просто Vector3.Distance (objA, objB); - person Everts; 02.12.2015
comment
Спасибо, ребята, это отлично работает для дистанционной части. Моя самая большая проблема связана с отображением пользовательского интерфейса в правильном направлении объекта. - person tinkz; 02.12.2015