Размер экрана подсказки со смещением - PullRequest
0 голосов
/ 24 октября 2018

Привет, ребята, я пытаюсь создать всплывающую подсказку для некоторых предметов в игре, которую я создаю.И, ради бога, я не могу понять, как настроить смещение экрана для всплывающей подсказки.При использовании этого (код № 1) через 2 секунды включается игровой объект всплывающей подсказки (называемый StatDisplay), и он работает с разрешением 16x9, но после изменения разрешения всплывающая подсказка находится слишком далеко от основного объекта.Я попробовал это с положением мыши (код 2), и я столкнулся с той же проблемой со смещением, его уменьшение на более высоких разрешениях, а в меньших смещение слишком велико.Любые идеи о том, как это исправить ?(Я думал о создании переменной, которая меняется в зависимости от размера экрана, но не может найти способ ...)

Код 1:

    bool hovering = false;
    public GameObject StatDisplay;



    IEnumerator StartCountdown()
    {
        RectTransform rc = StatDisplay.GetComponent<RectTransform>();
        RectTransform rc2 = this.GetComponent<RectTransform>();

        int time = 1;
        while ((time > 0) && (hovering == true))
        {
            yield return new WaitForSeconds(1.0f);
            time--;
        }
        if ((time == 0) && (hovering == true))
        {

            if (Input.mousePosition.x > (Screen.width / 2))
            {
                if (Input.mousePosition.y > (Screen.height / 2))
                {
                    //Debug.Log("Top right");

                    StatDisplay.transform.position = new Vector3(-rc.rect.width / 2 + this.transform.position.x + rc2.rect.width / 2, -rc.rect.height / 2 + this.transform.position.y - rc2.rect.height / 2, 0);
                }
                else
                {
                    //Debug.Log("Bottom right");
                    StatDisplay.transform.position = new Vector3(- rc.rect.width / 2 + this.transform.position.x + rc2.rect.width / 2, rc.rect.height / 2 + this.transform.position.y + rc2.rect.height / 2, 0);

                }
            }
            else
            {
                if (Input.mousePosition.y > (Screen.height / 2))
                {
                    //Debug.Log("Top Left");

                    StatDisplay.transform.position = new Vector3(rc.rect.width / 2 + this.transform.position.x - rc2.rect.width / 2, - rc.rect.height / 2 + this.transform.position.y - rc2.rect.height / 2, 0);
                }
                else
                {
                    //Debug.Log("Bottom Left");

                    StatDisplay.transform.position = new Vector3(rc.rect.width / 2 + this.transform.position.x - rc2.rect.width / 2, rc.rect.height / 2 + this.transform.position.y + rc2.rect.height / 2, 0);
                }
            }
            StatDisplay.SetActive(true);
        }
    }

    public void Enter()
    {
        hovering = true;
        StartCoroutine(StartCountdown());
    }

    public void Exit()
    {
        hovering = false;
        StatDisplay.SetActive(false);

    }

Код 2:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HoverAtCursorPosition : MonoBehaviour
{
    RectTransform rt;
    CanvasGroup cg;

    float Obwidth;
    float Obheight;

    Vector3 MousePoz = new Vector3();

    private void Start()
    {
        rt = GetComponent<RectTransform>();
        cg = GetComponent<CanvasGroup>();
    }


    private void OnEnable()
    {
        PositionFunction();
    }

    private void OnDisable()
    {
        cg.alpha = 0;
    }


    void Update()
    {

        Obwidth = rt.rect.width + 20f;
        Obheight = rt.rect.height + 20f;

        //Debug.Log("X: " + Screen.width / rt.rect.width);
        //Debug.Log("Y: " + Screen.height / rt.rect.height);

        MousePoz = Camera.main.ScreenToViewportPoint(Input.mousePosition);

        PositionFunction();

        if (cg.alpha != 1)
        {
            if (gameObject.activeSelf == true)
            {
                cg.alpha += 0.1f;
            }
        }
    }


    void PositionFunction()
    {
        if (Input.mousePosition.x > (Screen.width / 2))
        {
            if (Input.mousePosition.y > (Screen.height / 2))
            {
                //Debug.Log("Top right");

                transform.position = new Vector3(MousePoz.x * Screen.width - Obwidth / 2, MousePoz.y * Screen.height - Obheight / 2);
            }
            else
            {
                //Debug.Log("Bottom right");
                transform.position = new Vector3(MousePoz.x * Screen.width - Obwidth / 2, MousePoz.y * Screen.height + Obheight / 2);
            }
        }
        else
        {
            if (Input.mousePosition.y > (Screen.height / 2))
            {
                //Debug.Log("Top Left");

                transform.position = new Vector3(MousePoz.x * Screen.width + Obwidth / 2, MousePoz.y * Screen.height - Obheight / 2);
            }
            else
            {
                //Debug.Log("Bottom Left");

                transform.position = new Vector3(MousePoz.x * Screen.width + Obwidth / 2, MousePoz.y * Screen.height + Obheight / 2);
            }
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Хорошо, играя, я нашел способ исправить свой код.

rt = this.GetComponent<RectTransform>();
        float RealWidth = rt.rect.width / Screen.width;
        float RealHeight = rt.rect.height / Screen.height;

rt находится на компоненте, у которого привязка установлена ​​для растягивания по x и y (преобразование Rect> значок слева> alt+ значок в правом нижнем углу)

кажется, что реальная ширина экрана и ширина прямоугольника объекта не одинаковы, даже если он растянут по размеру всего экрана.он всегда выключен на + -10-20% (не уверен, что его настройки холста или что-то в этом роде) ... ну, независимо от

new Vector3(Input.mousePosition.x * RealWidth, Input.mousePosition.y * RealHeight, 0)

, этот вектор даст вам правильную позицию во всех разрешениях.ну, это делает для меня ... это может помочь кому-то с подобной проблемой

0 голосов
/ 24 октября 2018

переменная уровня класса: bool isVis=false;

void OnGUI(){
 if (isVis)
        {
    GUI.Box(new Rect(Input.mousePosition.x + 2, Screen.height - Input.mousePosition.y + 2, 128, 72), "Tool Tip Text");
               } 
    }



private void OnMouseEnter()
    {
        isVis = true;

    }
    private void OnMouseExit()
    {
        isVis = false;

    }

добавьте это на свой объект, для которого вы хотите всплывающую подсказку, затем вы можете внести некоторые коррективы.это даст вам окно с текстом «Tool Tool Text» в позиции мыши, когда вы наводите курсор мыши на объект.ваш объект будет нуждаться в коллайдере.

еще до точки вашего вопроса: вы ищете эту строку:

new Rect(Input.mousePosition.x + 2, Screen.height - Input.mousePosition.y + 2, 128, 72)

, чтобы получить правильную позицию y вваше усилие вы должны вычесть mousePosition.y из Screen.Height, также важно отметить +2, так как если вы рисуете прямо на мыши, она будет заикаться между подсказкой и курсором

, как я сказалниже, если вы сохраните прямоугольник подсказки в переменной, которая установлена ​​в Update ()

в вашем OnGUI, вы можете сделать это:

GUI.Box(myRect, "Tool Tip Text");
GUI.DrawTexture(new Rect(myRect.x,myRect.y+20,64,64),Resources.Load("Sprites/sample.png"))  ;   

(метод загрузки захватит изображение,sample.png из вашей папки Resources/Sprites, если у вас нет этой папки, вы можете создать ее или изменить путь, но путь должен быть в папке с именем Resources

, которую вы также можете сделать

GUI.Label(new Rect(myRect.x,myRect.y+84,myRect.width,24),"Item Description")) ;    

Самое приятное то, что вы можете загрузить пользовательский скин GUI, установить собственные стили и динамически изменять каждый элемент GUI. Это означает, что если вы хотите белый заголовок, золотое описание и рамкувокруг вашего изображения, это просто. если вы хотите, чтобы СэмСтили плей, дайте мне знать!

...