[Unity] 解决Unity原生UI文字模糊的小技巧

[Unity] 解决Unity原生UI文字模糊的小技巧,第1张

很多人都觉得Unity原生UI(uGUI)的Text不好用,功能过分简单,而且还很模糊。比如题图中第一行Text使用了 size =24 的字号,边缘明显模糊了。因此,目前流行使用TextMeshPro来制作UI文字,甚至Unity把TextMeshPro都买下来内置到引擎了。

TextMeshPro功能确实强大,但一个劣势是不能直接识别字体文件,需要用户自己将字体文件转换成Atlas(也就是式的字符集)再使用。这对于英文字体非常简单,一共也就那么多个字符需要转换,但对于中文字体来说就很麻烦了,常用中文字集有3500和6500两个版本,转换耗时非常久。

对于对UI文字要求没那么高的用户来说(比如我),还是直接使用uGUI的Text更为方便,但这个模糊问题又很恼火。

我仔细研究了一下uGUI的Text,发现:这个模糊其实是显示字体时为了抗锯齿而出现的, 不同字号的Text的边缘模糊程度如果用像素来衡量的话其实是一样的。 比如题图第三行Text使用了 size =128 的字号,给人的感觉就好很多了(虽然其实边缘模糊绝对数值和第一行是一样的)。

这说明,如果我们能将大字号的Text缩小,那么这个缩小版就比小字号Text的边缘要清晰很多。

题图中第二行字同样使用 size =128 的字号,但同时设置Scale为02,这样其实际尺寸与第一行字差不多,但边缘模糊几乎不存在了,反而感觉有点太锐化了。

这样就比较完美地解决了uGUI文字模糊的问题,我们又可以开心地使用Text来制作UI了。

fbx是比较复杂的格式 ,想要保存需要对其书写格式进行了解。

推荐使用OBJ格式 ,书写简单可以保存模型。

using SystemIO;

这个命名空间可以让你写文件。

然后写代码读取mesh对象的数据,根据obj书写格式写在一个文件里。

比如

StreamWriter robj = new StreamWriter(ApplicationdataPath + "/Test/modOBJ", true);

这样就保存了。

为了渲染出我们自制的Mesh,我们首先在一个空组件上增加MeshFilter和MeshRenderer。

MeshFilter是针对我们这个GameObject存储的Mesh,Mesh Renderer组件就是读取自身的MeshFilter来获得mesh进行渲染,所以这两个组件是配套使用的。

网格就如字面意思一样就是由点和线组成的东西。

图2是一个平面网格,图3就是我们常见的cube网格。

而我们常见的网格的最小单元是一个三角形,也就是3个顶点组成的最小单元。

制作一个Mesh非常的简单,我们只需要new一个Mesh然后赋值给我们的MeshFilter组件就可以拉。

但是这样我们还是看不出个什么来因为网格没有其他的一些信息,也没有顶点信息。

到这一步我们就要开始正式的为我们制作的Mesh增加顶点啦,首先尝试加3个点。

这样我们的顶点坐标就成功的加到了我们Mesh里拉。

这里的坐标点对应的是世界坐标的坐标点。

这里的0是顶点坐标信息下标里的0,是和vertices对应上的。存储的就是顶点坐标的下标。

但是设置到这你就发现没用啊,场景里没有生成东西啊什么反应都没有。

因为我们需要连接的是一个最小单元也就是一个三角形,所以从连接上来看我们是一条线,不能形成一个面啦,所以我们只需要稍作调整就可以得到一个三角面啦。

这时候点击Mesh查看就能看到一个三角面的网格啦;

场景中也对应的出现了一个紫色的没有材质的三角面。

但是有的朋友可能生成之后看不到场景里的三角面,如下图。

这是为什么会这样呢?首先需要确认你的MeshRenderer组件的materials size大于0

排除这个问题就到了一个需要注意的点triangles,Mesh的三角下标信息。

仔细对比图6 和 图7的坐标系发现 图6显示出来的三角面试是在z轴的正方向,而不显示的图7是在z轴的反方向。

这是因为我们只渲染了一个面,所以背面信息没有渲染。

那是什么信息决定了正面渲染的呢?

其实就是我们的三角面下标顺序。

我们这里的顺序是 0 2 1是一个顺时针旋转。所以是z轴正面渲染。

当我们使用 0 1 2点顺序 也就是 逆时针顺序渲染 看到的 三角面应该是在z轴反面渲染

当我们给MeshRenderer里添加材质你会发现变黑了,为什么是变黑呢?是因为材质没有对应上这个Mesh,这个Mesh的没有uv坐标信息。那么uv坐标到底是什么?

uv坐标就是横坐标为u,纵坐标为v的一个坐标系,一般取值范围是在(0,1)之间。它代表贴图信息的位置关系,贴图每个像素点对应上的具体位置。

如果你加载出来的贴图是一个纯黑的图,就要考虑是不是Auto Greerate lighting 没有设置为on。

在了解什么是法线的前提下,我们先来看看法线对Mesh有什么影响。

效果是不是显而易见的,当没有法线的时候没有光照信息,不反射光照看起来灰蒙蒙的。

而图13 14是加了法线的,它就会受到光线信息的影响,从不同的角度去看都有不一样的效果。

法线分为顶点法线和面法线。在这个三角面上有三个顶点 和一个三角面,对应的也就有3个顶点法线和一个面法线,法线垂直于点、面,方向朝外是一个向量。

在这里简单的添加法线信息可以使用unity带的

当然你也可以自己为它添加法线信息。

这里为什么是-1,不是正1。 我们刚刚说过了法线的方向朝外,当我们灯光照射方向和法线方向相同就看不出光照信息的效果,而相反的话就能很好的反应出受光照的反射效果。

这里只是简单的介绍Mesh网格的一些基础的信息,肯定有很多地方有歧义 也是不好意思啦,如果有不正确的地方欢迎指出。谢谢大家。

using UnityEngineUI;

string textValue = gameObjectGetCompenenet<InputField>()text;

建一个脚本 复制上面的代码 把脚本放在InputField对象上 textValue 里就是输入文本框的字符串

using UnityEngine;

using SystemCollections;

using UnityEngineUI;

 

public class wenzi : MonoBehaviour {

    private string a = "我就不告诉你这么做";

    // Use this for initialization

    void Start () {

        Text text = thisGetComponent<Text> ();

        texttext = a;

        textcolor = Colorred;

 

    }

}

GameObjectFind("GUI_ZT")guiTexttext="";

注意GameObjectguiText是一个组件(脚本),他有一个属性叫text,所以要改的不是guiText而是guiTexttext

关于该脚本的属性这个问题,首先你要明白unity的组织结构。他是通过场景里的所有物体(GameObject)形成的树状结构,最直观的就说Hierarchy面板下的所有物体(GameObject,以下称为Go)。即,每个Go下面有除了一堆组件(Component,或者Monobaviour,也称为脚本)外,还有一个或者多个子Go。

unity的这种结构和很多主流引擎的结构是相同的,这种结构的好处就是加快搜索效率,从而提高游戏效率。在unity中,形成这个结构的组件就是Transform,通过它的Parent、Root、Child等方法就能搜索在这个Transform所在的Go上的子Go或者父Go。unity还提供了很多搜索的方法,比如用GetComponent,GetComponent<T>,GetComponentInChildren等很多查询组件的方法。为了更方便地查询,还有全局静态方法如GameObjectFind,GameObjectFindOfType等来支持开发者。

所以,你的问题的解决方案更详细地就是:

GameObject ui=GameObjectFind("GUI_ZT");

uiguiTexttext="";

推而广之,你要想改变某个组件(脚本)的某个属性,

1:找到那个脚本所在的GameObject

2:通过这个GameObject找到这个组件(脚本)

3:改变这个组件(脚本)的那个属性值

1、打开Unity,新建一个空工程。

2、在百度上搜索下载XLua,导入Unity工程中。

3、新建一个Lua脚本,内容大概为打印一个消息,设置几个变量,然后保存为“CSCallLualuatxt”。

4、在工程中,新建一个脚本,可以命名为“MyCSCallLua”,双击脚本或者右键“Open C# Project”打开脚本。

5、在打开的脚本“MyCSCallLua”编写代码,首先引入XLua命名空间,然后设置Lua环境变量。

6、运行场景,即可在控制台上看到,获取Lua脚本变量成功的打印。

注意事项:

Unity 是一个用纯C语言编写的测试工具 它简洁实用,多应用于嵌入式系统Unity工具可以裁剪用于各种规模的嵌入式项目,当然,只要是纯C语言的项目,Unity都可以使用。

以上就是关于[Unity] 解决Unity原生UI文字模糊的小技巧全部的内容,包括:[Unity] 解决Unity原生UI文字模糊的小技巧、Unity用代码存储Mesh对象、Unity 制作一个简单的Mesh网格等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9724453.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存