妹でもわかるUnrealEngine4

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

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

リファレンス渡しに設定した時の動作(マクロ・イベント・関数の場合)

imoue.hatenablog.com

「昨日の実験について、マクロの場合はリファレンス渡しに設定しなくても動くんじゃないか? という情報が寄せられた。実際試してみたら、設定しなくても普通に動いた。そこでそれぞれのケースについてリファレンス渡しの設定をしたりしなかったりするとどうなるのか? 少し実験をしてみた」

忙しい人用のまとめ

UE4.18.3 で動作確認

マクロ

 設定してもしなくても基本的には同じ
 マクロにつないだピンが変数じゃない場合はエラーがでる

イベント

 設定しない場合=エラーは出ないけど、参照してる変数に変化がない
 設定した場合=エラーが出てコンパイルできない
 リファレンス渡し自体が不可能?

関数

 設定しない場合=エラーは出ないけど、参照してる変数に変化がない
 設定した場合=正常に動作する
 設定しないとダメ

マクロの場合

f:id:una_unagi:20180313001340p:plain
リファレンス渡しのチェックボックスをオフにしてても、正常に動作するマクロになる

f:id:una_unagi:20180313001358p:plain
もリファレンス渡しが必要なことには違いないので、変数のピンじゃなく値を設定するとエラーになる
※見てもすぐにはわかりにくいエラーになる

f:id:una_unagi:20180313001404p:plain
じゃあリファレンス渡しにした場合のエラーはどうなるのか?
と思ったけど一緒
ただ値の設定欄は出ないし、変数の接続が必要だということはわかりやすい

「マクロの場合は原理的にそのままピンをつなぐのと一緒なんじゃないかという意見を聞いたけど、たしかにそんな感じの動作をしてるように見える。マクロ単体では何も言われないけど、実際に変数じゃないものをつないだ時点でエラーがでる」

イベントの場合

f:id:una_unagi:20180313002408p:plain
リファレンス渡しがそもそも設定できない
設定しない場合エラーはでないけど、数字も0のまま増えなかった

「イベントの場合はなんというか、リファレンス渡しの仕組み自体が作れないような気がする。設定項目としてはあるけど、それにチェックいれるとエラーになっちゃうし。何か別のとこに問題があるのかもしれないけど」

関数の場合

リファレンス渡しに設定してない場合の動作はイベントの場合と同じ。
ただリファレンス渡しに設定することはできる。
設定した場合、関数ノードに変数をつながないと、わかりやすいエラーが出る。

f:id:una_unagi:20180313002613p:plain

「これは一番しっくりくる動作だった。リファレンス渡しに設定すればちゃんと動作するし、エラーメッセージもわかりやすい」

値渡しと参照渡しは、兄にもよくわかっていない

妹「ちょっと前にボクセル作ってた時に、値渡しと参照渡しみたいな……って書いてあったけど、それなんだっけ? 聞いたことがあるかもしれないけどよくわからん」

「それなら丁度いい記事があったよ。リファレンス渡しというのが参照渡しの事。単に言葉の訳し方の問題で同じ意味」

UE4 引数として関数へ渡した変数の中身を書き換える(リファレンス渡し)(Set By-Ref Var) 凛(kagring)のUE4とUnityとQt勉強中ブログ

「要するにパラメータとして数字や文字じゃなく、パラメータが入ってる変数自体を受け取るというのが違い。そうすることで関数やイベントの側から、パラメータの中身を書きかえることが出来る」

imoue.hatenablog.com

「これは前に作った、変数に数字を足すマクロなんだけど、これをリファレンス渡しを使わないとなると、マクロの右側から出てきたピンをSETノードに繋がないといけない。手間だし見た目もごちゃごちゃする。なのでリファレンス渡しを使った」

妹「全部リファレンス渡しにしちゃダメなの?」

「リファレンス渡しになってると、中で勝手に書き換えられる可能性があるわけだから、全部それにするのはちょっと危なっかしい。必要なとこだけにする。あと変数自体をパラメータにしないといけないから、普通のノードみたいにパラメータ欄のとこに直接書き込めなくなる。あれは値ではあるけど、変数ではないから」

妹「やっぱりむずかしい」

「文字列とか数字とか、普通の型に関してはまだ簡単な方。ややこしいのはクラスの場合。リファレンス渡しにしなくても、元々リファレンス渡しっぽい性質をもってる。Hitイベント中でアクターの変数を変えたりできるから。中身を書き換えてる」

f:id:una_unagi:20180311230449p:plain

「あとこの4種類選べるやつも、普通は上の2つしか使ってないけど、でも4つある」

妹「ソフトってことは、やわらかいの?」

「たぶん弱い参照って訳されるやつかなと思うんだけど。どの変数にも保存されてないクラスは要らなそうなので消去する、というガベージコレクトという処理があって、その時にソフトなやつは保存されてないカウントになるんだと思う。Aの変数にBを記録してて、Bの変数にAを記録してるみたいなケースで、一見するとどっちも必要としてるけど、実はどっちも要らないみたいなのが残っちゃうことがある。それを防ぐ機能」

妹「ぜんぜんわからん」

「アクターの場合は内部的に記録してる変数があるから、Destroyするまで絶対ゴミにならないんで、アクターだけ使ってる分にはあまり意識しなくてもいい部分かもしれない。あんまり解説も見あたらない」

UE4.18への移行記録

f:id:una_unagi:20180309232630p:plain

妹「なんかメニューがおかしい気がする。アセットを右クリックしても出ないし。プロジェクトを開き直そうとしてもファイルってボタン自体が反応しないし。プロジェクト開いてすぐの時は大丈夫なんだけど……あ、大丈夫じゃないかも」

「なんでだろ」

妹「なんか前に……メニューは出てるけど裏側に隠れてるから見えないし押せないとか、そんな話してなかったっけ?」

「あー、Windows10にするとバグるやつか。でもあれは最近のバージョンでは発生しないはず」

妹「バージョンは4.13です」

「それはあまり最近のではないね……」

unrealengine.hatenablog.com

「どうも4.14からは直ってるみたい」

妹「やっぱりバージョン上げないとダメかあ。プラグインの設定とかめんどくさそうだったから4.13でやってたんだけど。でもどうせ上げるんだったら4.14じゃない方がいいよね」

「安定版だと4.18が最新」

妹「4.18だったらダウンロードしてた気がする。これで使えるようにする」

プラグインを入れ替える方法は昔書いた気がする」

imoue.hatenablog.com

妹「エクスプローラー? でプロジェクトのある場所を開く方法わかんないんだけど」

「初期設定だとたぶんマイドキュメントの中のどこかにあるはずなんだけど」

f:id:una_unagi:20180309233716p:plain

f:id:una_unagi:20180309233730p:plain

「こういう方法でプロジェクトフォルダを探すことが可能。この方法なら、プロジェクトどこ行ったかわからない時でも問題ない」

妹「なんかできてきた気がするけど、被破壊メッシュがどうのこうのってエラーが出るなあ……」

被破壊メッシュを作ることが出来ない - UE4 AnswerHub

f:id:una_unagi:20180309234140p:plain

妹「4.18からプラグインになったらしいという話を聞いたので、これを有効にしたら動くようになった。他にはエラーも出てないみたいだし、これでいいのかな?」

「だいたい大丈夫だと思う。あとは動かしてみて、変なとこが見つかったらなおす感じで」