0
点赞
收藏
分享

微信扫一扫

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

棒锤_45f2 2022-03-11 阅读 26

就这悬浮文本(hint)功能,我搞几小时,各种搜,可能是我姿势不对,不应该用必应,应该学巨佬用谷歌gayhub之类的。
为了节省大家的时间,我把关键内容放前面,博客后面的内容反正也就个人的牢骚没啥作用。
演示效果:
请添加图片描述

using UnityEngine;
using UnityEngine.EventSystems;

public class XJ_UIHint : MonoBehaviour,IPointerEnterHandler, IPointerExitHandler {
    public Font font;
    public int fontSize = 10;
    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,设置样式的),然后看到了个血压拉满的玩意儿,没错就是CaleSize在这里插入图片描述
    当我试用了这函数并且明确这个函数能够完美替代我的第一个方案(使用Font.GetCharacterInfo)时我人都麻了,我前面几个小时都干了啥,啥都没干,于是气不来啊,就写博客呗,发散一些负面情绪

举报

相关推荐

0 条评论