版本:Unity 6 (6000.0)
语言英语
  • C#

Font.RequestCharactersInTexture

建议更改

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们无法接受所有提交内容,但我们确实阅读了用户提出的每项更改建议,并在适用时进行更新。

关闭

提交失败

由于某些原因,您的建议更改无法提交。请<a>稍后再试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

声明

public void RequestCharactersInTexture(string characters, int size = 0, FontStyle style = FontStyle.Normal);

参数

characters 需要包含在字体纹理中的字符。
size 请求字符的大小(默认值为零将使用字体的默认大小)。
style 请求字符的样式。

描述

请求将字符添加到字体纹理(仅限动态字体)。

注意:您只需要在想要实现自己的文本渲染时使用此功能。调用此函数以请求 Unity 确保字符串 characters 中的所有字符都存在于字体的字体纹理(及其 characterInfo 属性)中。这在您想要实现自己的代码来渲染动态字体时很有用。您可以为字符提供自定义字体大小和样式。如果 size 为零(默认值),它将使用该字体的默认大小。

如果字体纹理没有足够的空间来添加所有请求的字符,则 RequestCharactersInTexture 可能会导致字体纹理重新生成。如果字体纹理重新生成,它将只包含使用 Font.RequestCharactersInTexture 或在上一帧使用 Unity 的文本渲染功能使用的字符。因此,建议您始终为希望使用自定义字体渲染函数渲染屏幕上的任何文本调用 RequestCharactersInTexture,即使字符当前存在于纹理中,以确保它们不会在纹理重建期间被清除。

其他资源:textureRebuiltGetCharacterInfo

using UnityEngine;
using System.Collections;

public class CustomFontMeshGenerator : MonoBehaviour { Font font; string str = "Hello World"; Mesh mesh;

void OnFontTextureRebuilt(Font changedFont) { if (changedFont != font) return;

RebuildMesh(); }

void RebuildMesh() { // Generate a mesh for the characters we want to print. var vertices = new Vector3[str.Length * 4]; var triangles = new int[str.Length * 6]; var uv = new Vector2[str.Length * 4]; Vector3 pos = Vector3.zero; for (int i = 0; i < str.Length; i++) { // Get character rendering information from the font CharacterInfo ch; font.GetCharacterInfo(str[i], out ch);

vertices[4 * i + 0] = pos + new Vector3(ch.minX, ch.maxY, 0); vertices[4 * i + 1] = pos + new Vector3(ch.maxX, ch.maxY, 0); vertices[4 * i + 2] = pos + new Vector3(ch.maxX, ch.minY, 0); vertices[4 * i + 3] = pos + new Vector3(ch.minX, ch.minY, 0);

uv[4 * i + 0] = ch.uvTopLeft; uv[4 * i + 1] = ch.uvTopRight; uv[4 * i + 2] = ch.uvBottomRight; uv[4 * i + 3] = ch.uvBottomLeft;

triangles[6 * i + 0] = 4 * i + 0; triangles[6 * i + 1] = 4 * i + 1; triangles[6 * i + 2] = 4 * i + 2;

triangles[6 * i + 3] = 4 * i + 0; triangles[6 * i + 4] = 4 * i + 2; triangles[6 * i + 5] = 4 * i + 3;

// Advance character position pos += new Vector3(ch.advance, 0, 0); } mesh.vertices = vertices; mesh.triangles = triangles; mesh.uv = uv; }

void Start() { font = Font.CreateDynamicFontFromOSFont("Helvetica", 16); // Set the rebuild callback so that the mesh is regenerated on font changes. Font.textureRebuilt += OnFontTextureRebuilt;

// Request characters. font.RequestCharactersInTexture(str);

// Set up mesh. mesh = new Mesh(); GetComponent<MeshFilter>().mesh = mesh; GetComponent<MeshRenderer>().material = font.material;

// Generate font mesh. RebuildMesh(); }

void Update() { // Keep requesting our characters each frame, so Unity will make sure that they stay in the font when regenerating the font texture. font.RequestCharactersInTexture(str); }

void OnDestroy() { Font.textureRebuilt -= OnFontTextureRebuilt; } }