前回 

の補足の続きです。

勉強会ではたぶん(記憶が曖昧) Destroy Componentで説明されていたと思うんですが、
Destroy Actorの方がいいようです。
※前回のブログでは本文はDestroy Actorで説明しつつ、SSには勉強会時のDestroy Componentが混ざるgdgd振りですが
Destroy Component はコンポーネントの削除で、
Destroy Actor はアクターの削除の筈です(まんまやがな)
(「□文脈依存 」のチェックを外さないとノード候補に出てこない可能性あり)

Unity3Dで言えば
Destroy(this);//スクリプト(コンポーネント)自身を破棄
Destroy(gameObject);//スクリプトがついているオブジェクト(UEのActor)自身を破棄
の違いに近いでしょうか


では実際に違いを試してみましょう!
 
■Destroy Component の場合
comp_or_actor
これで実行…

2015-02-01 23_06_09-FPS_Sonomama - アンリアル・エディタ
 普通に問題なく破壊されるので、一見問題ないように見えますが…

bp_remains
 エディタのシーンアウトライナー上でみると、残ったままです

「いいじゃん別に! 見た目上消えているなら一緒でしょ?」
っと思うかもしれませんが、残ったまま無尽蔵に増やしたら重くなるかもしれません

また復数コンポーネントで構成している場合、問題が顕在化します。
実際にやってみましょう。 

■複数コンポーネントを作る

edit_comp
「デフォルト>コンポーネント>グラフ」からコンポーネントの編集画面を選びます

add_comp0
「コンポーネントを追加」を選んでもいいのですが、直接ドロップしてもいいようです
試してみましょう

add_comp
ブループリントを別ウィンドウでフロートさせて、適当なスタティックメッシュをドロップ

add_comp2
もしくは、素直に「コンポーネントを追加」→Static Mesh でもいいです

add_comp3
その場合、「Static Mesh」の欄で好きなメッシュを選びます
名前を入力すれば、候補を絞れます

added_comp
Static Meshが追加されました
どっちの方法でも同じ結果になる筈です

added_comp2
中にすっぽり収まっていてみえないので、位置をズラします

BP_destroies
すべてのインスタンに形状の変更が反映されている筈です
(このブループリントのインスタンなら)

BP_remain
実際に撃って破壊してみましょう
空中にツノだけ残った筈です
シーンアウトライナー上でも勿論ブループリントのインスタンは消えていません

■やっぱりDestroy Actorにしましょう
bp_destroyactor
 変更しました

BP_destroyed
 今度は無事、丸ごと破壊できました
シーンアウトライナー上でも破壊したインスタンスが消えています

■Destroy Actor 後の注意すべき挙動
ちょっと興味深い実験です

destroy_after

Destroy Actorの後にこんなブループリント書いてみましょう
「壊れたー!」とプリントし、爆発音を任意の場所(取り敢えずHit Loacationを挿しました)で再生

Unity3Dだとこれは、典型的なミスです。 
Unity3DでDestroy(gameObject);でオブジェクトを削除したら、AudioSourceも削除されちゃって効果音が鳴らない…みたいな 

UE4のDestroy Actorだと、なんとこれが動いてくれます!

destroy_after2
 左上に「壊れたー!」ってちゃんと表示されました
効果音もなりました

destroy_after3
ではDelayノードで3秒後に「破壊から3秒後」と表示するようにしてみましょう

…これは表示されませんでした(DelayのDurationを0に設定しても同様)
おそらく、Destroyを実行したそのフレームだけは、その後に繋がるノードを実行してくれるようです

どっちの仕様が良いのかは、ひとに依るかもしれませんが、個人的に便利です。 

■追加 おまけ 火を噴いて3秒後にひでぶする箱

explosion_3second_left
左側:ここは元のままです

explosion_3second
右側:n発食らったら3秒後に死ぬようにしてみました
「Static Mesh1」の青いノードは、メンバ変数の取得or設定ノードのときと同じように
ドラッグ・アンド・ドロップで直接持って来て作ってください
爆発や効果音の場所はHitノードの場所ではなく、Get Actor Locationで自分自身の場所にしました
(その方がたぶん自然)

fire_box
ツノから燃え出した…

fire_box2
 お前はもう死んでいる…


fire_box3

ひでぶー