使用Unity3D也有两年时间了,最近比较闲,有功夫梳理一下去年一年来学到以及用到的知识,分享给大家,顺便方便自己查阅。如有错误以及不当的地方,欢迎各位指正。谢谢。
去年五月份的时候,刚加入项目不久,老大交给我一个关于聊天系统任务,期初觉得应该很容易,但是看了文档之后,瞬间头都大了_(:з」∠)_,因为需要支持表情!当时Unity3D版本4.3.x,NGUI版本3.5x,当时版本的NGUI已经支持动态字体,我们的项目也不例外,赶忙就用上了。但是,表情的问题要怎么解决?总不能用颜文字吧(╯‵□′)╯︵┻━┻。如果不用动态字体而使用自己制作的图集字体,倒是可以将表情图片打进字库解决。但是既然我们已经用了动态字体,我就只能另想办法了。
经过两天的研究实践,最终找到一个能够实现的解决办法。主要思路是:
1.定义一个标准行宽度,以此作为基准对文字以及表情进行分行处理;
2.使用特殊符号标记表情(例如:#e001),遍历字符串,凡遇到表情标记则将之与位置记录下来,并使用“ ”(空格,具体数量视表情大小而定)将特殊标记替换。
3.使用Vector3记录以上信息,x为表情的横坐标,y为表情所在行数(即纵坐标),z为表情的ID,即刚才的001,以此确定是哪个表情。使用一个List将所有表情信息存放起来,显示时遍历List即可。
有了以上基本思路,下面只要编码实现,但是在编码过程中还是不可避免的问题——如何得到一段文字的长度?这时,就需要用到一个NGUI封装的一个方法NGUIText.CalculatePrintedSize传入参数为string,返回一个Vector2,表示这段文字的长和宽。下面是核心代码。
protected void CalculateExpressionPos(ref string text)
{
NGUIText.finalSize = m_chatInput.label.defaultFontSize;//设置当前使用字体大小
lineList.Clear();
int row = 0;
int textWidth = 0;
int lastStartIndex = 0;
string curLine = "";
int length = text.Length;
for (int i = 0; i < length; i++)
{
if (text[i] == '#' && i + 4 < length && text[i + 1] == 'e')
{
string eName = text.Substring(i + 2, 3);
int eIndex = 0;
Vector3 ePos = Vector3.zero;
if (int.TryParse(eName, out eIndex))
{
float fx = 0;
text = text.Remove(i, 5);
text = text.Insert(i, space);//space = " ";
length = text.Length;
//这里的CalculatePrintedSize是重载过的,
//与原本方法相比多的一个参数自定义行款,替换原方法中的rectWidth即可
textWidth = Mathf.RoundToInt(
NGUIText.CalculatePrintedSize(
text.Substring(lastStartIndex, i - lastStartIndex),
BASELINEWIDTH + 30).x);
//BASELINEWIDTH为标准行宽度,30是根据表情大小确定的,
//这里的表情大小是30*30
if (textWidth > BASELINEWIDTH - 30)
{
curLine = text.Substring(lastStartIndex, i - lastStartIndex + 1);
lineList.Add(curLine);
if (textWidth <= BASELINEWIDTH - 15 ||
textWidth >= BASELINEWIDTH)//行末尾不够需换行
{
fx = 0;
row++;
lastStartIndex = i;
ePos.x = fx - m_offsetX;
ePos.y = row;
ePos.z = eIndex;
}
else //行末尾足够不需换行
{
fx = textWidth;
lastStartIndex = i + space.Length;
ePos.x = fx - m_offsetX;
ePos.y = row;
ePos.z = eIndex;
row++;
}
}
else
{
fx = textWidth;
ePos.x = fx - m_offsetX;
ePos.y = row;
ePos.z = eIndex;
}
}
if (eIndex != 0)
{
eList.Add(ePos);
}
if (!expInLine.ContainsKey(row)) //有表情无表情行,以此确定行间距
{
expInLine.Add(row, true);
}
}
else //记录换行起始Index
{
if (i - lastStartIndex < 0) continue;
float curWidth = Mathf.RoundToInt(
NGUIText.CalculatePrintedSize(
text.Substring(lastStartIndex, i - lastStartIndex + 1),
BASELINEWIDTH + 30).x);
if (curWidth > BASELINEWIDTH)
{
curLine = text.Substring(lastStartIndex, i - lastStartIndex + 1);
lineList.Add(curLine);
lastStartIndex = i + 1;
row++;
}
if (i == length - 1)
{
if (i - lastStartIndex < 0) continue;
curLine = text.Substring(lastStartIndex, i - lastStartIndex + 1);
lineList.Add(curLine);
}
}
}
}
经过以上处理,输出的lineList即为聊天内容,eList为表情信息,expInLine字典存放每行是否存在表情信息。将表情图标打入一个图集,命名为001_1、001_2。。。在显示表情时使用UISpriteAnimation脚本可实现动态表情。最终效果如下:
谢谢观看
- 大小: 20.7 KB
- 大小: 5.9 KB
分享到:
相关推荐
NGUI的一个图文混排demo,NGUI的一个图文混排demo,NGUI的一个图文混排demo
Unity NGUI 图文混排 动态图集解决方案
NGUI的图文混排,解决文字黑底,做成字体乱码等问题,已在实际项目中使用。该Demo已经做好聊天所用常用汉字图集,只需要添加自己的表情图标就行了。然后利用NGUI自带的字体制作,将常规字体和表情图集合在一起即可...
下面我介绍工具的使用方法导入工具 注意:工具是基于NGUI 导入之前 请确保项目中已经有NGUI 不然导入会报错导入成功后会看到 工具是基于NGUI和Textu
这是一套unity中强大的精灵动画系统(基于NGUI的扩展),直接使用NGUI图集方式,有独有的动画编辑系统,高效并快捷的编辑精灵动画,十分的强大。
基于NGUI的序列帧动画制作,在NGUI的基础上来扩展的序列帧操作。只限于学习参考。任何版权在NGUI团队
Unity编辑器:基于NGUI的引用检测工具
Unity3d NGUI 图文并排 超链接 demo
Unity3D 解析Html的最好用的插件,没有之一。 支持NGUI 和 Unity GUI 显示。 支持文字格式,排版,文字超链接,图文混排等Html标签。 1.3.09f1 版,支持 NGUI 3.09f1
基于NGUI 3.6.8版本进行讲解. 目 录 第 1 章 初识NGUI 1.1 游戏UI开发介绍 1.2 什么是NGUI 第 2 章 NGUI基础 2.1 导入NGUI插件 2.2 认识基本的UI资源 2.3 制作第一个UI图集 2.4 制作第一个UI字体 2.5 创建...
NGUI 粒子效果与特效 无法正常显示解决方案
NGUI离线文档 基于3.7.5
基于NGUI 制作人物头顶文字,血条 加血减血效果等等
NGUI Next-Gen UI是一款功能强大、灵活性高的UI插件,是当前最新版本的NGUI插件。它可以覆盖Unity的多个版本,包括Unity 5、Unity 2017和Unity 2018等。与其他UI插件相比,NGUI Next-Gen UI具有高效的性能和优秀的...
基于NGUI的第三方插件NData i.基于MVVM框架 ii.基于NGUI插件 3. NData的特点 i. 双向文本绑定,包括单个数据绑定和多个数据绑定,以及格式化功能 ii. 对于按钮的命令绑定,以便触发代码逻辑 iii. UI状态检测
一套基于NGUI封装的控件,可以用于RPG等游戏界面
大名鼎鼎的U3D插件NGUI,移动开发做界面都用它.最新官方版本,包含API文档.
本包中共有六个版本的NGUI,大家可以自己选择版本。 NGUI Next-Gen UI 3.6.0.unitypackage NGUI Next-Gen UI 3.12.1(u5.6.5).unitypackage NGUI Next-Gen UI 2019.3.0.unitypackage NGUI Next-Gen UI v2018.3.0....
基于tolua的ngui的版本.欢迎有需要的小伙伴一起学习.阿拉蕾
NGUI Next-Gen UI 3.12.1(基于unity)NGUI Next-Gen UI 3.12.1(基于unity)