zoukankan      html  css  js  c++  java
  • 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; }
  • 相关阅读:
    ASP.NET 高级编程基础第七篇—开发原则2
    反垃圾邮件引发的Email格式变异!
    .NET框架程序设计生成,打包,部署及管理应用程序与类型(2:Assembly的生成以及版本信息)
    .NET框架程序设计NET框架开发平台的体系架构概览(FCL,CTS,CLS)
    .NET框架程序设计生成,打包,部署及管理应用程序与类型(1:程序集的PE格式)
    [电影]蝴蝶效应
    .NET框架程序设计.NET框架开发平台的体系架构概览(.NET程序本质)
    [转贴]浅析.NET Framework对PE文件格式的扩展
    [MSDN今日讲座]Whidbey 开发系列讲座二:Visual Studio 2005团对开发系统简介
    郁闷!我的Gmail邮箱的问题!
  • 原文地址:https://www.cnblogs.com/llstart-new0201/p/7833951.html
Copyright © 2011-2022 走看看