unity学习笔记-text文本识别html富文本(待改进)
unity学习笔记
- text文本识别html富文本(待改进)
- 需求
- 逻辑
- 实现
- xlua的安装
- 配置到unity
- 使用
- 改进优化(待改进)
text文本识别html富文本(待改进)
需求
项目里需要将之前外包的h5界面的内容移植到引擎中
前面已经完成了视频的在线播放(uniwebview插件实现),也通过方法查询信息将数据动态的展示在界面中
过程中遇到了一个问题,那就是接口返回的数据里存在html格式的富文本数据,而unity本身能够识别的富文本格式很少,显示到引擎中会出现很多html的标签字符串,看起来十分的不雅观
需要做到的就是在显示之前通过对富文本的处理,显示unity本身能够识别的富文本然后再显示到界面里
逻辑
通过c#先对接收到的富文本字符串进行踹选,去除掉用不了的标签信息,
然后通过xlua对富文本进行识别处理,返回unity能够支持的富文本格式
显示到untiy界面中
实现
由于对前端的知识不是很熟悉,所以在网上找到了一个通过xlua处理html富文本的帖子
链接如下
https://blog.csdn.net/weixin_45283952/article/details/118571946
有关如何使用xlua这个网上的教程大多都是基础的不能在基础的,看了之后基本没卵用
我总结一下自己用到的方法
xlua的安装
(这个网上还是能找到的),简单的说就是在
github.com/Tencent/xlua/releases
下载xlua,注意,下载2.1.15
配置到unity
把下载的压缩包里的assets里的plguins和Xlua文件导入到unity里
使用
上面提到的通过xlua实现富文本识别的大佬的帖子里只是说明了xlua的内容,具体怎么调用的没有说,我在自己摸索了之后是这么做的
1新建一个lua文件(streamingassets下)
写上下面的代码
`local test = require(“HtmlToLua”)
local testtool = {}
function Test(richText)
local result = “”
result = test:HtmlToLua(richText)
return result
end
`
第一行是在同级目录下引用其他的lua文件
默认的路径是在c#里传入的路径,如果c#里lua文件路径修改了的话,引用的时候路径也需要跟着修改
下面是局部变量可以不写
然后是写一个全局的方法函数,参数写上需要传入的数据名称(自定义)
把第一行引用的lua作为类来调用里面的方法即可
end结束方法
(更多的lua使用可以去找基础的教程)
**其实逻辑就是通过新建一个lua引用已经写好的lua,调用它里面的方法就好了 **
当然这个帖子大佬写的很好(反正我看的不是很懂),只不过功能里没有实现对所有html标签的识别
刚好项目里接收到的数据信息里就有大佬的帖子里没有的标签
所以没办法还是得想办法
首先在看了大佬的xlua之后发现有可以对标签筛选的内容,项目里有一个< strong >的标签,所以就在那里添加了一个对这个标签进行处理的内容
如图
不过这样还不够,项目里的数据还有对< p >进行样式修改的内容(< p style=“text-align:center…”>)
而大佬的方法里好像只做了对span标签里颜色和大小样式的处理,没有做其他的更多操作
改进优化(待改进)
由于对前端和lua都不太熟悉,所以想到的办法就是先在C#里对数据进行处理,去掉这些处理不了的样式,像居中的效果在unity的text也能做到
所以干脆就这么办了
通过对数据的分析发现样式的字符串附近会有"和空格,
通过string.split函数拆开字符串,然后处理判断一下,生成新的字符串,把这个字符串传给xlua解析
具体的方法如下
string[] parames = exText.Split('"');//exTExt就是原始的html富文本字符串string first = "";int index = 0;foreach (string parame in parames){if (index%2==0){if (parame.Contains(" ")){string[] parames2 = parame.Split(' ');first += parames2[0];}else first += parame;}index++;}
这个方法就相对比较死,在目前的阶段能用,如果后面接口里返回更多的样式和标签的话,还得对他进行更多的判断处理
看后面有没有时间研究一下吧
c#完整代码如下:
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.UI;
using XLua;public class RichTextDemo : MonoBehaviour
{public Text text;public delegate string Test(string richText);// Start is called before the first frame updatevoid Start(){LuaEnv luaEnv = new LuaEnv();luaEnv.AddLoader(myLoader);string text1 = "<p><br/></p><p style=\"text-align: center;\"><strong>课程介绍</strong></p><p><strong><br/></strong></p><p style=\"text-align: center;\">一起来创作吧~</p>";luaEnv.DoString("require 'main'");Test func1 = luaEnv.Global.Get<Test>("Test");string exText = text1;//手动去掉style样式的方法string[] parames = exText.Split('"');string first = "";int index = 0;foreach (string parame in parames){if (index%2==0){if (parame.Contains(" ")){string[] parames2 = parame.Split(' ');first += parames2[0];}else first += parame;}index++;}Debug.Log(first);text.text = func1(first);}public byte[] myLoader(ref string filePath)//这个是很多教程里都涉及到的访问路径,有不理解的可以看看其他的lua基础帖子{string path = Application.streamingAssetsPath+"/"+ filePath + ".lua";return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(path));}
}
这次对lua的二次接触发现之前学xlua热更新的还是太皮毛了,最近在看b站大佬刚出的xlua热更新的视频,里面说了ab包和代码热更的具体操作,加油吧,链接送上
https://www.bilibili.com/video/BV1xv411G77U/
同天下午更新一下
发现一个小bug
如果字符串里在非p标签里出现了空格(比如
123 123123
)的话是会报错的
因为按照上面的逻辑是有问题的,所以下午改进了一下对字符串的处理
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using XLua;public class AnalysisHtml5Tools : MonoBehaviour
{public delegate string AnalysisRichText(string richText);// Start is called before the first frame updatevoid Start(){}/// <summary>/// 解析html富文本的方法/// </summary>/// <param name="richText">html富文本字符串</param>/// <returns>解析后字符串</returns>public string AnalysisRichTextMethod(string richText){LuaEnv luaEnv = new LuaEnv();luaEnv.AddLoader(myLoader);//string text1 = "<p><br/></p><p style=\"text-align: center;\"><strong>课程介绍</strong></p><p><strong><br/></strong></p><p style=\"text-align: center;\">一起来创作吧~</p>";luaEnv.DoString("require 'main'");AnalysisRichText func1 = luaEnv.Global.Get<AnalysisRichText>("Test");//去掉开头的换行//richText = richText.Substring(11);//string exText = richText;//手动去掉style样式的方法string[] parames = richText.Split('"');int index = 0;string tem = "";foreach (string parame in parames){if (index % 2 == 0 && !parame.Contains("text")){tem += parame;}}//去掉style=string[] tem1 = tem.Split(' ');string tem2 = "";foreach (string parame in tem1){if (parame.Contains("style")){tem2 += parame.Substring(parame.IndexOf("style") + 6, parame.Length - 6);}else tem2 += parame;}string luaText = func1(tem2);return luaText;}public byte[] myLoader(ref string filePath){string path = Application.streamingAssetsPath + "/" + filePath + ".lua";return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(path));}}
逻辑就是先通过字符判断把样式里的关键词捉出来然后去掉,保证不影响后面即可
然后才是对样式关键词的捕捉和去除
unity学习笔记-text文本识别html富文本(待改进)相关推荐
- pyQt5 学习笔记(21)QTextEdit 富文本框
文章目录 一.QTextEdit 简介 二.QTextEdit 的创建 三.QTextEdit 常见功能(API) 1. 占用文本的使用 2. 内容设置 2.1 设置文本格式 2.2 插入文本和追加文 ...
- 【Unity学习笔记】b站Unity架构课Unity3D 商业化的网络游戏架构(高级/主程级别)
[Unity学习笔记]b站Unity架构课Unity3D 商业化的网络游戏架构(高级/主程级别) 自己跟着学完了,写了不少代码,会放在CSDN代码库,因为老师并没有提供源码,录屏也不是完全连续,所以难 ...
- unity学习笔记2-卡牌游戏的制作
unity学习笔记2 需求:制作卡牌游戏 第一步,建立card类,carddatabase类 card类删除自带的start和update方法,因为只是个对象类,负责装载对象即可 carddataba ...
- Unity学习笔记:监听函数有什么卵用?(似乎就是从一件事过渡到另一件事?)
Unity学习笔记:监听函数有什么卵用?(似乎就是从一件事过渡到另一件事?) 个人学习经验,仅供参考,欢迎各位码友批评指正. 做项目敲代码时,一直不是很理解监听函数是个什么玩意. 按我目前的理解,说白 ...
- Unity学习笔记1 简易2D横版RPG游戏制作(一)
这个教程是参考一个YouTube上面的教程做的,原作者的教程做得比较简单,我先参考着做一遍,毕竟我也只是个初学者,还没办法完全自制哈哈.不过我之前也看过一个2D平台游戏的系列教程了,以后会整合起来,做 ...
- 【Unity学习笔记】[Unity中文课堂教程] C#中级编程代码
[Unity学习笔记][Unity中文课堂教程] C#中级编程代码 最近想补一补C#基础,Unity官方的C#中级编程教程质量很高,于是开个帖子把跟着敲+记录了部分价讲解和我自己的理解的代码存在这 原 ...
- unity学习笔记-番外(3d模型的动作设计以及导入-2018版)材质的替换以及动作穿模(自己的手穿模到自己的其他部位)
unity学习笔记-番外(3d模型的动作设计以及导入) 动作设计白嫖方法 方法一:小k网 需要注意的地方 方法二:mixamo 需要注意的地方 材质的替换 一 动作的穿模 2021.5.13更新 -2 ...
- Unity学习笔记(4)-----粒子效果的实现
Unity学习笔记(4)-–粒子效果的实现 一.效果展示 下面用若干张张动图展示效果: 大概就是这样,并不是很难. 实际效果要比图中的好一点(顺畅得多). 实现步骤 大致可以分为如下几个步骤,然后逐个 ...
- Unity学习笔记:个人学习项目《疯狂天才埃德加》纠错文档
Unity学习笔记:个人学习项目<疯狂天才埃德加>纠错文档 本文档是完成学校Unity课程作业时建立的纠错文档.用于记录自己开发过程中遇到的各种问题,以便下次遇到相同的问题时及时找到解决方 ...
最新文章
- 一流科技CEO袁进辉:人工智能产业化困局和机遇
- 在水晶报表中实现任意选择指定字段显示-模板及C#升级版
- Intellj idea启动tomcat配置
- Cent OS yum 安装 Adobe flash player
- java实现 阿拉伯数字转换为汉字数字 算法
- 关于豆瓣电台收费的思考
- java画布颜色切换_在本视频讲解演示中,扩展画布的目的是为了后面制作齿孔时操作起来方便,扩展部分更换了另一种颜色,是为了以示区别,能直观区分出票面部分。...
- java怎样输出闰年,Java 小日历格式输出 闰年计算
- java获取资源文件的各种方法
- 把java程序打包成.exe
- c语言将两个文件合成一个,keil中怎么把两个c程序怎么同时同时编译生成一个hex文件...
- spring boot缓存excel临时文件后再操作
- RabbitMQ教程_4 Java 使用rabbitmq
- Java 初学记录之一 快速输入
- python元组排序_python元组怎么排序
- sourceInsight
- android 时钟旋转动画,抖音上超火的时间轮盘时钟轮盘八卦太极动态壁纸软件分享安卓苹果都可以设置!...
- 蓝牙渗透测试过程:部分工具使用方法
- ubuntu20.04 跳过grub
- org.w3c.dom。 XML解析 练习
热门文章
- google guava的基础部分Demo实例(注释详尽)
- 保险业务与系统——LOMA 290 保险公司运营——第十四讲——财务管理
- 【上位机】通过QTCreator编写WIFI上位机与网络调试助手通信绘制曲线
- 爆炸,解体,入侵,你想得到的你想不到的大BUG们
- 创建自己的虚拟网卡TAP口
- 录制你的第一个web 自动化测试用例
- java计算机毕业设计高校共享单车管理系统(附源码、数据库)
- 计算机应用基础蓝色方框在哪,计算机应用基础Word2010综合测试操作步骤参考自测题步骤...
- requests+xpath爬取电影天堂电影信息
- 旋钮编码开关工作原理