这是一个Text文本的混编逻辑实现,运行游戏,表现如此,文本和图片还有视频播放,和Text文本混合在一起显示

两个类,分别是图片和视频数据,对应的结构,除了默认的Sprite和Video俩原始数据类型,DefaultSize就是图片或者视频的,默认尺寸大小,而AdaptiveSize这个布尔,就是判断,是否要适配字体大小

资源类,就是用来加载对应资源的了,其中EmojiConfig.DEFAULT_PATH就是,表情符图集,和视频资源,所在的路径位置

通过构造资源数据数组,在对应的路径,拿到图片和视频数据

表情标识符是$,会放在字符的前后,作为标识,而&是一个分隔符,前面是表情类型,例如图片或者视频,后者是对应的文件序号; 函数GetEmojiInfo,传参里面,后面两个,分别是表情符的标识EmojiTypeKey和,文件索引spriteIndex,都是ref,参考out和ref之间的区别; 从字符串中,根据长度和索引,通过SubString拿到对应的字符数据,然后根据分隔符,拿到对应的key数组; 遍历EmojiTypeKey枚举,拿到合法的,表情符种类; key数组的索引1号数据,就是文件本身的索引;

这是两个方法,分别是往图片字典容器,塞图片的; 还有通过id,从图片字典容器拿图片资源即可;

测试demo,只用了一个视频数据,不需要队列容器存储,在GetVideoData函数接口,直接通过 Resources.Load 方法,通过资源路径加载即可

初始化函数,就是遍历图片数据合集,调用SaceSpriteData函数,加到图片队列容器

表情中的视频播放,是基于渲染纹理播放的,参考RenderTexture,对应的具体逻辑,其中声明的几个,序列化变量

几个功能函数,添加组件,播放视频,设置节点实体的sizeDelta尺寸

设置显隐的相关逻辑,如果是要显示,在渲染之前,就调用rawImage重绘,参考CanvasUpdate.PreRender

表情符视频体,对应的初始化逻辑,就是设置一下,父子节点关系,再通过AddComponent功能接口,加上和实例化,对应的变量; 创建一个新的RenderTexture渲染纹理,设置尺寸是1280*720,设置一下目标渲染的目标纹理贴图targetTexture; 再调用SetDirectAudioVolume接口, 设置一下音量即可;

对应节点,挂载和表现

单个表情符的逻辑类,其中声明几个,序列化的变量,分别是图片,视频Item和自身的位置信息rect,在初始化函数,完成赋值即可

设置图片和播放视频的对应接口

设置尺寸,需要switch对应的类型,针对视频或者图片,有不同的处理方法; 还有设置Pos位置和显隐,也是调用CanvasUpdate.PreRender

这是外部调用的脚本

是继承自UGUI的Text文本,其中声明的变量,有存放EmojiItem单个表情实体的队列容器_items,还有一个用来存放表情,索引位置信息和长度的EmojiPlaceholder队列容器; 还有声明序列化的,三个字符串,是用来逻辑处理,字符和表情符相关的;

实例化单个表情Item的逻辑接口

实例化出来之后,对应初始化的逻辑接口; 先通过正则表达的Match匹配,拿到字符,然后调用之前解析的GetEmojiInfo接口,基于分隔符’&‘解析得到,表情的type类型和id索引; 然后基于type进行switch,拿到对应的表情类型,进行视频或者图片的,表情符逻辑构造初始化; 设置一下size尺寸;

通过index索引,拿到对应的,单个表情实体,设置显隐接口

对字符串的解析处理,先清空表情符,位置信息EmojiPlaceholder,队列容器_emojiStartIndex,然后 用StringBuilder 拼接 后续字符,进行处理; 通过正则表达式,拿到合法有效的表情符信息; 正则match的Success标识如果为true,就开始调用,上述解析的,实例化 和 初始化 表情符相关逻辑,也把坐标和长度信息,加到容器_emojiStartIndex中;

这个解析处理,在脏标记SetVerticesDirty重写里面,调用即可

拿到数据之后,是根据字体大小pixelsPerUnit的倒数,作为传参的unitsPerPixel,进行SetPos位置赋值; 使用字体缓存cachedTextGeneratorUIVertex队列合集verts,配合上述作为传参的unitsPerPixel完成,位置赋值和显隐,逻辑处理; 因为网格纹理UIVertex 是有4个坐标,所以进行*4处理;

添加多边形相关逻辑,也是使用了字体缓存cachedTextGeneratorUIVertex队列合集verts,配合pixelsPerUnit的倒数,拿到位置偏移,使用PixelAdjustPoint完成屏幕转像素点转换; 使用表情符的_emojiStartIndex 队列容器,配合偏移,完成新增,新的多边形,用来存储表情符,参考AddUIVertexQuad

上述的两个,设置表情符位置信息,还有新增多边形存储的函数逻辑,在重写的OnPopulateMesh逻辑中,调用即可,其中用到的UGUI内置函数,参考m_DisableFontTextureRebuiltCallbackGetGenerationSettingsPopulateWithErrorspixelsPerUnit即可