読者です 読者をやめる 読者になる 読者になる

妹でもわかるUnrealEngine4

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

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

Enum型からName型への変換

ブループリント ノード解説

9/5 説明内容が間違いがあったので修正

妹「マップ上の地点にEnum型でステージ名を設定してて、それで移動先のレベルを決めてるんだけど、なんか変換が上手く行ってない気がする」

f:id:una_unagi:20150904175120p:plain

妹「Enum型のステージ名から、OpenLevelのName型入力につなぐと、自動で変換用のノードが1個挟まるんだけど、これだとなんかエラー出て上手くいかないんだよ。でもなぜかString型を経由して2回変換すると思ったとおりに動く」

「ステージ名はどんな感じになってるの?」

妹「どんな感じと言われても、こんな感じなんだけど」

f:id:una_unagi:20150904175615p:plain

Enumで、名前のとこをマップ名にしてあるのか。この方法だと2回変換しないだめだね」

妹「なんで?」

「直接Name型に変換したものを、PrintStringで表示するとこうなる」

f:id:una_unagi:20150905141612p:plain

妹「あ、それはやってみた。NewEnumerator2って意味のわからない文字が出たなあと」

「"ステージ名"という名前のEnum型に、2番目の追加された項目という意味。Enumに追加した時に最初から付いてる名前でもある。だからまあ、これはこれで受け取ったパラメータのNameを正確に表示してるんだよ」

妹「でもステージ名のとこは"はらっぱ"とか名前を変えてるわけだから、"ステージ名::はらっぱ"ってなるんじゃないの?」

「そうやってもいいとは思うけど、そういう仕組みにはなってない。名前を変えても、順番を変えても、名前は変わらない。理由はわからないけどセーブデータをロードとかした時に困るからかも。」

妹「じゃあそれが何でStringにすると動くの?」

「変換ノードにマウスカーソルあてると、Nameに変換する方は"エニュメレーター名を返す"で、Stringに変換する方は"ユーザーフレンドリーなエニュメレーター名を返す"とある。Stringの方は正式名じゃなくて人間が理解しやすい方の名前を出してる」

妹「フレンドリー! それいつもフレンドリーでいいんじゃないの? NewEnumeratorとか出して欲しい人なんて居ないと思うんだけど」

「そうかもしれないけど、正式名を調べる方法もないと色々困るわけで」

妹「だとしてもフレンドリーな方が標準でいいでしょ。普通使う時はこういう使い方するだろうし」

「OpenLevelで使うと考えたらそうだろうけど、ノードをつなぐ時に考えてるのは、つなぐ先がName型だってとこまでだから。EnumをName型につないで使いたいケースって考えると難しいし、使うノードが少ない方が出てくるのも自然だと思う」

妹「そこはもっと深く考えて!」

「それが出来たら人間がデバッグしなくて済むこと増えるんだろうけどね。でも今回の場合でいうと、EnumじゃなくてString型でステージ名設定すればいいんじゃないの?」

妹「そうするとエディタで設定する欄が記入式になるでしょ? 書き間違えとかしそうで嫌じゃん。他のレベルに移動出来るように切り替える時も簡単だし」

Enumで付けた名前が実際のレベル名と連動してないのが気になるんだけどね。出来ればConstruction Scriptで、同じ名前のレベルがあるかどうかをチェックしたいところだけど、それが出来る関数がC++にしかないみたい」

妹「だめじゃん」

「他にもデータベースを使った方法とかあるけど、とりあえずはString型を経由して2回変換するしかないかなあ。何度も使うならそういう感じの関数を作って、変換は2回でもノードは1つで済ませられるよ」

妹「ところでEnumってなんて読むの?」

「Enumeratorの略だけど、Enumeratorのカタカナ訳が決まってないから、イーナムとかエニュムとか、各自で適当に呼んでる。UE4の場合はエニュメレーターが公式の訳みたいだからエニュムかなあ。でも他の言語使ってる人には通じないかもしれないし、言葉に出す必要がある時は列挙型って言う」

妹「コンピューター用語って人前で言えない言葉多いね……」