首页 > 其他分享 >【Unity】创建动态的Tooltip

【Unity】创建动态的Tooltip

时间:2024-09-14 14:51:16浏览次数:8  
标签:backgroundRectTransform 创建 void private getTooltipTextFunc Unity Tooltip anchore

需求说明

  • 文字内容动态变化;
  • 根据文字的内容自适应宽高;
  • 跟随鼠标移动;
  • 可以隐藏和展示;
  • 鼠标到达窗口边缘,tooltip停靠边缘可见;

成果展示

Scene部分

查看UI相机和Canvas的设置

注意将文字放在最左下角


脚本部分

TooltipScreenSpaceUI脚本绑定至TooltipScreenSpaceUI物体

public class TooltipScreenSpaceUI : MonoBehaviour
{
    [SerializeField] RectTransform canvasRectTransform;
    [SerializeField] Camera uiCamera;

    [SerializeField] Transform player;
    private RectTransform backgroundRectTransform;
    private TextMeshProUGUI textMeshPro;
    private RectTransform rectTransform;

    public static TooltipScreenSpaceUI Instance { get; private set; }
    private Func<string> getTooltipTextFunc;

    private string tooltipText
    {
        get
        {
            return (getTooltipTextFunc != null) ? getTooltipTextFunc() : _tooltipText;
        }
        set
        {
            _tooltipText = value;
        }
    }
    private string _tooltipText;

    private void Awake()
    {
        Instance = this;
        backgroundRectTransform = transform.Find("background").GetComponent<RectTransform>();
        textMeshPro = transform.Find("text").GetComponent<TextMeshProUGUI>();
        rectTransform = transform.GetComponent<RectTransform>();

        HideTooltip();
    }

    private void SetText(string tooltipText)
    {
        textMeshPro.SetText(tooltipText);
        textMeshPro.ForceMeshUpdate();

        Vector2 textSize = textMeshPro.GetRenderedValues(false);
        Vector2 paddingSize = new Vector2(8, 8);

        backgroundRectTransform.sizeDelta = textSize + paddingSize;//让背景适应文字的宽高
    }

    

    private void Update()
    {
        SetText($"MosPos:({Input.mousePosition.x},{Input.mousePosition.y})\n{tooltipText}");

        //tooltip跟随鼠标移动
        //鼠标移动至边缘,tooltip停靠
        var mousePosition = uiCamera.ScreenPointToRay(Input.mousePosition).origin;
        Vector2 anchoredPosition = mousePosition / canvasRectTransform.localScale.x;
        if (anchoredPosition.x + backgroundRectTransform.rect.width > 630f + backgroundRectTransform.rect.width)
        {
            anchoredPosition.x = 630f - backgroundRectTransform.rect.width;
        }
        if (anchoredPosition.y + backgroundRectTransform.rect.height > 350f + backgroundRectTransform.rect.height)
        {
            anchoredPosition.y = 350f - backgroundRectTransform.rect.height;
        }
        if (anchoredPosition.x < -630f)
        {
            anchoredPosition.x = -630f;
        }
        if (anchoredPosition.y < -350f)
        {
            anchoredPosition.y = -350f;
        }
        rectTransform.anchoredPosition = anchoredPosition;
    }



    private void ShowTooltip(string tooltipText)
    {
        this._tooltipText = tooltipText;
        gameObject.SetActive(true);
        SetText(tooltipText);
    }

    private void ShowTooltip(Func<string> getTooltipTextFunc)
    {
        this.getTooltipTextFunc = getTooltipTextFunc;
        gameObject.SetActive(true);
        SetText(tooltipText);
    }
    private void HideTooltip()
    {
        gameObject.SetActive(false);
    }

    public static void ShowTooltip_Static(string tooltipText)
    {

        Instance.ShowTooltip(tooltipText);
    }

    public static void ShowTooltip_Static(Func<string> getTooltipTextFunc)
    {
        Instance.ShowTooltip(getTooltipTextFunc);
    }

    public static void HideTooltip_Static()
    {
        Instance.HideTooltip();
    }
}

TooltipTesting脚本绑定至空物体tooltipTest

public class TooltipTesting : MonoBehaviour
{
    private float timer;
    private string text;

    Func<string> getTooltipTextFunc;

    private bool isShowTooltip = true;

    private void Start()
    {
        getTooltipTextFunc = () =>
        {
            return "<color=#00ff00>testing tooltip....</color>\n " + text + "\n" +
            "<color=#F00>" + timer + "</color>";
        };

        //定时器任务
        FunctionPeriodic.Create(() =>
        {
            string abc = "dfsdvdhhkdVFDVdsVCtuukhnbvcsddasdaxzvBJBFSKBLKAND\n\n\n\n\n\n\n\n\n\n";
            text = "";
            for (int i = 0; i < UnityEngine.Random.Range(5, 100); i++)
            {
                text += abc[UnityEngine.Random.Range(0, abc.Length)];
            }
            //TooltipScreenSpaceUI.ShowTooltip_Static(text);
        }, .5f);

        TooltipScreenSpaceUI.ShowTooltip_Static(getTooltipTextFunc);
    }

    private void Update()
    {
        timer += Time.deltaTime;

		//鼠标右键单击隐藏和展示tooltip
        if (Input.GetMouseButtonUp(1))
        {
            isShowTooltip = !isShowTooltip;
            if (!isShowTooltip)
            {
                TooltipScreenSpaceUI.HideTooltip_Static();
            }
            else {
                TooltipScreenSpaceUI.ShowTooltip_Static(getTooltipTextFunc);
            }

        }
    }
}

标签:backgroundRectTransform,创建,void,private,getTooltipTextFunc,Unity,Tooltip,anchore
From: https://www.cnblogs.com/sitarblogs/p/18413933

相关文章

  • WordCloud.top - 在线终极词云创建!
    WordCloud是您轻松制作令人着迷的文字云的终极工具。它非常适合营销人员、教育工作者、数据爱好者和创意专业人士,为您的视觉叙事需求提供无与伦比的多功能性和创造力!官网https://wordcloud.top/在线编辑器https://studio.wordcloudmaster.com/说明在哪里使用WordCloud?•营销活动:......
  • MFC入门(2.创建MFC窗口)
    目录一、创建项目(Visualstudio2022)二、添加头文件mfc.h三、添加源文件mfc.cpp四、头文件mfc.h的代码五、源文件mfc.cpp的代码六、调试效果一、创建项目二、添加头文件mfc.h三、添加源文件mfc.cpp四、头文件mfc.h的代码:#include<afxwin.h>//mfc头文......
  • 如何创建TabBar
    文章目录概念介绍使用方法示例代码综合使用我们在上一章回中介绍了DefaultTabBarControllerWidget相关的内容,本章回中将介绍TabBarViewWidget.闲话休提,让我们一起TalkFlutter吧。概念介绍我们这里介绍的TabBarView类似前面章回中介绍过的PageView组件,它提供......
  • 一个库帮你轻松的创建漂亮的.NET控制台应用程序
    前言做过.NET控制台应用程序的同学应该都知道原生的.NET控制台应用程序输出的内容都比较的单调,假如要编写漂亮且美观的控制台输出内容或者样式可能需要花费不少的时间去编写代码和调试。今天大姚给大家分享一个.NET开源且免费的类库帮你轻松的创建漂亮、美观的.NET控制台应用程序:Sp......
  • 树莓派操作系统-利用Makefile创建内核镜像文件kernel8.img
    编写树莓派内核映像的过程可以等同于gcc的编译过程:预处理、编译、汇编、链接,后面还会加一步:将可执行文件转换成二进制的镜像文件。在MakeFile里的构建过程分为3步:1.将.c文件经过预处理、编译、汇编生成.o文件,将.S文件经过汇编生成.o文件。2.将.o文件经过链接生成.elf可执行文件......
  • 《Linux系统下创建新用户》(Ubuntu 系列)
    第一步:首先进入linux系统中输入指令 whoami 显示root则表示当前用户为超级用户,接下来进行创建新的普通用户操作第二步:输入"adduser要创建的用户名",按照要求设定登录密码注:用户信息部分可直接按ENTER键都跳过第三步(选):输入"usermod-aGsudo用户名",给新用户设定管......
  • Unity网络编程(1)线程
    引入:网络编程基础认识1.了解操作系统的分时操作:操作系统将时间划分为很多个片段,尽可能均匀地分配给正在执行的线程获得时间片的进程得以运行,其他则在等待CPU在这些进程上来回切换,频密,让人感觉多个进程在同时执行2.概念认识:(1)进程是程序的边界,程序与程序间以进程为隔离 ......
  • 【HBuilderX-从下载到项目创建】编程初学者适用的HBuilderX开发环境(超详细的)下载安装
    简介:HBuilderX是一款由DCloud公司开发的集成开发环境(IDE),专为前端开发设计,同时也支持多平台应用开发。它支持HTML、CSS、JavaScript、Vue、React、Uni-app等多种编程语言和框架,具备代码编辑、调试、测试等功能,并且提供了丰富的插件生态系统以扩展其功能。“......
  • 创建一个Django项目
    步骤1:创建Django项目和应用创建Django项目:bashdjango-adminstartprojectmyprojectcdmyproject创建Django应用:bashpythonmanage.pystartappmyapp安装并配置DjangoRestFramework(如果尚未安装):bashpipinstalldjangorestframework将myapp和rest_f......
  • mysql创建视图
    --CreatetablecreatetableODS_QMS.QMS_TRIAL_PROVIDE_BAD_INFORMATION(idVARCHAR2(36),date_tVARCHAR2(30),factoryVARCHAR2(16),provide_codeVARCHAR2(16),provide_nameVARCHAR2(16),marer......