文章目录
在忙完项目以后,我又回来了,利用一些时间和心力去总结和思考一些东西。最近项目中玩家通过微信登录,登录后的微信昵称含有emoji表情,这样直接使用会显示乱码,C#无法直接处理,网上也没有比较好的解决方案,刚好找到了图文混排开源demo,顺便优化了一下脚本。
提示:以下是本篇文章正文内容,下面案例可供参考
绘文字(日语:絵文字/えもじ emoji)是日本在无线通信中所使用的视觉情感符号,绘指图画,文字指的则是字符,可用来代表多种表情,如笑脸表示笑、蛋糕表示食物等。在中国大陆,emoji通常叫做“小黄脸”,或者直称emoji
在NTTDoCoMo的i-mode系统电话系统中,绘文字的尺寸是12x12 像素,在传送时,一个图形有2个字节。Unicode编码为E63E到E757,而在Shift-JIS编码则是从F89F到F9FC。基本的绘文字共有176个符号,在C-HTML4.0的编程语言中,则另增添了76个情感符号。
自苹果公司发布的iOS 5输入法中加入了emoji后,这种表情符号开始席卷全球,emoji已被大多数现代计算机系统所兼容的Unicode编码采纳,普遍应用于各种手机短信和社交网络中。

*注意 Emojis跟QQ目录下的图片过多,打包项目时可存放到其他项目或者其他地方,减少打包的大小,这个两个目录的作用只是用于生成EmojiAtlas跟QQIconAtlas图集而已

Emojis目录下的图片

QQ目录下的文件



路径为自己项目的路径

(一)命名方法
Emoji表情XML命名: EmojiXml 图集命名: EmojiAtlas
QQ表情XML命名: QQIconXml 图集命名:QQIconAtlas
设置好上面的参数。生成会把图片文件夹中的图片遍历打到一个Texture2D中,然后把每张图片在图集的位置大小记录下来,然后把这些数据存入xml文件中。在生成每个表情时可以设置UV来确定哪一个图片。
单击生成,会自动生成图集跟XML文件,见下图
(二)生成图集效果

(三)生成XML配置文件

(四)XML配置文件内容

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using LitJson;
using UnityEngine;
using UnityEngine.UI;
public class IndexPanel : BaseUI
{
public Text userNameTxt;
# 定义图集参数并在预制体上绑定
public Texture emojiAtlas;
public Texture qqIconAtlas;
// Use this for initialization
void Start(){
StartCoroutine(GetReadEmojiXml());
StartCoroutine(ReadIconXml());
}
public static IEnumerator ReadIconXml() {
string path = Application.streamingAssetsPath+"/Xml/QQIconXml.xml";
#if UNITY_EDITOR || UNITY_STANDALONE || UNITY_IOS
path = "file://"+path;
#endif
WWW wWA=new WWW(path);///WWW读取在各个平台上都可使用
yield return wWA;
XmlDocument XmlDoc = new XmlDocument();
// Debug.LogError("-----------------QQ表情配置内容:"+wWA.text);
XmlDoc.LoadXml(wWA.text);
XmlNodeList nodeList = XmlDoc.SelectSingleNode("root").ChildNodes;
foreach (XmlElement xe in nodeList)
{
var resStr = string.Empty;
resStr = xe["textTag"].InnerText + "|" + xe["rectX"].InnerText + "|" + xe["rectY"].InnerText + "|" + xe["rectWidth"].InnerText + "|" + xe["rectHeight"].InnerText + "|" + "0";
EmojiTextManager.Instance.ParseNormalIcon(resStr);
}
}
public static IEnumerator GetReadEmojiXml(){
Debug.LogErrorFormat("---------------------Application数据路径为:"+Application.streamingAssetsPath);
string path = Application.streamingAssetsPath+"/Xml/EmojiXml.xml";
#if UNITY_EDITOR || UNITY_STANDALONE || UNITY_IOS
path = "file://"+path;
#endif
WWW wWA=new WWW(path);///WWW读取在各个平台上都可使用
yield return wWA;
XmlDocument XmlDoc = new XmlDocument();
// Debug.LogError("-----------------Emoji表情配置内容:"+wWA.text);
XmlDoc.LoadXml(wWA.text);
XmlNodeList nodeList = XmlDoc.SelectSingleNode("root").ChildNodes;
foreach (XmlElement xe in nodeList)
{
var resStr = string.Empty;
resStr = xe["emojiFileNames"].InnerText + "|" + xe["rectX"].InnerText + "|" + xe["rectY"].InnerText + "|" + xe["rectWidth"].InnerText + "|" + xe["rectHeight"].InnerText + "|" + xe["textTag"].InnerText;
EmojiTextManager.Instance.ParseEmojiInfo(resStr);
}
}
}
在IndexPanel预制体上绑定图集跟EmojiTextManager脚本

{
"code": "20000",
"data": {
"phonePrefix": "+86",
"ip": "111.111.11.111",
"avatar": "group1/M00/00/10/rBKu4WHyN4GEfAhZAAAAAE40vZI779.jpg",
"inGame": false,
"userName": "\u8365\u9633\uD83D\uDE1A\u5154\u5154\uD83C\uDDE8\uD83C\uDDF3",
"myInviteCode": "70436160",
"token": "ffJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJub2NlIjoxNjQ1MjYwNTkwMDI1LCJ1c2VybmFtZSI6Iis4NjoxNTIxODk2ODMyMSJ9.CIDWw9B0IwoQQqwXcnLWkvpv8lZWdEu3-KXukQNM4ff",
"hasThirdParty": false,
"lastLoginTime": 1645260589987,
"diamond": 8242,
"phone": "11111111111",
"gpsLat": "111",
"inviteCode": "111111",
"gpsLng": "111111",
"connection": {
"port": 00,
"host": "11.111.111.1"
},
"id": "70436160",
"gpsLoaction": "\u7279\u6717\u666e\u5bb6",
"status": 0
},
"message": "\u6210\u529F",
"requestId": "1645260589",
"url": "gateServer::/login"
}
返回的json里面有userName,这里就是要处理的数据,可复制后面的Unicode字符串到Unicode编码转换开放平台上转换,转换结果如下:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using LitJson;
using UnityEngine;
using UnityEngine.UI;
public class IndexPanel : BaseUI
{
public Text userNameTxt;
# 定义图集参数并在预制体上绑定
public Texture emojiAtlas;
public Texture qqIconAtlas;
// Use this for initialization
void Start(){
StartCoroutine(GetReadEmojiXml());
StartCoroutine(ReadIconXml());
string userNameStr = "\u8365\u9633\uD83D\uDE1A\u5154\u5154\uD83C\uDDE8\uD83C\uDDF3";
# 传入方法中(参数: Text文本, Unicode字符串, 图集)
EmojiTextManager.Instance.SetUITextThatHasEmoji(userNameTxt, usrNameStr, emojiAtlas);
}
public static IEnumerator ReadIconXml() {
string path = Application.streamingAssetsPath+"/Xml/QQIconXml.xml";
#if UNITY_EDITOR || UNITY_STANDALONE || UNITY_IOS
path = "file://"+path;
#endif
WWW wWA=new WWW(path);///WWW读取在各个平台上都可使用
yield return wWA;
XmlDocument XmlDoc = new XmlDocument();
// Debug.LogError("-----------------QQ表情配置内容:"+wWA.text);
XmlDoc.LoadXml(wWA.text);
XmlNodeList nodeList = XmlDoc.SelectSingleNode("root").ChildNodes;
foreach (XmlElement xe in nodeList)
{
var resStr = string.Empty;
resStr = xe["textTag"].InnerText + "|" + xe["rectX"].InnerText + "|" + xe["rectY"].InnerText + "|" + xe["rectWidth"].InnerText + "|" + xe["rectHeight"].InnerText + "|" + "0";
EmojiTextManager.Instance.ParseNormalIcon(resStr);
}
}
public static IEnumerator GetReadEmojiXml(){
Debug.LogErrorFormat("---------------------Application数据路径为:"+Application.streamingAssetsPath);
string path = Application.streamingAssetsPath+"/Xml/EmojiXml.xml";
#if UNITY_EDITOR || UNITY_STANDALONE || UNITY_IOS
path = "file://"+path;
#endif
WWW wWA=new WWW(path);///WWW读取在各个平台上都可使用
yield return wWA;
XmlDocument XmlDoc = new XmlDocument();
// Debug.LogError("-----------------Emoji表情配置内容:"+wWA.text);
XmlDoc.LoadXml(wWA.text);
XmlNodeList nodeList = XmlDoc.SelectSingleNode("root").ChildNodes;
foreach (XmlElement xe in nodeList)
{
var resStr = string.Empty;
resStr = xe["emojiFileNames"].InnerText + "|" + xe["rectX"].InnerText + "|" + xe["rectY"].InnerText + "|" + xe["rectWidth"].InnerText + "|" + xe["rectHeight"].InnerText + "|" + xe["textTag"].InnerText;
EmojiTextManager.Instance.ParseEmojiInfo(resStr);
}
}
}
编辑器效果

最终效果图

创作不易,记得😍一键😚三连😘支持一下!

其他博客含有表情包的链接:
博客一:unity3d在UGUI中显示带表情的微信昵称
博客二:UGUI Text组件上动态显示Emoji
*注意: 源码文本长度不够会报错
GitHub源码地址:mcraiha/Unity-UI-emoji
博主优化后源码地址:Unity开发对Emoji表情包图文混排进行处理显示(支持大多数表情)
想了解更多,可以看一下csdn的Unity商业级Emoji表情系统-11.TexturePacker的简单使用教程(付费视频) 【其实本人也没看过🙈,哈哈~】
放下你的浮躁,放下你的懒惰,放下你的三分钟热度,放空你禁不住诱惑的大脑,放开你容易被任何事物吸引的眼睛,放淡你什么都想聊两句八卦的嘴巴,静下心来做你该做的事,该好好努力了!有时候真的努力后,你会发现自己要比想象的优秀很多。记住一句话,越努力,越幸运。

1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,
在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主
1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模
我想将“US”之类的国家代码转换为表情符号标志,即将“US”字符串转换为Ruby中适当的Unicode。Here'sanequivalentexampleforJava 最佳答案 使用tr将字母字符转换为其区域指示符号:'US'.tr('A-Z',"\u{1F1E6}-\u{1F1FF}")#=>"??"当然你也可以直接使用Unicode字符:'US'.tr('A-Z','?-?')#=>"??" 关于ruby-从Ruby中的国家代码获取表情符号标志,我们在StackOverflow上找
我是Ruby新手,并被要求在我们的新项目中使用它。我们还被要求使用Padrino(Sinatra)作为后端/框架。我们被要求使用Rspec进行测试。我一直在寻找可以指导在Padrino上使用RspecforRuby的教程。我得到的主要是引用RoR。但是,我需要RubyonPadrino。请在任何入门/指南/引用/讨论等方面指导我。如有不妥之处请指正。可能是我没有针对我的问题搜索正确的词/短语组合。我正在使用Ruby1.9.3和Padrinov.0.10.6。注意:我还提到了SOquestion,但它没有帮助。 最佳答案 我没用过Pa
3月26日,映宇宙(HK:03700,即“映客”)发布截至2022年12月31日的2022年度业绩财务报告。财报显示,映宇宙2022年的总营收为63.19亿元,较2021年同期的91.76亿元下降31.1%。2022年,映宇宙的经营亏损为4698.7万元,2021年同期则为净利润4.57亿元;期内亏损(净亏损)为1.68亿元,2021年同期的净利润为4.33亿元;非国际财务报告准则经调整净利润为3.88亿元,2021年同期为4.82亿元,同比下降19.6%。 映宇宙在财报中表示,收入减少主要是由于行业竞争加剧,该集团对旗下产品采取更为谨慎的运营策略以应对市场变化。不过,映宇宙的毛利率则有所提升
1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva
文章目录1.任务背景2.任务目标3.相关知识点4.任务实操4.1安装配置JDK4.2启动FISCOBCOS4.3下载解压WeBASE-Front4.4拷贝sdk证书文件4.5启动节点4.6访问节点4.7检查运行状态5.任务总结1.任务背景FISCOBCOS其实是有控制台管理工具,用来对区块链系统进行各种管理操作。但是对于初学者来说,还是可视化界面更友好,本节就来介绍WeBASE管理平台,这是一款微众银行开源的自研区块链中间件平台,可以降低区块链使用的门槛,大幅提高区块链应用的开发效率。微众银行是腾讯牵头设立的民营银行,在国内民营银行里还是比较出名的。微众银行参与FISCOBCOS生态建设,一定
目录H2数据库入门以及实际开发时的使用1.H2数据库的初识1.1H2数据库介绍1.2为什么要使用嵌入式数据库?1.3嵌入式数据库对比1.3.1性能对比1.4技术选型思考2.H2数据库实战2.1H2数据库下载搭建以及部署2.1.1H2数据库的下载2.1.2数据库启动2.1.2.1windows系统可以在bin目录下执行h2.bat2.1.2.2同理可以通过cmd直接使用命令进行启动:2.1.2.3启动后控制台页面:2.1.3spring整合H2数据库2.1.3.1引入依赖文件2.1.4数据库通过file模式实际保存数据的位置2.2H2数据库操作2.2.1Mysql兼容模式2.2.2Mysql模式
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:FlashMessagesinPartials(Rails3)我正在做MichaelHartl的Railstutorial和listing7.26将flash消息添加到应用程序布局:...">...这很好用。但是,我试图通过在我的部分文件夹中创建一个_flash.html.erb来清理这段代码...">-->...并且比使用......在我的应用程序布局中,我的所有Rspec测试开始失败,每个测试都显示以下消息:Failure/Error:before{visitsignup_path}ActionView: