Unity 控件文字居中与游戏字幕的实现

Unity 提供了GUI控件的实现方式,而网上搜索Unity Label啥文字居中都没有。

效果

Label居中第一种麻烦的方式

最通用的方式,计算好你的Label长宽,然后再用Unity提供的屏幕宽高(Screen.width, Screen.height)精确计算。

最明智的方式

Unity提供了 GUIStyle 控制控件的样式。

private GUIStyle style = new GUIStyle(); //定义控件

void Start(){
    style.fontSize = 24; //字体大小
    style.normal.textColor = Color.white; //字体颜色
    style.alignment = TextAnchor.MiddleCenter; //最重要的,文字居中
}

void OnGUI(){
    GUI.Label(
        new Rect(
            Screen.width/2-50, Screen.height-100, 100, 100
        ), //大体控件位置
        "Hello",
        style  //最重要,控件风格
    );
}Code language: JavaScript (javascript)

将以上脚本代码复制进一个新建的C#文件,然后把他拖到相机上即可。

效果。

游戏字幕实现

有了居中的知识,剩下的应该不难。

首先我们要了解一下延时执行:

Invoke(FunctionName, Duration);

(自身理解)

FunctionName是要延迟几秒后执行的函数名称(字符串),Duration是浮点数,几后执行。

private string[] subtitles = new string[] {
    "Hello!",
    "This is my first game."
};
private int nowRead = 0;
private string nowStr = "";Code language: PHP (php)

在脚本中定义一个字符串数组,用于装字幕。nowRead用于在Invoke中确定当前读到哪儿的字幕。nowStr用于在后面的OnGUI中显示字幕。

void Start(){
    ChangeSubtitle();
}Code language: JavaScript (javascript)

在脚本Start函数中添加这一句,下一步我们会定义该函数。

void ChangeSubtitle(){
    int len = subtitles.Length; //获取字幕数组的元素数量
    if (nowRead == len){ //如果字幕读到尾了就结束
        nowStr = "";
        return;
    }
    nowStr = subtitles[nowRead];  //获取现在要读的字幕
    nowRead++;  //当前读到的字母+1,使其变为下一次读取的字幕
    Invoke("ChangeSubtitle", 4f); //4f是浮点数的意思,即4.0,开始一个延迟执行函数不断循环直到读完字幕
}
void OnGUI(){
    GUI.Label(
        new Rect(
            Screen.width/2-50, Screen.height-100, 100, 100
        ),
        nowStr, //在每一帧中重新获取新的字幕
        style   //开头的居中样式
    );
}Code language: JavaScript (javascript)

完成。

所有代码:

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

public class SubtitleGUI : MonoBehaviour
{

  private string[] subtitles = new string[] {
    "Hello!",
    "This is my first game."
  };
  private int nowRead = 0;
  private string nowStr = "";
  private GUIStyle style = new GUIStyle(); //定义控件

  void Start(){
    style.fontSize = 24; //字体大小
    style.normal.textColor = Color.white; //字体颜色
    style.alignment = TextAnchor.MiddleCenter; //最重要的,文字居中
    ChangeSubtitle();
  }


  void ChangeSubtitle(){
    int len = subtitles.Length; //获取字幕数组的元素数量
    if (nowRead == len){ //如果字幕读到尾了就结束
        nowStr = "";
        return;
    }
    nowStr = subtitles[nowRead];  //获取现在要读的字幕
    nowRead++;  //当前读到的字母+1,使其变为下一次读取的字幕
    Invoke("ChangeSubtitle", 4f); //4f是浮点数的意思,即4.0,开始一个延迟执行函数不断循环直到读完字幕
  }
  void OnGUI(){
    GUI.Label(
        new Rect(
            Screen.width/2-50, Screen.height-100, 100, 100
        ),
        nowStr, //在每一帧中重新获取新的字幕
        style   //开头的居中样式
    );
  }
}

要更改字幕直接在变量中更改即可。

发表回复