由于项目需求,需要在text上实现鼠标的cursor,并且随着点击位置cursor移动。实现方法:

1)新建一个光标的prefab(简单为之,直接在image中添加一个竖线spirte),增加脚本控制闪烁。

脚本如下:

   public float cycleTime=0.2f;
public Vector2 size =new Vector2(,);
public Color oriColor = new Color(, , , );
public Color newColor = new Color(, , , ); // Use this for initialization
void Start () {
StartCoroutine(Shine());
} private void ShineAction(bool isColor)
{
gameObject.GetComponent<RectTransform>().sizeDelta= size;
gameObject.GetComponent<Image>().color = isColor ? oriColor : newColor;
}
IEnumerator Shine()
{
while (true)
{
ShineAction(false);
yield return new WaitForSeconds(cycleTime);
ShineAction(true);
yield return new WaitForSeconds(cycleTime);
}
}

2)获取text每个字符所在的位置(下代码中width即为每个字符对应的长度,characterInfo.advance为单个字符的长度)

         public Text textComp;

  Font font = textComp.font;// Resources.Load<Font>("FZCQJW");
int fontsize = textComp.fontSize;
string text = textComp.text;
font.RequestCharactersInTexture(text, fontsize, FontStyle.Normal);
CharacterInfo characterInfo;
float width = 0f;
for (int i = ; i < text.Length; i++)
{ font.GetCharacterInfo(text[i], out characterInfo, fontsize);
//width+=characterInfo.width; unity5.x提示此方法将来要废弃
width += characterInfo.advance;
}

3)获取鼠标位置(获取鼠标位置为全局坐标系下的,需要通过transform.InverseTransformPoint(eventData.position)转化为text局部坐标系下数据),继承接口IPointerDownHandler实现其OnPointerDown方法,即可通过eventData.position获取当前点击位置

    public void OnPointerDown(PointerEventData eventData)
{ }

完整代码如下:

public class RowToggleEvent : MonoBehaviour,IPointerDownHandler
{
public Text textComp;
public GameObject cursor; private GameObject newCursor = null; public void OnPointerDown(PointerEventData eventData)
{
if (TransitData.cursor != null) Destroy(TransitData.cursor);
Vector2 pointerDownPos = transform.InverseTransformPoint(eventData.position);
Debug.Log(pointerDownPos);
TransitData.cursor = Instantiate(cursor, gameObject.transform);
float newCursorXpos = GetCursonXpos(pointerDownPos.x-);
Vector2 newCursorPos = new Vector2(newCursorXpos+, -gameObject.GetComponent<RectTransform>().sizeDelta.y / );
TransitData.cursor.GetComponent<RectTransform>().anchoredPosition = newCursorPos;
Debug.Log(newCursorPos);
} private float GetCursonXpos(float pointerDownXpos)
{
float xPos = ;
Font font = textComp.font;// Resources.Load<Font>("FZCQJW");
int fontsize = textComp.fontSize;
string text = textComp.text;
font.RequestCharactersInTexture(text, fontsize, FontStyle.Normal);
CharacterInfo characterInfo;
float width = 0f;
for (int i = ; i < text.Length; i++)
{ font.GetCharacterInfo(text[i], out characterInfo, fontsize);
width += characterInfo.advance;
if (pointerDownXpos <= width)
{
xPos = width;
break;
}
else
{
if (i == text.Length - ) xPos = width;
}
}
return xPos;
}

unity text实现鼠标光标的更多相关文章

  1. 自定义鼠标光标cursor

    通过css属性 Cursor:url()自定义鼠标光标. {cursor:url('图标路径'),default;} url是自定义鼠标图标路径 default指的是定义默认的光标(通常是一个箭头), ...

  2. HTML中的鼠标光标属性

    在网页中默认的鼠标指针只有两种,一种是最普通的箭头,另一种是当移动到链接上时出现的“小手”.但现在越来越多的网页都使用了CSS鼠标指针技术,当将鼠标移动到链接上时,可以看到多种不同的效果.CSS可以通 ...

  3. 可编辑DIV (contenteditable="true") 在鼠标光标处插入图片或者文字

    近期需开发一个DIV做的编辑器,插入表情图片可直接预览效果,仔细参考了下百度贴吧的过滤粘贴过来文件的THML代码,自己整理了下.写出来只是和大家分享下,我自己也不大懂,经过努力,幸好搞定. 蛋疼的事情 ...

  4. 在.net桌面程序中自定义鼠标光标

    有的时候,一个自定义的鼠标光标能给你的程序增色不少.本文这里介绍一下如何在.net桌面程序中自定义鼠标光标.由于.net的桌面程序分为WinForm和WPF两种,这里分别介绍一下. WinForm程序 ...

  5. 一些 Windows 系统不常见的 鼠标光标常数

    一些 Windows  系统不常见的 鼠标光标常数 Private Declare Function SetCursor Lib "user32" (ByVal hCursor A ...

  6. WPF 自定义鼠标光标

    在程序中使用自定义鼠标光标的三种方式: RadioButton senderButton = sender as RadioButton; 方式一:                       str ...

  7. WPF窗体隐藏鼠标光标的方法

    原文:WPF窗体隐藏鼠标光标的方法 要引用 System.Windows.Input;   Mouse.OverrideCursor = Cursors.None; 去掉 Override 则使用: ...

  8. C# 设置鼠标光标位置

    C# 设置鼠标光标位置 using System.Drawing; using System.Runtime.InteropServices; namespace ZB.QueueSys.Common ...

  9. Windows 远程桌面鼠标光标不可见

    一.问题描述 通过在云端的主机上部署 frp 服务,实现「使用Windows 远程桌面(RDP)从互联网侧访问内网的主机」.但是,使用 Windows 自带的远程桌面工具 RDP 连接到另一台计算机时 ...

随机推荐

  1. WordCount程序【Spark Streaming版本】

    ~~ 前置 ~~ Spark Streaming 常常对接 :本地文件.HDFS.端口.flume.kafka package february.streaming import org.apache ...

  2. Centos7 快速安装Docker

    写在前面 Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发者在笔记本上编译测试通过的容器可以轻松批量地在生产环境中部署. 网上的安装教程也很多这里我推 ...

  3. java基础面试集结

    1.hashMap实现原理及相关问题 :https://blog.csdn.net/h1130189083/article/details/78303865

  4. Docker实战笔记命令篇

    拉取一个镜像 docker pull ubuntu:14.04 查看系统中的镜像 docker images 运行镜像并进入 docker run -it ubuntu:14.04 查看运行的容器 d ...

  5. MySQL-时区导致的时间前后端不一致

    背景 今天早上刚上班,就被同事提示,程序的日期处理有问题.数据库里日期为:2019-05-21 11:00:00 而前端显示的日期为:2019-05-21 16:00:00 分析 那肯定是和时区相关了 ...

  6. 一个简单的Eclipse调试Debug流程(四)

    本文链接:https://blog.csdn.net/u011781521/article/details/55000066    http://blog.csdn.net/u010075335/ar ...

  7. Java11月18日

    动手动脑 实验一: 1. 下边的程序运行结果是什么? 2.你如何解释会得到这样的输出? 3.计算机是不会出错的,之所以得到这样的运行结果也是有原因的那么从这些运行结果中,你能总结出Java的哪些语法特 ...

  8. GUI tkinter (Menu)菜单项篇

    """添加顶层菜单:1.我们可以使用Menu类来新建一个菜单,Menu和其他的组件一样,第一个是parent,这里通常可以为窗口2.然后我们可以用add_command方 ...

  9. 对新手严重不友好的强者——Nginx那些俯拾皆是的坑

    1.if和后边的括号要隔一个空格,变量后面也要有空格. 2.location / 和location = / 的意味不一样.前面的是通用匹配,后面的匹配根节点访问请求,前面的使用不好很容易引发重定向过 ...

  10. mysqldump导出 timestamp类型数据 时区偏差8小时

    1 出现原因 1.1 查看机器时区和MySQL的时区 #查看linux的机器时区: [root@mysql-150 ~]# date -R Wed, 23 Oct 2019 14:10:04 +080 ...