ForEachLoopによるコピーと参照の問題
つまり配列をForloopで渡したとき、Array Elementソケットから引っ張り出したやつは配列の中身のコピーになるっぽいのか。内部の値を編集するにはIndexだけ取り出して元の配列変数から参照Getする必要があると #UE4 pic.twitter.com/qzPGSr6Or9
— 大福 (@dfk_ohnuma) May 23, 2018
「先日ツイッターで見かけた問題なんだけど、ForEachLoopで色々やろうとする時、配列の中身が構造体だと、配列の中身に直接アクセスするんじゃなく、コピーされた物を操作することになる。まだUE4でこうなったことはないけど、他のプログラミング言語で同じようなことがあった」
妹「それの何が問題なの?」
「ForEachLoopで、中身を書き換えたいという時にちょっと困る。コピーされた物を変更しても、配列の中身には反映されない。勝手に書き換えないから安全という言い方もできるんだけど」
妹「でもアクターとかでそういうことやったことあるかも」
「アクターはActorクラスだから。別の変数にSETした場合の動作が、構造とか数字とかとちょっと違う。だから普通に使ってる分にはコピーされた物だと意識しなくてもいい。数字の時もたぶんそんなに気にならない。でも構造体は見た目クラスに似てるから、なんか出来そうで出来ないっていう、もどかしい感じになる」
Can foreach be pass-by-reference? - UE4 AnswerHub
「で、調べてたら英語の方でもこの問題について質問してる人がいた。この人はコピーされた物を編集した後で、Set Array Elmで配列に上書きしてて、これで動くけど、なんかもっといい方法ないの?っていう」
妹「あるの?」
「ForEachLoopはマクロだから、配列から普通にGETするんじゃなく、参照をGETするようなマクロを作ればいいんじゃないかと」
妹「参照……聞いたことがあるような」
imoue.hatenablog.com
imoue.hatenablog.com
「いちおう前にもやったんだけどね。ちゃんと説明しようと思うとむずかしいから、だいたいみんな勘で使ってるんだけど。要するにコピーじゃなくて、そこにあるデータそのものを(別のとこから)変更したい時に使う。何度も使うようならマクロを作る価値はありそう」
※追記
UnrealEngine4 Project "YoRoZu" 第十九回 YoRoZu_Flow "ForEachLoop (Ref)"の実装
このサイトに参照版のForEachLoopの実装例があります。
制作過程も載っていてわかりやすいです。