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 //开头的居中样式
);
}
}
要更改字幕直接在变量中更改即可。