【Unity3d开发】Unity3d文字对象的开发

时间:2020-12-22 01:22:33

1、简介

2、开发

2.1 添加预制体

从Assets窗口中拖拽Ocean插件的FpsCounter预制体到层级窗口中,预览如下: 【Unity3d开发】Unity3d文字对象的开发 这里我们进入FpsCounter对象节点里面。 【Unity3d开发】Unity3d文字对象的开发 看看它绑定的脚本组件是怎么写的。 【Unity3d开发】Unity3d文字对象的开发 它的脚本主要由两部分内容组成:计算帧率,和修改文字内容。 这里我们简单修改一下它的文字样式等,如下:

using System;
using UnityEngine;
using UnityEngine.UI;

namespace UnityStandardAssets.Utility
{
    [RequireComponent(typeof (Text))]
    public class FPSCounter : MonoBehaviour
    {
        const float fpsMeasurePeriod = 0.5f;
        private int m_FpsAccumulator = 0;
        private float m_FpsNextPeriod = 0;
        private int m_CurrentFps;
        const string display = "<color='#FF00FF'><size=30>小沐:</size></color>{0} FPS";
        private Text m_Text;


        private void Start()
        {
            m_FpsNextPeriod = Time.realtimeSinceStartup + fpsMeasurePeriod;
            m_Text = GetComponent<Text>();
            m_Text.transform.position = new Vector3(Screen.width/2, Screen.height/2, 0);
        }


        private void Update()
        {
            // measure average frames per second
            m_FpsAccumulator++;
            if (Time.realtimeSinceStartup > m_FpsNextPeriod)
            {
                m_CurrentFps = (int) (m_FpsAccumulator/fpsMeasurePeriod);
                m_FpsAccumulator = 0;
                m_FpsNextPeriod += fpsMeasurePeriod;
                m_Text.text = string.Format(display, m_CurrentFps);
               
			   //m_Text.text = (Screen.width.ToString() +" x "+Screen.height.ToString()+" : "+m_CurrentFps);
            }
        }
    }
}

同时,再添加一个文字对象Text (Legacy),绑定脚本组件如下: 【Unity3d开发】Unity3d文字对象的开发

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class TextScript : MonoBehaviour
{
    private Text m_Text;

    // Start is called before the first frame update
    void Start()
    {
        m_Text = GetComponent<Text>();
        m_Text.text = "海上生明月,天涯共此时。";

        //m_Text.color = Color.blue;
        //m_Text.color = new Color(129 / 255f, 69 / 255f, 69 / 255f, 255 / 255f);
        m_Text.text = "<color=#0000ff>海上生明月,天涯共此时。</color>";
        ColorUtility.TryParseHtmlString("#00FF00", out Color nowColor);
        m_Text.color = nowColor;
    }

    // Update is called once per frame
    void Update()
    {
    }
}

【Unity3d开发】Unity3d文字对象的开发

TextMeshPro(TMP)可以作为Unity中已有的文本组件(例如TextMesh和UI Text)的替代方案。TMP使用Signed Distance Field(有向距离场,SDF)作为其首选文本渲染管线,使其可以在任意尺寸和分辨率下清晰的渲染文本。

接着,再添加一个文字对象Text (TMP),如下: 【Unity3d开发】Unity3d文字对象的开发 绑定脚本组件如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;

public class TextTMP : MonoBehaviour
{
    private TMP_Text m_Text;

    // Start is called before the first frame update
    void Start()
    {
        m_Text = GetComponent<TMP_Text>();
        m_Text.text = "曾经沧海难为水,除却巫山不是云。";
        m_Text.color = Color.blue;
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

TextMeshPro插件导入Unity后,其自带的默认字体只支持西文字符和一些标点符号,是不支持中文显示的。 【Unity3d开发】Unity3d文字对象的开发 为了支持中文的显示通常有两种方案。

2.2 静态字体方案

Window->TextMeshPro->Font Asset Creator,打开如下界面:

【Unity3d开发】Unity3d文字对象的开发 弹出窗口如下: 【Unity3d开发】Unity3d文字对象的开发 Source Font File选中一个中文字库。 Character Set选项设置:

  • Character Set选项选择Charactors from File。这样就可以通过配置一个中文文档来生成中文字库。这种对于只有某些中文字符的项目是可行的。
  • 为了减小文件大小,你也可以下拉选择Custom Characters,填入你项目中需要用到的所有字体。

在Unity中Assets新建一个文件夹,用来存储字体,并把你想要转换的中文字体ttf文件放进去。比如思源宋体等。 https://github.com/adobe-fonts/source-han-serif/tree/release#downloading-source-han-serif 【Unity3d开发】Unity3d文字对象的开发 将下载的中文字体ttf文件(SourceHanSerifCN-VF.ttf)拖拽到Assets文件夹里,如下: 【Unity3d开发】Unity3d文字对象的开发 在Font Asset Creator窗口中的Source Font File选中刚才我们下载的中文字体ttf文件。 【Unity3d开发】Unity3d文字对象的开发 Character Set选项设置为Custom Characters,然后在Custom Character List中输入项目中用到的中文字符,如果我们用到的中文比较多,则需要采用导入文件的方式(Charactors from File)。 【Unity3d开发】Unity3d文字对象的开发 然后点击按钮Generate Font Atlas,再点击按钮Save或Save as... 【Unity3d开发】Unity3d文字对象的开发 然后在Assets窗口中自动生成一个对应字体的文件:SourceHanSerifCN-VF SDF.asset 【Unity3d开发】Unity3d文字对象的开发【Unity3d开发】Unity3d文字对象的开发 在层次窗口中,鼠标点击文字对象Text (TMP),在右侧的属性窗口中,设置“Font Asset”,选中刚才我们生成的字体asset文件。 【Unity3d开发】Unity3d文字对象的开发 点击系统的播放按钮,预览如下: 【Unity3d开发】Unity3d文字对象的开发 中文能正常显示了。

2.3 动态字体方案

找一个带中文字符的ttf字库,导入到Unity后,右键该字体:Create->TextMeshPro->Font Asset,即可创建该字体的.asset文件,这样在TextMeshPro-Text(UI)组件中,把Font Asset替换为上面生成的.asset文件即可。 【Unity3d开发】Unity3d文字对象的开发 在Assets窗口中自动生成了一个字体的asset文件。使用方法和上面的(1)类似。 【Unity3d开发】Unity3d文字对象的开发

结语

如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭ 如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O??? 如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡) 感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!