Unity появление текста при наведении на кнопку

389
26 июля 2021, 11:40

Я делаю специальный интерфейс и добавляю кнопки, мне нужно чтобы при наведении на кнопку в определенном месте показывался мой текст. Подскажите пожалуйста, как мне это сделать. (Если это делается при помощи скрипта, то напишите пожалуйста, если не сложно.)

Answer 1

Вы можете реализовать в своем классе специальные интерфейсы, а конкретно вам нужен IPointerEnterHandler. Вот сокращенный код из моего проекта, где обрабатываются события нажатия кнопки мыши (не клик), наведение курсора и убирание курсора с элемента:

public class ButtonBase :
    MonoBehaviour,
    IPointerDownHandler,
    IPointerEnterHandler,
    IPointerExitHandler
{
    ...
    public void OnPointerDown  (PointerEventData eventData) { ... }
    public void OnPointerEnter (PointerEventData eventData) { ... }
    public void OnPointerExit  (PointerEventData eventData) { ... }
}

Если же вы не хотите писать свою кнопку, а вас устраивает та, что уже есть, посмотрите компонент EventTrigger. Он позволяет ставить обработчики на разные события прямо в редакторе.

Answer 2

Сильно не пинайте. Когда то давно делал контроллер для всплывающих подсказок. В нескольких проектах его использовал.

using System;
using UnityEngine;
using System.Collections;
using System.Reflection;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class ToolTipController : MonoBehaviour
{
    private enum TipState
    {
        None,
        Old,
        New
    }
    public GameObject LastObject = null;
    public float Delay = 0.0f;
    public Text Label = null;
    public GameObject Background = null;
    public float ResearchTime = 2.0f;
    public bool AutoHide = true;
    public ToolTip DefaulTip = null;
    public GameObject TipObject
    {
        get; private set; }
    private ToolTip toolTip = null;
    private string toolTipText = "";
    private Camera[] cameras   ;
    private float timer = 0.0f;
    private Vector3 lastMousePosition = Vector3.zero;
    private GameObject LastObjectUI = null;
    private static ToolTipController instance;
    private float waitResearch = 0.0f;
    public static ToolTipController Instance
    {
        get { return instance; }
    }
    void Awake()
    {
        if (instance != null)
            Debug.LogError("The scene has got more than one tooltip controller.");
        instance = this;
    }
    // Use this for initialization
    public void Start ()
    {
        ResearchCameras();
        //Hide();
    }
    public void ShowTip(string tip)
    {
        toolTip = null;
        toolTipText = tip;
        Show();
    }
    public void ShowTip(ToolTip tip)
    {
        toolTip = tip;
        toolTipText = null;
        Show();
    }
    // Update is called once per frame
    public void Update ()
    {
        if (lastMousePosition != Input.mousePosition && Delay > 0)
        {
            timer = 0.0f;
            lastMousePosition = Input.mousePosition;
            LastObject = null;
            Hide();
            return;
        }
        else
        {
            if (timer < Delay)
            {
                timer += Time.deltaTime;
                return;
            }
        }
        TipState newState = TipState.None;
        if (LastObjectUI != null)
        {
           newState = (TipState)Mathf.Max((int)newState, (int)GetTargetUI());
        }
        else
        {
            foreach (Camera cam in cameras)
            {
                newState = (TipState)Mathf.Max((int)newState, (int)GetTargetCamera(cam));
            }
        }
        switch (newState)
        {
            case TipState.None:
                if (DefaulTip != null)
                {
                    toolTip = DefaulTip;
                    toolTipText = null;
                    TipObject = toolTip.gameObject;
                    Show();
                }
                else {
                    Hide();
                }
                LastObject = null;  
                    break;
            case TipState.New:
                Show();
                break;
        }
    }
    public void ResearchCameras()
    {
        cameras = FindObjectsOfType(typeof (Camera)) as Camera[];
    }
    TipState GetTargetUI()
    {
        if (!LastObjectUI.gameObject.activeInHierarchy)
        {
            LastObjectUI = null;
            return TipState.None;
        }
        return GetTarget(LastObjectUI);
    }
    TipState GetTargetCamera(Camera cam)
    {
        // create the ray on the mouse position from camera
        Ray ray = cam.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if (!Physics.Raycast(ray, out hit))
            return TipState.None;
        GameObject currentObject = hit.collider.gameObject;
        return GetTarget(currentObject);
    }
    TipState GetTarget(GameObject fromObject)
    {
        if (fromObject == null) return TipState.None;
        if (fromObject == LastObject) return TipState.Old;
        GameObject currentObject = fromObject;
        do
        {
            toolTip = currentObject.GetComponent<ToolTip>();
            if (toolTip != null)
            {
                LastObject = fromObject;
                TipObject = fromObject;
                Show();
                return TipState.New;
            }
            else
            {
                Component[] components = currentObject.GetComponents<Component>();
                foreach (Component component in components)
                {
                    Type type = component.GetType();
                    FieldInfo fieldInfo = type.GetField("Tip");
                    PropertyInfo propertyInfo;
                    toolTipText = fieldInfo != null ? fieldInfo.GetValue(component) as string: "";
                    if (string.IsNullOrEmpty(toolTipText))
                    {
                        fieldInfo = type.GetField("tip");
                        toolTipText = fieldInfo != null ? fieldInfo.GetValue(component) as string: toolTipText;
                    }
                    if (string.IsNullOrEmpty(toolTipText))
                    {
                        propertyInfo = type.GetProperty("Tip");
                        toolTipText = propertyInfo != null? propertyInfo.GetValue(component, null) as string: toolTipText;
                    }
                    if (string.IsNullOrEmpty(toolTipText))
                    {
                        propertyInfo = type.GetProperty("tip");
                        toolTipText = propertyInfo != null ? propertyInfo.GetValue(component, null) as string: toolTipText;
                    }
                    if (!string.IsNullOrEmpty(toolTipText))
                    {
                        LastObject = fromObject;
                        TipObject = fromObject;
                        Show();
                        return TipState.New;
                    }
                }
            }
            if (currentObject.transform.parent != null) 
                currentObject = currentObject.transform.parent.gameObject;
            else 
                currentObject = null;
        } while (currentObject != null);
        return TipState.None;
    }
    void Show()
    {
        if (Background != null)
            Background.SetActive(true);
        if (Label != null)
        {
            Label.text = toolTip != null ? toolTip.Text: toolTipText;
            Label.gameObject.SetActive(true);
        }
    }
    void Hide()
    {
        if (!AutoHide) return;
        if (Background != null)
            Background.SetActive(false);
        if (Label != null)
            Label.gameObject.SetActive(false);
    }
    public void OnEnter(BaseEventData data)
    {
        PointerEventData pData = data as PointerEventData;
        if (pData != null && pData.pointerCurrentRaycast.gameObject)
        {
            LastObjectUI = pData.pointerCurrentRaycast.gameObject;
        }
    }
    public void OnExit(BaseEventData data)
    {
        PointerEventData pData = data as PointerEventData;
        if (pData != null && pData.pointerEnter)
        {
            LastObjectUI = null;
            Hide();
        }
    }
}

На сколько помню надо было либо в одном из компонентов задать в скрипте текст подсказки в поле/свойстве Tip/tip. Либо навешать на объект скрипт.

using System.Collections.Generic;
using System.Runtime.Remoting.Messaging;
using UnityEngine;
using System.Collections;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class ToolTip : MonoBehaviour
{
    [Multiline(5)]
    public string Text = "";
    public uint MaxWidth = 0;
    public Text Output = null;
    public float TimeDisplay = 0.0f;
    private bool isUI = false;
    // Use this for initialization
    void Start () {
        isUI = this.transform is RectTransform;
        if (isUI)
        {
            EventTrigger trigger = gameObject.AddComponent<EventTrigger>();
            trigger.triggers = new List<EventTrigger.Entry>();
            EventTrigger.Entry entry = new EventTrigger.Entry();
            entry.eventID = EventTriggerType.PointerEnter;
            entry.callback = new EventTrigger.TriggerEvent();
            UnityAction<BaseEventData> callback = ToolTipController.Instance.OnEnter;
            entry.callback.AddListener(callback);
            trigger.triggers.Add(entry);
            entry = new EventTrigger.Entry();
            entry.eventID = EventTriggerType.PointerExit;
            entry.callback = new EventTrigger.TriggerEvent();
            callback = ToolTipController.Instance.OnExit;
            entry.callback.AddListener(callback);
            trigger.triggers.Add(entry);
        }
    }
    // Update is called once per frame
    void Update () {
    }

}

Обрабатывались как объекты в сцене с коллайдерами, так и UI компоненты

READ ALSO
Правильная обработка всех исключений

Правильная обработка всех исключений

В методе OnStartup определяю следующий код:

100
Остановка System.Threading.Timer

Остановка System.Threading.Timer

Возможно очень глупый вопрос от новичкаБуду рад прочесть все что скинете

191
Генерация паролей

Генерация паролей

Есть алфавит

224
Как отобразить результат XmlDiff?

Как отобразить результат XmlDiff?

Использую nuget библиотеку MicrosoftXmlDiffPatch, получаю результат сравнения двух xml с помощью XmlDiff

175