UE4 見たら消えるオブジェクトを作ってみる
タイトル通りのものを作っていきます。
プレイヤーからLine Traceを飛ばし、
その衝突時に特定のオブジェクトが衝突していれば、
オブジェクトを削除するというものです。
ミニゲームくらいなら作れそうですね。
準備
今回はUE4 4.15.0を使用します。
First Personテンプレートでプロジェクトを作成してください。
Line Traceを出せるようにしてみる
まずはプレイヤーの処理から書いていきましょう。
First Person BP / Blueprintsから
First Person Characterのブループリントを開いてください。
移動処理や、弾を発射する処理など書かれていますが、
それとは別に、このような処理を書いてください。
Event TickからLine Trace By Channelへ繋いでいます。
LineTraceの開始座標はFirst Person Cameraのワールド座標。
終了座標はFirst Person CameraのGet Forward Vectorに
Line Traceの長さを乗算したものとFirst Person Cameraの
ワールド座標を加算した値です。
このLine Traceはプレイヤーの視線を判定するものです。
Line Trace By Channelを使用していますが、
Sphere Traceでも可能ですので好きな方を使ってください。
ここまで処理を書いたら実行して確認してみましょう。
このようにカメラからLine Traceが出ていると思います。
もし出ていない場合はLine Trace By Channelの
Draw Debug TypeをFor Durationに変え忘れていないかなどを
確認してみてください。
発見用のオブジェクトを作成する
次に発見用のオブジェクトを作成します。
コンテンツブラウザから右クリック
Blueprint Classを選択してください。
親クラスはActorで作成します。
作成できたらファイル名をBP_Targetとしましょう。
BP_Targetを開いてください。
左上のAdd Componentから
Box Collisionを追加します。
同じようにAdd ComponentからCubeを追加します。
Cubeでなくても構いません。
Static MeshやSkeletal Meshでも大丈夫です。
今回は見た目を気にせず分かりやすさ重視でCubeを選択しました。
Cube以外を使う場合にはBox CollisionもMeshの形に合わせて変更してください。
Cubeの大きさに合わせてBox Collisionの大きさを変更します。
Collision Typeの変更をします。
CubeをNo Collisionにしてください。
Box Collisionは下記の画像のようにしてください。
Line Traceの判定をとるためにVisiblityが
Blockであれば他は自由に変更して大丈夫です。
Material Functionを作成する
消滅時に発生するエフェクトをマテリアルで表現しましょう。
細かい処理などは過去記事を見てください。
コンテンツブラウザから右クリック
Material Functionを選択してください。
ファイル名をMFunc_Dissolveとします。
過去記事にも同じものを挙げていますが、
解像度が低くて見づらいという声が多かったため、
解像度の高いものを用意しました。
Appear Timerの値に合わせてNoiseの形に透過していく処理です。
全体図の方
全体図じゃない方
Noiseのパラメータはこのようになっています。
マテリアルに処理を書く
Cube MeshにはBasic Shape Materialという
マテリアルがDefaultで適応されています。
先ほど作成したMFunc_Dissolveを
このBasic Shape Materialに適応しましょう。
Engine Contents / Basic Shapeから
Basic Shape Materialを開いてください。
最終結果のパラメータのBlend Modeを
Maskedに変更します。
Material Function CallでMFunc_Dissolveを呼び出し、
Emissive ColorとOpacity Maskを最終結果に繋ぎます。
Material Instanceを作成する
コンテンツブラウザに戻り、
Basic Shape Materiaを右クリックし、
Create Material Instanceをクリックしてください。
Material Instanceを作成しました。
(色が違うのはスクショを撮り忘れて後で撮ったからです)
作成したMaterial Instanceを開いてください。
パラメータを画像のように変更します。
BP_TargetのCube Meshのマテリアルを作成した
Material Instanceに変更しましょう。
発見用オブジェクトの処理を書く
BP_Targetの編集を行っていきます。
BP_Targetを開いてください。
Construction Scriptにこのような処理を書きます。
CubeコンポーネントのマテリアルをDynamic Material Instanceとして
作成し、DMIという変数に格納しています。
イベントグラフの処理です。
Custom Eventを作成し、Meltという名前を付けます。
作成したCustom EventからTime Lineへ繋ぎ、
DMIのパラメータを変更する処理を書きます。
Time Lineが終了したらDestroy Actorに繋ぎ、
BP_Targetを削除します。
Time Lineの中身です。
0秒時に値を1
2秒時に値を0
とする直線のTime Lineです。
これでBP_Targetの処理はすべて書き終わりました。
Clear Widgetを作成する
なくても困らないですが、
動画で出していたクリア時のWidgetを作成します。
コンテンツブラウザから右クリック
User Interface / Widget Blueprintを選択してください。
名前をWidget_GameClearとします。
Widget_GameClearを開いてください。
Textを一つ配置し、適当な文字とサイズにします。
これだけ
プレイヤーの処理を追加する
最後の工程です。
プレイヤーに処理を書きます。
First Person Characterを開いてください。
Line Traceの処理を書いた箇所に
下記の画像のように処理を追加してください。
Line TraceのDuration TypeをNoneに戻すのも忘れずに。
レベル上にBP_Targetが残っているかの判定を行い、
残っていればLine Traceを飛ばし、Line Traceの衝突した
ActorがBP_TargetであればBP_TargetのMelt関数を呼び出します。
BP_Targetがレベル上に残っていなければ、
Widget_Clearを描画します。
これで処理はすべて書きました。
実行して確認してみてください。
ページ上部の動画のようになります。