由于项目需求,需要在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. java selenium 自动化笔记-不是0基础,至少有java基础

    本来今天要学GitHub的,但是在群里问了下小伙伴时被暴击.说我学的东西太多太杂,不是很深入,都是皮毛.哎~自己早深有意识到,因个人能力吧,找的资料都不是很全,加上实际工作没有应用到.所以写一篇sel ...

  2. opencv边缘检测

    人眼怎么识别图像边缘? 比如有一幅图,图里面有一条线,左边很亮,右边很暗,那人眼就很容易识别这条线作为边缘.也就是像素的灰度值快速变化的地方. sobel算子 sobel算子是一个离散差分算子. 图像 ...

  3. Java中Synchronized的优化原理

    我们知道,从 JDK1.6 开始,Java 对 Synchronized 同步锁做了充分的优化,甚至在某些场景下,它的性能已经超越了 Lock 同步锁.那么就让我们来看看,它究竟是如何优化的. 原本的 ...

  4. 第一个SharePoint Add-in工程

    一.创建SharePoint hosted 工程 1.创建承载SharePoint Add-in独立域 首先,确定承载的应用程序的独立域名,可以使用类似这样的域名apps.contoso.com,鉴于 ...

  5. mybatis 配置之<typeAliases>别名配置元素设置

    一.方式一:使用typeAlias <typeAliases> <typeAlias alias="User" type="com.**.entity. ...

  6. Mysql的表级锁和行级锁

    表级锁 MySQL表级锁分为读锁和写锁. 读锁 用法:LOCK TABLE table_name [ AS alias_name ] READ 释放锁使用UNLOCK tables.可以为表使用别名, ...

  7. .Net Core 商城微服务项目系列(八):购物车

    最近加班有点多,一周五天,四天加班到11点+,心很累.原因是我当前在的这个组比较特殊,相当于业务的架构组,要为其它的开发组提供服务和监控.所以最近更新的也少,不过这个元旦三天假应该会更新三篇. 这篇是 ...

  8. Proving Equivalences UVA - 12167

    题文:https://vjudge.net/problem/UVA-12167 题解: 很明显,先要缩点.然后画一下图就会发现是入度为0的点和出度为0的点取max. 代码: #include < ...

  9. 2. SOFAJRaft源码分析—JRaft的定时任务调度器是怎么做的?

    看完这个实现之后,感觉还是要多看源码,多研究.其实JRaft的定时任务调度器是基于Netty的时间轮来做的,如果没有看过Netty的源码,很可能并不知道时间轮算法,也就很难想到要去使用这么优秀的定时调 ...

  10. Spring Cloud Gateway的动态路由怎样做?集成Nacos实现很简单

    一.说明 网关的核心概念就是路由配置和路由规则,而作为所有请求流量的入口,在实际生产环境中为了保证高可靠和高可用,是尽量要避免重启的,所以实现动态路由是非常有必要的:本文主要介绍 Spring Clo ...