Нарисуйте Rect с помощью GUI.DrawTexture точно в позиции игрового объекта Unity

Мне нужно использовать функцию "GUI.DrawTexture(new Rect..."), чтобы нарисовать прямоугольник на моем экране (на самом деле это градиентная полоса графического интерфейса, которую я получил от https://www.assetstore.unity3d.com/en/#!/content/19972, но внутри это просто прямоугольник) Я хочу сделать это рядом с игровым объектом, который у меня есть на экране.

Проблема в том, что координаты прямоугольника не совпадают с координатами игровых объектов (я искал в Интернете и думаю, что это правда). Я попробовал функцию ниже, чтобы преобразовать позицию игрового объекта в координаты прямоугольника, но все равно не повезло:

 public Vector2 WorldToGuiPoint(Vector2 position)
     {
         var guiPosition = Camera.main.WorldToScreenPoint(position);
         guiPosition.y = Screen.currentResolution.height - guiPosition.y;

         return guiPosition;
     }

Мой лучший удар был, когда я сделал это:

Vector3 gameObjectsPosition = Camera.main.WorldToScreenPoint(gameObject);

И затем, когда я хотел нарисовать прямоугольник, я сделал:

GUI.DrawTexture(new Rect(gameObjectsPosition.x, Screen.height - gameObjectsPosition.y, Background.width * ScaleSize, Background.height * ScaleSize), Background);

Но тем не менее Rect не находится точно в позиции gameObject. Это x правильно, а y нет, и когда я искал в Интернете, они сказали, что мне нужно было только сделать «Screen.height - gameObjectsPosition.y» при рисовании Rect. Это не сработало для меня, y все еще неправильно.

Что я должен сделать, чтобы создать прямоугольник, который находится прямо рядом с текущим игровым объектом на экране (например, если позиция игрового объекта x = -401 и y = -80, я хочу, чтобы он был на y = -80 и x = -300)


person user2997681    schedule 22.07.2016    source источник


Ответы (1)


Вам нужно использовать Screen.height вместо Screen.currentResolution.height

using UnityEngine;
using System.Collections;
public class GuiPosition : MonoBehaviour 
{

    public Vector2 WorldToGuiPoint(Vector3 GOposition)
    {
        var guiPosition = Camera.main.WorldToScreenPoint(GOposition);
        // Y axis coordinate in screen is reversed relative to world Y coordinate
        guiPosition.y = Screen.height - guiPosition.y;

        return guiPosition;
    }

    void OnGUI() 
    {
        var guiPosition = WorldToGuiPoint(gameObject.transform.position);
        var rect = new Rect(guiPosition, new Vector2(200, 70));
        GUI.Label(rect, "TEST");
    }
}

Я только что протестировал присоединение этого MonoBehaviour к Cube GameObject, и он работает.

person Ricardo Amores    schedule 22.07.2016
comment
Спасибо за вашу помощь, но для меня это все еще не сработало. Я думаю, это потому, что я должен использовать GuiBarScript.cs, который я получил из assetstore. unity3d.com/en/#!/content/19972, поэтому вместо обычного Rect я использую GUI.Drawtexture с фоном, например: GUI.DrawTexture(new Rect(gameObjectsPosition.x, Screen.height - gameObjectsPosition.y, Background.width * ScaleSize, Background.height * ScaleSize), Background); - person user2997681; 22.07.2016