Unity 中消息提醒框

Tooltip 用于ui布局

复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using UnityEngine.UI;

[ExecuteInEditMode()] // 可以在编辑模式下运行

public class Tooltip : MonoBehaviour
{
    public TMP_Text header; // 头部文本
    public TMP_Text content; // 内容文本
    public Image image; // 图片
    public LayoutElement layoutElement; // 布局元素,用于控制大小
    public int characterWrapLinmit; // 字符换行限制

    public RectTransform rectTransform; // RectTransform

    // 控制大小和位置
    public void ControlSizeAndPosition()
    {
        int headerLength = header.text.Length; // 头部文本长度
        int contentLength = content.text.Length; // 内容文本长度

        // 如果文本超过设定的换行限制,则启用布局元素
        layoutElement.enabled = (characterWrapLinmit < headerLength || characterWrapLinmit < contentLength) ? true : false;

        Vector2 position = Input.mousePosition; // 获取鼠标位置
        transform.position = position; // 设置提示框位置

        // 计算提示框的中心点相对于屏幕的位置
        float pivotX = position.x / Screen.width;
        float pivotY = position.y / Screen.height;
        rectTransform.pivot = new Vector2(pivotX, pivotY); // 设置提示框的中心点
    }
}

ToolTipCanvas 做成单列模式方便其他类调用

复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Singleton<T> : MonoBehaviour where T : Component
{
    public static T instance { get; private set; }
    protected virtual void Awake()
    {
        if(instance == null)
        {
            // as 强制转换类型
            instance=this as T;
        }
        else
        {
            Destroy(instance);
        }
    }

}

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

public class ToolTipCanvas : Singleton<ToolTipCanvas>
{
    public Canvas canvas;
    public Tooltip toolTip;

    public void Show(string content, string header=null,Sprite sprite=null)
    {
        canvas.enabled = true;

        toolTip.content.gameObject.SetActive(true);
        toolTip.content.text=content;
   
        if(header!=null)
        {
            toolTip.header.gameObject.SetActive(true);
            toolTip.header.text=header;       
        }
        else
        {
            toolTip.header.gameObject.SetActive(false);
        }

        if(sprite!=null)
        {
            toolTip.image.gameObject.SetActive(true);
            toolTip.image.sprite=sprite;
        }
        else
        {
            toolTip.image.gameObject.SetActive(false);
        }

        toolTip.ControlSizeAndPosition();
    }
    public void Hide()
    {
        canvas.enabled = false;
    }

}

TooltipTriggter 放在ui物体上

复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class TooltipTriggter : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
{
    public string header;
    public string content;
    public Sprite icon;
    public float stayTime;//鼠标停留多久时间,显示消息

    private bool isHovering = false;

    Coroutine hoverRoutineCoroutine;
    public void OnPointerEnter(PointerEventData eventData)
    {
        if(hoverRoutineCoroutine != null)
        {
            hoverRoutineCoroutine= StartCoroutine(HoverRoutineCoroutine());
        }
        else
        {
            StopAllCoroutines();
            hoverRoutineCoroutine= StartCoroutine(HoverRoutineCoroutine());
        }
    }

    public void OnPointerExit(PointerEventData eventData)
    {
        StopAllCoroutines();
        ToolTipCanvas.instance.Hide();
    }
    private void OnDisable()
    {
        StopAllCoroutines();
        ToolTipCanvas.instance.Hide();
    }

    private IEnumerator HoverRoutineCoroutine()
    {
        isHovering = true;
        yield return new WaitForSeconds(stayTime); 
        if (isHovering)
        {
            ToolTipCanvas.instance.Show(content, header,icon);
        }
    }
}

相关推荐
是阿根2 小时前
unity使用iTextSharp生成PDF文件
unity·c#·游戏引擎
常城10 小时前
Unity中通过TMP使用图片字体
unity·游戏引擎
惊鸿醉10 小时前
⭐Unity 开发 | 如何通过 NTP 网络时间实现精准的跨平台时间同步【附完整源码 + UI 模块 + 偏差分析】
网络·unity·游戏引擎
虾球xz11 小时前
游戏引擎学习第243天:异步纹理下载
c++·学习·游戏引擎
海鸥-w1 天前
Unity中使用Cinemachine插件创建自由视角相机(freelookCamera)来实现第三人称漫游
数码相机·unity·游戏引擎
EQ-雪梨蛋花汤1 天前
【Unity笔记】Unity音效管理:ScriptableObject配置 + 音量控制 + 编辑器预览播放自动化实现
笔记·unity·编辑器
qq_431331351 天前
Unity ML-Agents + VScode 环境搭建 Windows
windows·vscode·unity·强化学习
林枫依依1 天前
Unity 创建、读取、改写Excel表格数据
unity·excel
EQ-雪梨蛋花汤1 天前
【Unity笔记】Unity 编辑器扩展:一键查找场景中组件引用关系(含完整源码)(组件引用查找工具实现笔记)
笔记·unity·编辑器
李詹1 天前
游戏开发核心技术解析——从引擎架构到攻防体系的完整技能树
架构·ue5·游戏引擎·游戏程序·3dsmax·虚幻