很多人都觉得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网格等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)