UE4 配列に入っているすべてのアクター(Actor)を破棄して配列の要素も削除する
配列に入っているすべてのアクター(Actor)を破棄する方法のメモです。
これについてはアクターだけでなく、配列のコンポーネントなどを破棄する場合にも使えるのかなと思います。
一度軽くはまったので備忘録として。
例としてアクターを持つ6個の要素を持つ配列を用意しました。
まずは配列に入っているすべてのアクターを破棄しつつ、配列の要素からも削除していきます。
普通にBPを書くとこんな感じになると思います。

するとこんな感じの結果になりました。

6個要素があるのに3回しか実行されません。
これは配列の「Remove」を行うことで配列の要素数が減ってしまい、
結果3回しかループが実行されないというのが原因になります。
ここらへんC++とかでのイテレーター周りの間隔に似てる感じですかね。
ANSWERHUB にも同じような質問があるようです。
・オーバーラップしたアクターをDestroy Actorで破壊しようとするとエラーが出ます。
これを解決する方法を調べてみるとこんな感じの物がありました。
・How can I properly destroy actors from an array inside a loop
これを解決する方法として配列の要素数はその場では減らさず、
ループが終わったときに配列の要素をクリアしよう。
というものみたいですね。
BPはこんな感じに。

要素数は減らさないが、配列の中身は無効にしておく。といったものみたいですね。
結果はこんな感じに。

無事6回実行されているようです。
上記の他に解決する方法として、
「ReverseForEachLoop」を使うというのができそうです。
こんな感じですね。

配列の逆から回せば要素数減っても問題ないよね。というものです。
一応「Remove」は「Index」を使って削除してます。
実行するとこんな感じに。

こちらも無事6回実行されているようですね。
みなさんわかってるかもしれませんが、うちはつまずいたのでメモということで…。
これについてはアクターだけでなく、配列のコンポーネントなどを破棄する場合にも使えるのかなと思います。
一度軽くはまったので備忘録として。
例としてアクターを持つ6個の要素を持つ配列を用意しました。
まずは配列に入っているすべてのアクターを破棄しつつ、配列の要素からも削除していきます。
普通にBPを書くとこんな感じになると思います。

するとこんな感じの結果になりました。

6個要素があるのに3回しか実行されません。
これは配列の「Remove」を行うことで配列の要素数が減ってしまい、
結果3回しかループが実行されないというのが原因になります。
ここらへんC++とかでのイテレーター周りの間隔に似てる感じですかね。
ANSWERHUB にも同じような質問があるようです。
・オーバーラップしたアクターをDestroy Actorで破壊しようとするとエラーが出ます。
これを解決する方法を調べてみるとこんな感じの物がありました。
・How can I properly destroy actors from an array inside a loop
これを解決する方法として配列の要素数はその場では減らさず、
ループが終わったときに配列の要素をクリアしよう。
というものみたいですね。
BPはこんな感じに。

要素数は減らさないが、配列の中身は無効にしておく。といったものみたいですね。
結果はこんな感じに。

無事6回実行されているようです。
上記の他に解決する方法として、
「ReverseForEachLoop」を使うというのができそうです。
こんな感じですね。

配列の逆から回せば要素数減っても問題ないよね。というものです。
一応「Remove」は「Index」を使って削除してます。
実行するとこんな感じに。

こちらも無事6回実行されているようですね。
みなさんわかってるかもしれませんが、うちはつまずいたのでメモということで…。
| UE4 | 18:42 | comments:0 | trackbacks:0 | TOP↑