Я делаю специальный интерфейс и добавляю кнопки, мне нужно чтобы при наведении на кнопку в определенном месте показывался мой текст. Подскажите пожалуйста, как мне это сделать. (Если это делается при помощи скрипта, то напишите пожалуйста, если не сложно.)
Вы можете реализовать в своем классе специальные интерфейсы, а конкретно вам нужен IPointerEnterHandler
. Вот сокращенный код из моего проекта, где обрабатываются события нажатия кнопки мыши (не клик), наведение курсора и убирание курсора с элемента:
public class ButtonBase :
MonoBehaviour,
IPointerDownHandler,
IPointerEnterHandler,
IPointerExitHandler
{
...
public void OnPointerDown (PointerEventData eventData) { ... }
public void OnPointerEnter (PointerEventData eventData) { ... }
public void OnPointerExit (PointerEventData eventData) { ... }
}
Если же вы не хотите писать свою кнопку, а вас устраивает та, что уже есть, посмотрите компонент EventTrigger
. Он позволяет ставить обработчики на разные события прямо в редакторе.
Сильно не пинайте. Когда то давно делал контроллер для всплывающих подсказок. В нескольких проектах его использовал.
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 компоненты
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Возможно очень глупый вопрос от новичкаБуду рад прочесть все что скинете
Использую nuget библиотеку MicrosoftXmlDiffPatch, получаю результат сравнения двух xml с помощью XmlDiff