最近发现中国风游戏中,经常会遇到旁白文字竖着显示的需求。
于是我首先找了找控件蓝图中的text有没有相关类似横竖文本框的选项,然而并无所获。
突然间灵机一动!
竖着显示不就是每个字一换行嘛!
说干就干,于是我在gamemode中添加了个getverticaltext的函数,打算用于全局的字符串横竖转换。
那么问题来了。。ue4的c++中怎么表示FString类的换行符呢?
第一反应当然是"/n",结果就是游戏中真的是显示了/n。。。
查阅了一下unreal社区,普遍都说不知道怎么表示换行符,不过可以在蓝图中shift+enter编辑
我便退而求其次,又在gamemode中添加了个changelinesymbol的FString类变量,作为换行符的全局变量,在蓝图的beginplay中把它的值设置成了换行符:
虽然有点绕,但的确管用啊。
(不过后来我又在群里问了下一位热心小哥告诉了我真相——"\r\n"就行了……)
接下来的横竖转换就比较简单了:
FString AsanshaoyeswordGameMode::getverticaltext(FString x) { if (x == "") return ""; FString ans = ""; ; i < x.Len()-; i++) { ans.AppendChar(x[i]); ans.Append(changelinesymbol); } ans.AppendChar( x[x.Len()-]); return ans; }
然而又有新的问题来了,这样弄的竖文本并不能竖直居中啊。。。
我只好通过计算控件应该在的位置,来设置使其居中了。
所幸貌似相同字体和字号的文本高度是一样的高的,为了简便起见我们先假定相同字体高度和字号成正比。
于是我就在控件蓝图定义了一个叫singleword_height_persize的float,基于我们的假设,singleword_height_persize*fontsize==一个字的高度
我的旁白文本(textblock_pangbai)锚点位于屏幕左上角,所以要得到正确位置需要从y坐标为0开始先向下平移半个screenheight,然后向上平移半个所有文本占的高度
screenheight我通过getviewportsize的y表示,所有文本的高度自然就是pangbai_vertical.Len()*singleword_height_persize*fontsize了
具体蓝图如下:
singleword_height_persize经过尝试,方正舒体1太小,1.233差不多刚好
要注意控件位置要以独立窗口运行为准,直接在视口运行比较邪门的
效果如下