unity 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即为每个字符对应的长度,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)获取鼠标位置(获取鼠标位置为全局坐标系下的,需要通过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-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; }
复制代码

 

posted @   81192  阅读(1768)  评论(1编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示