【Unity】UI界面鼠标悬停时显示文本(用GUI.Box实现),以及Font.GetCharacterInfo的正确用法

  • 你们知道吗,我必应搜索关键词“Unity 悬停文本”时,搜出了什么?搜出了我自己的文章!!!而且是在别的地方的!!!我真的血压拉满,世风日下啊世风日下,未经个人同意就脚本拷贝他人文章增加流量,我可去你的吧。我这里就先注明好了:我的博客是从CSDN里发布的,任何其他渠道里查看到的我的文章都是未经本人同意私自转载的侵权行为,我目前不想管这种破事,因为比较忙,但实在是把我给惹恼了啊,这什么破事啊这,真的是服了。我这里就简单挂出来:

【Unity】UI界面鼠标悬停时显示文本(用GUI.Box实现),以及Font.GetCharacterInfo的正确用法_第1张图片 【Unity】UI界面鼠标悬停时显示文本(用GUI.Box实现),以及Font.GetCharacterInfo的正确用法_第2张图片

我的CSDN文章地址为:【Unity】UI界面鼠标悬停时显示文本(用GUI.Box实现),以及Font.GetCharacterInfo的正确用法







  • 以下为原博客内容

就这悬浮文本(hint)功能,我搞几小时,各种搜,可能是我姿势不对,不应该用必应,应该学巨佬用谷歌gayhub之类的。
为了节省大家的时间,我把关键内容放前面,博客后面的内容反正也就个人的牢骚没啥作用。
演示效果:
【Unity】UI界面鼠标悬停时显示文本(用GUI.Box实现),以及Font.GetCharacterInfo的正确用法_第3张图片

using UnityEngine;
using UnityEngine.EventSystems;

public class XJ_UIHint : MonoBehaviour,IPointerEnterHandler, IPointerExitHandler {
    public Font font;
    public int fontSize = 10;
    [Multiline]//允许多行输入
    public string text = "显示的文本";

    private bool showText = false;
    private GUIStyle style;

    public void Start() {
        style = new GUIStyle("box");
    }

    public void OnPointerEnter(PointerEventData eventData){
        showText = true;
    }
    public void OnPointerExit(PointerEventData eventData) {
        showText = false;
    }
    public void OnGUI() {
        style.font = font;
        style.fontSize = fontSize;
        var vt =style.CalcSize(new GUIContent(text));
        if (showText)
            GUI.Box(new Rect(Input.mousePosition.x, Screen.height - Input.mousePosition.y, vt.x,vt.y), text,style);
    }
}

【上面代码里并没有标题提到的Font.GetCharacterInfo,想了解这内容就往下拉,牢骚话在下面,或者Ctrl+F快速查找】

可以根据个人需要,在以上脚本代码里再加上一些计时器啥的。至于那hint的样式,怎么说呢,我也想改,但找不到合适的方法,就此搁置。hint的样式与GUIStyle直接挂钩,我脚本里赋值为"Box",其他样式我就不列出来了反正没必要,因为找到一个巨佬写的GUIStyle样式大全:Unity 查看所有GUI默认样式,使用很简单,直接在自己的unity项目里创建一个脚本并把巨佬的代码拷进去(巨佬的代码就是好用,都不用修改就能运行的),然后在unity的顶部菜单栏里就有那样式查看工具了。
在这里插入图片描述









以下为无关紧要的个人发牢骚内容



一、使用Font.GetCharacterInfo

   我搜出来很多垃圾啊(一堆垃圾博客我就不列出来放着了毕竟没用的标签都关了),这里搞搞那里整整的,当时最接近我目的的功能就是利用Font.GetCharacterInfo这个函数,但因为这个函数一直给我送个无效数据(值一直都是0),搞得我心态都炸了,卡了两个多小时去试这天煞的函数怎么用,最后参考了一个博客才解决问题: unity中的Text组件如何获得其中文本的尺寸

直接来个样例代码:

	Font font=new Font();//font:字体样式
	string text="123一二三";//text:文本
	int fontSize=24;//fontSize:字体大小
	FontStyle fontStyle=FontStyle.Bold;//fontStyle:字体样式(粗体斜体)

	font.RequestCharactersInTexture(text,fontSize,fontStyle);//第一个参数为渲染的文本,第二个为字体大小,第三个参数为字体样式
	font.GetCharacterInfo('1',out CharacterInfo info,fontSize,fontStyle);//第一个参数为目标字符,第二个为目标字符的尺寸信息,第三个参数为字体大小,第四个参数为字体样式
	//我当时使用的是info.glyphHeight、info.glyphWidth,觉得这两个已经够完成我功能了我就不费事去试别的参数

总结一下,在调用font.RequestCharactersInTexture和font.GetCharacterInfo时,如果:
    ①、font.GetCharacterInfo的“目标字符”并不是font.RequestCharactersInTexture传入的字符串的任一字符时;
    ②、两个函数传入的“字体大小”不一致时;
    ③、两个函数传入的“字体样式”不一致时;
那么返回的info里,所有的数据都是0,没错,都是0,都是0,0,0,当时我debug是真的苦到炸,反反复复debug和搜各种东西,一个多小时才发现是这种蠢到炸的函数调用问题。简而言之就是这两个函数的调用是严格匹配的,参数值要完全一致





二、使用GUIStyle.CalcSize

    当时算是鬼使神差吧,我没啥想法地往下拉看看这个GUIStyle还有什么骚东西能用的(因为GUI.Box的第三个参数就是GUIStyle,设置样式的),然后看到了个血压拉满的玩意儿,没错就是CalcSize,当时内心os“原来它有的它有的它是自带的它可以计算渲染出来的文本尺寸的,那我还废啥心思一个字符一个字符累加然后计算宽度啊”
【Unity】UI界面鼠标悬停时显示文本(用GUI.Box实现),以及Font.GetCharacterInfo的正确用法_第4张图片
    当我试用了这函数并且明确这个函数能够完美替代我的第一个方案(使用Font.GetCharacterInfo)时我人都麻了,我前面几个小时都干了啥,啥都没干,于是气不来啊,就写博客呗,发散一些负面情绪

你可能感兴趣的:(visual,studio,unity)