値渡しと参照渡しは、兄にもよくわかっていない
妹「ちょっと前にボクセル作ってた時に、値渡しと参照渡しみたいな……って書いてあったけど、それなんだっけ? 聞いたことがあるかもしれないけどよくわからん」
「それなら丁度いい記事があったよ。リファレンス渡しというのが参照渡しの事。単に言葉の訳し方の問題で同じ意味」
UE4 引数として関数へ渡した変数の中身を書き換える(リファレンス渡し)(Set By-Ref Var) 凛(kagring)のUE4とUnityとQt勉強中ブログ
「要するにパラメータとして数字や文字じゃなく、パラメータが入ってる変数自体を受け取るというのが違い。そうすることで関数やイベントの側から、パラメータの中身を書きかえることが出来る」
「これは前に作った、変数に数字を足すマクロなんだけど、これをリファレンス渡しを使わないとなると、マクロの右側から出てきたピンをSETノードに繋がないといけない。手間だし見た目もごちゃごちゃする。なのでリファレンス渡しを使った」
妹「全部リファレンス渡しにしちゃダメなの?」
「リファレンス渡しになってると、中で勝手に書き換えられる可能性があるわけだから、全部それにするのはちょっと危なっかしい。必要なとこだけにする。あと変数自体をパラメータにしないといけないから、普通のノードみたいにパラメータ欄のとこに直接書き込めなくなる。あれは値ではあるけど、変数ではないから」
妹「やっぱりむずかしい」
「文字列とか数字とか、普通の型に関してはまだ簡単な方。ややこしいのはクラスの場合。リファレンス渡しにしなくても、元々リファレンス渡しっぽい性質をもってる。Hitイベント中でアクターの変数を変えたりできるから。中身を書き換えてる」
「あとこの4種類選べるやつも、普通は上の2つしか使ってないけど、でも4つある」
妹「ソフトってことは、やわらかいの?」
「たぶん弱い参照って訳されるやつかなと思うんだけど。どの変数にも保存されてないクラスは要らなそうなので消去する、というガベージコレクトという処理があって、その時にソフトなやつは保存されてないカウントになるんだと思う。Aの変数にBを記録してて、Bの変数にAを記録してるみたいなケースで、一見するとどっちも必要としてるけど、実はどっちも要らないみたいなのが残っちゃうことがある。それを防ぐ機能」
妹「ぜんぜんわからん」
「アクターの場合は内部的に記録してる変数があるから、Destroyするまで絶対ゴミにならないんで、アクターだけ使ってる分にはあまり意識しなくてもいい部分かもしれない。あんまり解説も見あたらない」