妹でもわかるUnrealEngine4

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

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

ForEachLoopによるコピーと参照の問題

「先日ツイッターで見かけた問題なんだけど、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の実装例があります。
制作過程も載っていてわかりやすいです。