UGUI实现字符串竖行显示
请大家关注我的微博:@NormanLin_BadPixel坏像素
最近程序小伙伴问我Unity有没有可以竖行显示文本的组件,类似古书上从右到左显示的那种。
我找了半天没找到啊。(大家如果找到的话可以留言分享一下)
我说这个你自己写一下很快吧。
比如你想显示
休放星星星星星
息假期期期期期
五四三二一
那你就在Text里面填成这个样子就好了啊!
程序小伙伴:“你滚。”
看来他是想填成
星期一
星期二
星期三
星期四
星期五
放假
休息
然后显示成上面哪个样子。
我:好说啊,你按照规律把后面的字符串转换成前面的字符串就好了啊。
小伙伴: 你这个想法反人类,我们就不能从底层修改它的显示方法吗?
我:。。。
这里分享一下我写的方法。。。很短,大家看看就好
代码分享
首先,创建一个ColumnText组件
using UnityEngine;
public class ColumnText : MonoBehaviour {
public string Text = "";
public bool Left = false;
}
然后,创建Editor文件夹,并且创建ColumnEditor脚本。
这里我用到了其他人写的一个类,方便使用的。
InspectorBase
using UnityEditor;
public class InspectorBase<T> : Editor where T : UnityEngine.Object {
protected T Target { get { return (T)target; } }
}
这个类可以比较方便的获取到当前编辑的组件,而不用每次自己获取。
ColumnEditor
using System;
using System.Text;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;
[CustomEditor(typeof(ColumnText))]
public class ColumnEditor : InspectorBase<ColumnText> {
char[] _k;
//注意这里的" "是通过输入法输入v1选择第一个空白出现的符号
string _s = " ";
Text _text;
private void Awake() {
_k = Environment.NewLine.ToCharArray();
}
private void OnEnable() {
_text = Target.GetComponent<Text>();
}
public override void OnInspectorGUI() {
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("AlignLeft");
Target.Left = EditorGUILayout.Toggle(Target.Left);
EditorGUILayout.EndHorizontal();
EditorGUILayout.LabelField("Text");
Target.Text = EditorGUILayout.TextArea(Target.Text);
string[] _temps = Target.Text.Split(_k);
if (!Target.Left) {
Array.Reverse(_temps);
}
int max = 0;
for (int i = 0; i < _temps.Length; i++) {
if(max < _temps[i].Length) {
max = _temps[i].Length;
}
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < max; i++) {
for(int j = 0; j < _temps.Length; j++) {
if(_temps[j].Length > i) {
sb.Append(_temps[j][i]);
} else {
sb.Append(_s);
}
}
sb.Append(_k);
}
_text.text = sb.ToString();
EditorUtility.SetDirty(_text);
}
}
然后把ColumnText组件拖到Text的UI上面,在ColumnText里面填写想要显示的文字,Text会自动转换。
虽然这个方法很简单,但是效果不错啊。而且是编辑器功能,又没有性能消耗。
最后附上效果图。
结束语
不管黑猫白猫,能抓老鼠的都是好猫。(现在宠物猫都怕老鼠了。)