妹でもわかるUnrealEngine4

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

TEXT型のCONTAINSの不思議な仕様

配列作成時の無限ループについて - UE4 AnswerHub

「昨日ちょっと体調が悪かったからAnswerHub見てたら、Text型の配列のCONTAINSが上手く動かないという話を見かけて、実際試したら動かなかったのでText型だとまずいってのはわかったんだけど、何か気になるので更に追加で調べてみた」

f:id:una_unagi:20180522225753p:plain
どちらもIntegerからのToText

「これが問題を再現するためのコードなんだけど、明らかに違うTextが生成されてるし、==で比較すればfalseなのに、なぜかCONTAINSで調べるとtrueになる」

妹「CONTAINSってなんだっけ?」

「配列の中にそれがあるかどうか、あればtrueを返すノードなんだけど、無いのにtrueを返してしまう。そして実験するとさらなる問題がわかってきた」

f:id:una_unagi:20180522230211p:plain
どちらもStringからのToText

「StringからToTextしても同じ結果になる。ただし、StringからのToTextと、IntegerからのToTextだったら別と判定するらしく」

f:id:una_unagi:20180523215204p:plain
StringからのToTextと、IntegerからのToTextで比較

「こうすると、同じ文字列なのにCONTAINSの結果はfalseになる。この実験の結果わかることはText型を生成するノードが同じならCONTAINS的に同じと判断されるらしい」

f:id:una_unagi:20180522230929p:plain
MakeLiteralTextで作ったテキストは正常に判断される

api.unrealengine.com

Unreal Engine | FText

「どうしてこういうややこしいことになってるかというのは、たぶんText型の性質の問題なんだろうけど、具体的なところはよくわからない。CONTAINS以外にもそういう変な挙動をする部分があるかも」

妹「バグってことはないの?」

「たぶん違うと思う」

妹「でもそうすると、どう気をつけたらいいのか。ウィジェットとかTextじゃないと駄目なやつ結構あるでしょ?」

文字が同じかどうかということについてText型をあてにしないということかなあ。そういう場合はStringでやる。実際問題としてText型を使うのって翻訳する時に便利だからで、でも翻訳することで違う文字になったり、同じ文字になったりする可能性もある。表示しない部分には翻訳が必要ないからStringでいい」