基于Unity插件NGUI的富⽂本功能的⼀些实现思路
嘿嘿,我⼜回来了,不知道有没有关⼼我的朋友在找我呢?
做游戏开发的,真的很累。累,不仅仅只有在⼯作上,还有的是在政策限制上,以及⼼灵上;做游戏,真的会背负⼀些骂名。前段时间,我就听到⼀些幼师在说现在的⼩朋友很多都带眼镜,整天都玩⼿机,玩游戏,导致成绩不好云云。不论怎么诡辩都好,其实现在的游戏确实得为此承担⼀部分责任。
这段时间有点迷失⾃⼰了,找不到前进的动⼒,前⼏天去图书馆⾥喝了⼏碗鸡汤,好好反思了下⼈⽣,和⼈⽣的意义。这两天才在迷失中找回了⾃⼰,并决定不能再继续消沉下去了。我的⼈⽣应该更加精彩才对!
废话不多说,开始今天的主题吧!
先来解释⼀下什么是富⽂本,我的富⽂本⼜是怎么样⼦的以及说说实现思路;
先声明⼀下,我做的这个富⽂本是基于NGUI的。
其实这个富⽂本不是很⼀种新的东西,⽽是在上家公司任职的时候使⽤过的⼀个部件,当时没有看过相关的源码,只是现在想想那个东西确实很好⽤,所以⽤⾃⼰的思路来实现⼀遍。
NGUI的Label也能够⽀持图⽂混排,可是有很⼤的局限性。
⽐如,我想在Label⾥⾯插⼊⼀张图⽚呢?这个图⽚不能有图集的限制,我想在Label⾥卖弄插⼊⼀张Texture呢?
NGUI的UILabel是做不到这么灵活的,⽽这些功能就是富⽂本是实现功能。
我想了⼀想,在实际应⽤当中,在⼀个富⽂本中要⽤到的功能,可能会有:
UI元素:
label
sprite
spritamintor
texture
事件元素
url | onclick
结合以前使⽤的经验,可⾏的⼀种简单的实现思路就是:
利⽤⼀种类似于html元素,⾥⾯标明是label还是sprite
如果是label那么就创建uilabel,如果是sprite那么就创建sprite…
为此开发简单,参考记忆中的组件使⽤⽅法,定了⼀个基本的元素格式:
"<lab color = '', size = '', text = '' />"
"<spr spraltername = '',sprname = ''/>"
"<lab color = '',size = '', text = 'sdkfjhkdsjhf' />"
"<texture texturename = ''/>"
"<url id = ''>"
this怎么读仔细想想开发的难点应该是以下这些
1.UI元素和事件元素可以同时并存还是属性?
如果有事件,那么应该在元素配置⾥⾯给我个事件的id,当触发ui元素点击事件的时候,再根据这个id寻找所有相同id的元素的颜⾊设置为点击后的颜⾊,再调⽤点击的回调⽅法,并且传⼊id
"<spr id = '' , spraltername = '',sprname = ''/>"
2.统计字符长度和换⾏
2018高考英语
换⾏有⾼度问题,也有宽度问题。还存在⼀个text切割为两个text
⾸先RichiLab有⼀个宽⾼的限定
congress
也还有对齐⽅法
invitation是什么意思
为此,应该设置⼀个统⼀的调⽤⼊⼝,如果丢失掉其中⼀个参数就创建失败
@param mnt 挂载点,⽗物体
@param size 宽⾼
@param alignment 对齐⽅式
@param text ⽂字内容
@param call_func url的回调回调时候会将url 的 id回传英文在线翻译成中文
CreateRichLab(mnt,size,alignment,text,call_func)
影响⾏数的因素
英语直播课
1.⾃动换⾏
2.字符串⾥⾯有换⾏的符号
实现的步骤应该是:
1.按照元素,⼀个个创建UI元素并且设置元素的各种属性
2.计算长度,先定义为只有⼀⾏UI元素列表,并且进⾏遍历lable查看是否有Line > 1 的⾏,如果有就切割开label,we r who we r
仔细想想应该有两个List<List<;元素>> 元素⼆维表
// 解决调⽤者⾃定义分⾏
元素⼆维表1
⼤概的思路是:
for i < 元素总数
检查元素总数[i] 是否有换⾏
有:⾏数 = 对元素总数[i]进⾏切割
元素⼆维表1[cur_line] << ⾏1
//其余⾏数,⼀⾏就是⼀个新的
for line = 1 ,line < ⾏数; ++line
元素⼆维表1.CreateNewLine();
元素⼆维表1[cur_line] << ⾏line
// 这⾥是解决字符串超长导致的换⾏的问题
⼆维表2 // 映射出UI元素位置
再对元素⼆维表1进⾏分割,调⽤API查看是不是溢出width了。
如果遇到表1分⾏,则对元素⼆维表2进⾏分⾏
如果超出width,也要对表2进⾏分⾏
// 检查字符串长度的⽅法://blog.csdn/fenrir_sun/article/details/54342313
最终的结果就是⼀⾏⼆维表中的元素对应的UI也是⼀⾏
3.层级管理
shishi
因为它们都不会重叠,实现上只要⼀层就能全部显⽰了,但是⼜因为全部都在同⼀层级会增加不少drawcall,所以得分层 暂定为:所有相同的UI都设置为同⼀个depth
4.回收管理
UI回收管理和重复利⽤
⽬前能想到的主要问题就是上述那些了,明天准备写这部分代码,有遇到新问题再补充。
到最后,我会把所有源码都放在码云上
timor
convenient是什么意思希望能遇到对的⼈,提供⼀些更好的实现思路