基于NGUI的富文本实现--终成正果

匿名 (未验证) 提交于 2019-12-03 00:22:01

第一次,连续做了这么多天的功能,第一次把我想要的结果完整无误的呈现出来,又有几人能明白这种付出后看到成果展现在眼前的那种心情。

今天服务器维护,很早就赶到公司去上班了!一天都没睡几个钟头,实在是很疲、很困。
代码是写完了,可是还有很多bug,甚至还很黄很暴力。
特别有几个地方实在是用了不是办法的办法。

    // 第一个让人觉得恐怖而且不可靠的地方 RichCompSortHelper.CalculatePrintedSize     private static Vector2 CalculatePrintedSize(UILabel label, string text)     {         var old_text = label.text;         label.text = text;         var size = label.localSize;         label.text = old_text;          Debug.Log(text + "   size : " + size.ToString());          return size;     }     // 不知道你们看出了什么没有。那个大小的计算方法,是不是有点不可理喻     // 本来以为调用NGUIText的CalculatePrintedSize方法,就能够计算出大小,结果不知道是什么地方出现了问题,一直没有办法拿到正确的值。     // 虽然说Unity底层会采用数据缓冲池类似的技术,去实现延迟渲染。这个text根本不会被渲染出来,但是这种做法也是挺取巧的。     // 实在是还没有研究透NGUI那个方法出现了什么问题,所以才采用这种方式。      // 也不是没有什么补偿,就是在调用这段代码的方法里的顺序遍历方法,改善成了二分查找法,算是尽可能提高效率吧
    // 第二个地方 就是RichLabel的换行切割方法   自己调用自己生成对象     // 本来是想做一个克隆方法的,所有的处理都在外面调用层去处理,结果写着写着,就成为内部处理,外部处理,一起上了。     public RichLabel[] SubComponent(string[] lines)     {         if (lines != null && lines.Length > 1)         {             var list = new List<RichLabel>();             for (int i = 0; i < lines.Length; ++i)             {                 if (i == 0)                 {                     this.m_label.text = lines[i];                     this.m_text = lines[i];                     this.m_rich_event.Init();                 }                 else                 {                     var temp_rich_comp = new RichLabel(this.m_ctrl.GameObj.transform, this.m_ctrl, this.m_font, this.m_fontsize, this.m_fontstyle, lines[i], this.m_rich_event);                     if (temp_rich_comp != null) list.Add(temp_rich_comp);                 }             }             return list.ToArray();         }         return null;     }

最后附上一张整体效果图和调用数据

    private string rich_txt = @"     <label id = '111',can_click = 'true',font = 'SciFi/SciFi Font - Header', fontsize = '20',fontstyle = 'Normal',text = 'First LabelFirstLabelsdfsdfadfasdfaewoooooooooooooooppppppppppppppsssssssssssssssscccccccccccccc222222222222' />     <sprite atlas_name = 'SciFi/SciFi Atlas',sprite_name = 'NGUI',width = '30',height = '18'/>     <spamin atlas_name = 'Wooden Atlas',sprite_name = 'Button',prefix_sprite_name = 'Button',loop = 'true'/>     <texture texture_name = 'Wooden Atlas',width = '25',height = '18'/>     <label font = 'SciFi/SciFi Font - Normal', fontsize = '22',fontstyle = 'Normal',text = 'S n e n c o nnd Label' />     <texture texture_name = 'Wooden Atlas',width = '65',height = '108'/>     ";     void OnGUI()     {         if(GUILayout.Button("TestRich"))         {             RichLabelMgr.CreateNewRichLab(rich_txt, this.transform, new Vector2(200, 200), NGUIText.Alignment.Left, (string id) =>             {                 Debug.Log("richevent  " + id);             });         }     }

ps:工程已经全部上传到了GIT,感兴趣的可以下载

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!