Text实现鼠标光标

前言

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

1.新建一个光标的prefab

简单为之,直接在image中添加一个竖线spirte,增加脚本控制闪烁。

public float cycleTime=0.2f;
    public Vector2 size =new Vector2(2,20);
    public Color oriColor = new Color(1, 1, 1, 1);
    public Color newColor = new Color(1, 1, 1, 0);

    // 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即为每个字符对应的位置,循环结束结果即为text文本的长度,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 = 0; i < text.Length; i++)
        {

            font.GetCharacterInfo(text[i], out characterInfo, fontsize);
            //width+=characterInfo.width; unity5.x提示此方法将来要废弃
            width += characterInfo.advance;          
        }

3.获取鼠标位置

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

4.完整代码

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-50);
        Vector2 newCursorPos = new Vector2(newCursorXpos+50, -gameObject.GetComponent<RectTransform>().sizeDelta.y / 2);
        TransitData.cursor.GetComponent<RectTransform>().anchoredPosition = newCursorPos;
        Debug.Log(newCursorPos);
    }

    private float GetCursonXpos(float pointerDownXpos)
    {
        float xPos = 0;
        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 = 0; 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 - 1) xPos = width;
            }
        }
        return xPos;
    }

此代码为在每一个点击位置重新生成一个新的光标,可优化为光标移动到鼠标点击位置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值