UE4初心者が頑張ってるブログ

Unreal Engine4を使用した開発メモ、及びそれに関連することについて不定期に書いています。

UE4 死亡時のエフェクトとかを考えてみる

最近、HITというゲームを始めました。

mobile.nexon.co.jp

 

このゲームはUE4製らしいからという理由でインストールしたのですが、

サクサク動くし、グラフィックも綺麗でなかなか楽しんでます。

 

本題

今回は敵が消滅する際のエフェクトを作ります。

Destoy Actorでポンッって消えるのはちょっと寂しいですからね。

 

UE4のバージョンは4.13.2でやります。

 

準備

プロジェクトを作成します。

f:id:MozPaca:20161206120603p:plain

 

プロジェクト名は適当にTPSテンプレートで作成します。

f:id:MozPaca:20161207144714p:plain

 

Material Functionを作成する

今回のエフェクトはマテリアルを使って表現します。

また、様々な種類の敵のマテリアルに適応するため、

メインの処理はMaterial Functionで作成しましょう。

 

コンテンツフォルダ右クリック → Material & Textures → Material Function

f:id:MozPaca:20161212124605p:plain

 

名前はこんな感じにしました。

f:id:MozPaca:20161212125037p:plain

 

こんな感じに組みます。

ここでEmissive ColorとOpacityMaskに

それぞれOutputできるように作成します。

f:id:MozPaca:20161212131819p:plain

必要に応じてパラメータを追加してください。

 

Material Functionを適応させる

作成したMaterialFunctionを使用するマテリアルに適応させます。

今回はグレーマンにエフェクトをかけたいので、

レーマンのマテリアルであるM_UE4Man_Bodyに

Material Functionを追加します。

f:id:MozPaca:20161212132326p:plain

 

レーマンにはもう一つM_UE4Man_ChestLogoという

マテリアルがありますが、これについては後ほど。

f:id:MozPaca:20161212132524p:plain

 

M_UE4Man_Bodyを開いてください。

f:id:MozPaca:20161212132845p:plain

 

右クリックからMaterial Function Callを呼び出します。

このノードはMaterial Functionを呼び出すためのノードです。

f:id:MozPaca:20161212133149p:plain

 

このノードに先ほど作成した、MFunc_Dissolveを入れます。

これでMaterial Functionで出力したEmissive Colorと、

Opacity Maskが使えるようになります。

f:id:MozPaca:20161212133249p:plain

 

M_UE4Man_BodyマテリアルはUse Material Attributesに

チェックが入っているため、やや特殊な形をしていますが

チェックを外してこのようにしましょう。

f:id:MozPaca:20161212133724p:plain

 

これでこのマテリアルはMaterial Functionで作成した

パラメータなどが扱えるようになります。

 

Material Instanceにしておく

今回作成したパラメータなどはMeshのサイズや形に依存してしまうため、

Material Instanceを作成し、あらかじめ調整できるようにしておきましょう。

 

Instanceにしたいマテリアルを右クリック→

Create Material InstanceでMaterial Instanceが作成されます。

f:id:MozPaca:20161212134110p:plain

 

このようになります。

先ほど記述したM_UE4_Man_ChestLogoはすでに

Material Instanceのため、このまま使用します。

f:id:MozPaca:20161212134207p:plain

 

Material Instanceでパラメータの調整をする

作成したMaterial Instanceを開き、

Meshの形状に合うようにパラメータを変更します。

 

今回はこんな感じにしてみました。

M_UE4Man_Body_Inst

f:id:MozPaca:20161212134442p:plain

 

M_UE4Man_ChestLogo

f:id:MozPaca:20161212134750p:plain

 

パラメータを時間で変更させる

作成したMaterial FunctionにはTimeノードなどを使用した

時間で何かするという処理は入っていません。

 

ですので、別のところでパラメータを変更させる必要があります。

 

まずはThird Person Characterのブループリントを開きます。

f:id:MozPaca:20161212135245p:plain

 

変数を一つ追加します。

Dynamic Material Instanceでパラメータを変更させるためのものです。

戻り値はMaterial Instance Dynamicで配列化しておきます。

f:id:MozPaca:20161212135341p:plain

 

そして、Construction Scriptで処理をこのように書きます。

Meshで使用しているマテリアルをすべて

Dynamic Material Instanceとして作成し、変数に格納しています。

f:id:MozPaca:20161212135519p:plain

 

次にイベントグラフに処理を書きます。

カスタムイベントからタイムラインにつなげ、

時間によってパラメータを変更します。

タイムラインの処理が終了すると、

Destroy Actorに流れるようにしておきます。

f:id:MozPaca:20161212135740p:plain

 

タイムラインはこんな感じです。

f:id:MozPaca:20161212140030p:plain

 

エフェクトを発生させる

任意のタイミングで発生できるように

カスタムイベントを作成したので、

適当なタイミングで呼び出したいと思います。

 

今回はこの死亡アニメーションが終了して、

0.2秒後にエフェクトを発生させましょう。

f:id:MozPaca:20161207151150p:plain

 

まずは、このアニメーションを開き

アニメーションの終了時に通知を追加します。

f:id:MozPaca:20161212140544p:plain

 

次に、このアニメーションを組み込んだ

アニメーションブループリントを開きましょう。

f:id:MozPaca:20161212140851p:plain

 

先ほど作成した通知イベントから、このように処理を書き

エフェクト発生用のイベントを呼び出します。

f:id:MozPaca:20161212141008p:plain

 

これで処理は完成です。

 

再生してみる

今回はPキーを押すとアニメーションが流れるようにしました。

www.youtube.com

 

すこし、粗が見えますね。

パラメータの微調整が必要そうです。

UE4 Procedural Midiをちょこっと分析して使ってみる

この記事は裏Unreal Engine 4 (UE4) Advent Calendar 2016への参加7日目の記事です。

qiita.com

 

※ページの最後に作成したプロジェクトの共有リンクを張っておきます。

 プロジェクトを直に見たい方はそちらをご覧ください。

 

昨日(6日)はalweiさんのロケットパンチ講座でしたが、

unrealengine.hatenablog.com

 

今日(7日)はDTMで作成したMIDI(.mid)ファイルをUE4上で再生してみよう回です。

プロジェクトの作成から始めて、音を再生するところまで書きたいと思います。

Procedural Midiはまだ公式のドキュメントが無いようなので、

手探り状態でいろいろ試してみます。

 

最終的にはこんな感じになりました。

www.youtube.com

録画ソフトの影響で音が途切れて聞こえる箇所があります。

 

(グレーマンたちが手を繋いでるように見える)

 

一応補足

音源の作成、及び.mid書き出しには

Aria Maestosaを使用しています。

http://ariamaestosa.sourceforge.net/

フリーで使えて、機能も充分なので私のお気に入り。

 

DTM : PC上で音を作ること(打ち込み音楽とか言われてるアレ)

.mid : 大体のソフトで読み込めるスタンダードmidiファイルのこと

 

DTMMIDIの詳しい説明は自分で調べてください。

先に言っておきますが私はDTM超初心者です!

 

本題

今回はUE4のマーケットプレイスにある

「Procedural Midiプラグインを使います。

https://www.unrealengine.com/marketplace/procedural-midi?lang=ja

f:id:MozPaca:20161206110020p:plain

「エンジンにインストールする」をクリックして、

このプラグインを使用したいバージョンを選択しましょう。

インストール可能なバージョンは4.12~4.14までです。(2016年12月7日現在)

 

導入することでできるようになること

マーケットプレイスのテクニカルノートより引用

・Ability to Import/Play Midi.

 Midi(.mid)ファイルの読み込みと再生ができます。

・Create Audio Notes Procedurally.

 Midi音声ファイルをプロシージャとして作成します。

・Create Procedural Audio Note in Sound Cue Editor.

 Sound Cueエディタで作成したプロシージャを扱えます。

(英語読めないので、ミスがありましたら教えてください) 

 

プロジェクトの作成

では早速やっていきましょう。

私の環境では現在4.14.0が起動しないので、

ver.4.13.2でやっていきます。

f:id:MozPaca:20161206120603p:plain

 

インストール済みのプラグインをクリックし、

Pricedural Midiがインストールされていることを

確認してから作成しましょう。

f:id:MozPaca:20161206120652p:plain

(今回のプロジェクトではSubstance Pluginは使いません) 

 

名前などは適当に。

f:id:MozPaca:20161206121439p:plain

 

プラグインが有効になっているか確認する 

先ほどエンジンにプラグインがインストールされているかの確認をしましたが、

今度はそのプラグインが有効になっているかを確認しましょう。

 

Edit→Plaginを開きます。

f:id:MozPaca:20161206122616p:plain

 

Installed→Audio→Midi AssetのEnabledにチェックが入っていたら

有効になっています。もし、チェックが入っていなければチェックを入れましょう。

f:id:MozPaca:20161206122815p:plain

 

.midをインポートする

通常UE4は.midファイルをインポートすると

f:id:MozPaca:20161206122155p:plain

このように読み込めません。

 

しかし、Procedural Midiプラグインを有効にしている場合

f:id:MozPaca:20161206123234p:plain

インポートボタンもしくはドラッグ&ドロップで読み込んでくれます。

 

ちなみにMidiファイルの中はこのようになっています。

f:id:MozPaca:20161206145451p:plain

配列の中に鳴らすべき音を示す数値が格納されています。

 

ブループリント以外で必要なものを作成する

先ほどの動画ではグレーマンが発光していましたが、

発光させるために必要なMeshとMaterialなどを準備したいと思います。

 

MeshにはStarter Contentに収録されているShape_Cubeを使用します。

Static Meshであれば何でも大丈夫のようです。

(グレーマンは一度Static Meshに変換してから使いました)

f:id:MozPaca:20161206143452p:plain

 

次にマテリアルですが、

色の変化などはDynamic Material Instanceで行うので、

f:id:MozPaca:20161206143738p:plain

このように、Emissive ColorにVector Parameterを入れておくだけでいいでしょう。

f:id:MozPaca:20161206143835p:plain

 

処理を書いていく

まずはActor型のブループリントを作成してください。

このブループリントは再生や描画に必要な処理の親クラスとして作成します。

f:id:MozPaca:20161206124542p:plain

 

名前はこんな感じ

f:id:MozPaca:20161206192328p:plain

 

ではBP_Baseを開いてください。

コンポーネントに「MIDI Processor Component」を追加します。

f:id:MozPaca:20161206131244p:plain

 

このコンポーネントMidiの再生に使用するイベントや、

再生スピードを変えることができるようです。

f:id:MozPaca:20161206131500p:plain

 

変数を一つ作成します。

MIDI Asset型の変数です。

どうやらインポートしたMidiファイルは

この型の変数に格納できるようです。

とりあえず、先ほど読み込んでおいた.midをデフォルト値に入れておきましょう。

f:id:MozPaca:20161206132103p:plain

 

ノードを組みます。

開始時にMidiのセットアップの処理を書きます。

f:id:MozPaca:20161206185849p:plain

 

次にBP_Baseから継承したファイルを作成しましょう。

情報の受け渡しを行うBP_PLayerBaseを作成します。

f:id:MozPaca:20161206193435p:plain

f:id:MozPaca:20161206193403p:plain

 

これらのBaseファイルを使用するファイルを作成します。

BP_Baseから継承してBP_Playerを作成しましょう。

f:id:MozPaca:20161206193819p:plain

 

Material Dynamic Instanceを戻り値とした配列の変数を作成します。

f:id:MozPaca:20161206193834p:plain

 

開始時にMeshを指定個数作成し、

音が再生されるたびにランダムに色を変える処理を書きます。

f:id:MozPaca:20161206194007p:plain

レベルに配置する際はこのBP_Playerを配置してください。

 

生成されたBoxが指定個数(15個)並んだ様子

f:id:MozPaca:20161206210704p:plain

 

鳴らしてみる

このままBP_Playerをレベルに配置し、

Playボタンを押すとMidi Asset変数に格納している

MIDI音源が再生されます。

 

MIDI音源を再生するならここまでで終了です。

まだいろいろ機能がありそうなので調べてみたいと思います。

 

こんな感じになりました。

www.youtube.com

 

気づいたこと

 今回Procedural Midiを触ってみて気づいたことがあります。

・アフタータッチや、ピッチベンドがかけられる?

サンプルを見ると、これらの特殊効果についての

記述がありました。もしかすると特定の音に対して、

特殊効果をかけられるかもしれません。

 

DTM上でパートの数によって発光するBoxの数が違う。

これは私がAria Maestosaを使用して作成したものですが

見てのとおりパートはグランドピアノ一つです。

www.youtube.com

これをUE4上で再生すると

このようにBoxが一つしか発光しません。

www.youtube.com

 

楽器や特定の音域でBoxの担当があるのかと思い、

同じ楽器で二つのパートを作ってみました。

www.youtube.com

UE4で再生し確認したところ、どうやら違うようです。

こちらは二つのBoxが発光していました。

www.youtube.com

Boxの発光数はDTM上のパートの数で決まるようです。

Procedural Midiを使う際には、パートの多い音源をおすすめします。

 

・純粋に面白い

これ一番大事じゃないでしょうか。

一見どこで使うかわからないような処理が多いですが、

Midiのような特殊なものを扱うのは楽しいです。 

 

プロジェクトはアップロードしています

今回作成したプロジェクトは

Googleドライブにアップロードしていますので参考までにどうぞ。

MidiTestProject.zip - Google ドライブ

 

明日

明日(8日)はてんちょー(@shop_0761)さんの

水彩風マテリアルをつくってみる」です。

マテリアルは勉強中なのですごく楽しみです。

 

UE4 汎用的にサウンドを再生する

汎用的と言いましても、一人で開発する場合は(管理が楽になるかもしれませんが)

手間が増えるだけです。今回の処理はあくまでサウンド担当者が処理を書き、

別の担当者が処理を楽に呼び出すための方法です。

 

私が普段開発を行う際の書き方ですので、

もっといい方法があれば、教えてください。

 

では、やっていきます。

今回のUE4のバージョンは4.13.2です。

 

必要ファイルを作成していく

必要になるのは、

・Data Table

・列挙体

・構造体

・呼び出し用のFunction Library

・サウンドファイル

・サウンドキュー

・減衰設定ファイル

f:id:MozPaca:20161130162708p:plain

f:id:MozPaca:20161130162921p:plain

です。

 

Data TableやFunction Libraryについては過去記事を参考にしてください。

mozpaca.hatenablog.com

 

それぞれのパラメータを設定する

 

まずはData Tableで使用する構造体を作成します。

鳴らすだけなら必要なのはSound Cueの指定だけですが、

後の扱いやすさを考慮して

・Sound Cueファイルの指定

・BGMかSEかの判定(True...BGM, False...SE)

・サウンドの大きさ

をパラメータに作成します。

f:id:MozPaca:20161130163341p:plain

 

次にDataTableを設定をします。

先ほどの構造体で作成したパラメータに対応させたいものを入れていきます。

・攻撃の音であるSE_AttackはBGMではないためIs BGMはFalse、

 サウンドの大きさは1。

・小爆発の音であるSE_SmallExplosionはIs BGMがFalse、

 サウンドの大きさは0.8。

・物を振る音であるSE_SwingはIs BGMがFalse、

 サウンドの大きさは1にします。

f:id:MozPaca:20161130162953p:plain

 

列挙体の設定をします。

ここで注意ですが、DataTableで設定した順番と同じようにしてください。

同じ順番でなかった場合、サウンドが再生されないもしくは、

違ったサウンドが再生されます。

f:id:MozPaca:20161130165720p:plain

 

最後にFunction Libraryを設定していきます。

関数名はPlay Sound For DataTableにしました。

引数として、鳴らしたいサウンドを指定する列挙体と

サウンドを鳴らす座標を指定するVectorの値を用意します。

Rertun値にはサウンドが鳴ったかどうかを文字で判定する

Bool型の値を用意します。

f:id:MozPaca:20161130170359p:plain

 

関数の全体図です。

f:id:MozPaca:20161130170922p:plain

 

順番に解説していきます。

まずはData Tableの列をすべて読み出し、引数で設定した列挙体と同じ番号が

あるかを判定します。同じ番号がなかった場合はサウンドを再生できないため、

RertunのIs Spawn SoundにFalseを入れて関数を終了させます。

f:id:MozPaca:20161130170946p:plain

 

同じ番号があった場合はその列の値を読み出します。

Is BGMの中身がTrueかFalseかを判定します。

f:id:MozPaca:20161130171329p:plain

 

Is BGMがTrueだった場合はSpawn Sound 2Dで再生し、

Is BGMがFalseだった場合はSpawn Sound At Locationで再生します。

再生する際に、Sound CueとSound Volumeを入れておきます。

Spawn Sound At Locationには減衰用のSound Attenuationを指定しておきます。

ReturnのIs Spawn SoundにTrueを入れて返します。

f:id:MozPaca:20161130171554p:plain

 

呼び出してみる

設定はすべて終わったので、サウンドを呼び出したいと思います。

レベルブループリントを開き、先ほど作成した関数を呼び出します。

関数の引数に鳴らしたいサウンドの列挙体と、サウンドを鳴らす座標を指定します。

(今回はマップに置いてある椅子からサウンドを鳴らすので椅子の座標を入れます)

サウンドが鳴ったかどうかを文字で確認するため、Print Stringを追加します。

f:id:MozPaca:20161130173256p:plain

 

確認してみる

上手くいっていれば、このようになると思います。

www.youtube.com

 

以上。私は普段こう書いてる話でした。

VRGameJamに参加してきました。

先日大阪で行われたVR Game inJapan 2016 Autumnに

参加してきました。

 

結果から言いますと楽しかったです。

普段しないような強引な処理を組んで別の発見があるなど
非常に充実した時間を過ごせました。

 

次回への課題としましては

他の参加者の方はハイスペックPCや、VRデバイスを

持ってきていただいているにも関わらず、私はほぼ手ぶらで参加してしまったのは

申し訳なく思っています。(ごめんなさい)

次はVRの動くPCとDK2を持っていくので勘弁してください。 

 

今回は一部のサウンドの作成をしたほか、

関数ライブラリなどの汎用ブループリントを書かせていただきました。

 

今回、我々のチームはVRタワーディフェンスでゾンビを撃ちまくる

ゲームを作りました。

 

初日に使用する大まかな関数や、素材を用意しました。

こちらが初日の中間発表のスライドです。

 

2日目にほぼ完成までできたのですが、残念ながら

完成させることができませんでした。

 

こちらは2日目の最終発表時のスライドです。

 

プレイ動画は追記にて載せたいと思います。

(今手元にない...)

 

次回こそは完成させます。

UE4 DataTableで特定の数値を持ってくる

今回はDataTableを使用して、外部からの数値を持ってきたいと思います。

 

こちらのブログを参考にしました。

[UE4] CSVデータを扱う方法 DataTable編 | historia Inc - 株式会社ヒストリア

 

UE4のバージョンは4.14.0です。

続きを読む

UE4 GameInstanceでグローバルに値を扱う

Game Instanceについて書きます。

今更解説もいらないシリーズ1です。

Game Instanceはレベルを跨いで値を保持するために使用するものです。

詳しい説明は

UE4 レベルを跨いで値を保持するGameInstanceについて - Let's Enjoy Unreal Engine

Game Instance, Custom Game Instance For Inter-Level Persistent Data Storage - Epic Wiki

に載っているのでそちらを参照してください。

 

ではやっていきます。

今回のUE4のバージョンは4.14.0です。

 

Game Instanceを作成する

プロジェクト作成後、Game Instanceのブループリントを作成します。

一番下にあるAll Classesに「Game Instance」と入力し、

Game Instanceを選択、Selectボタンを押します。

f:id:MozPaca:20161121172258p:plain

 

適当な名前を付けます。

f:id:MozPaca:20161121172514p:plain

 

Game Instanceを設定する

次に左上のEditからProject Settingsを開きます。

f:id:MozPaca:20161121172559p:plain

 

左側のProjectのMaps&Modesから

先ほど作成したGame Instanceを選択します。

f:id:MozPaca:20161121172827p:plain

これでGame Instanceを使用する準備ができました。

 

Game Instance内に処理を書いていく

作成したGame Instanceを開くと、このような感じだと思います。

f:id:MozPaca:20161121173804p:plain

 

グローバルに値を持ちたい変数や、

どこでも使いたい関数などを作成します。

 

今回は適当なBool型の変数と

Call Eventと文字を出力するCustom Eventを作成しました。

f:id:MozPaca:20161121174038p:plain

 

ではGame Instanceで作成した変数の値と関数を呼び出してみましょう。

レベルブループリントを開きます。

 

そしてこのように処理を組んでください。

Get Game Instanceは、先ほどProjectSettingsで設定した

Game InstanceがReturnされています。

その値でCastをし、扱いやすいように変数に格納しておきます。

f:id:MozPaca:20161121180320p:plain

 

その下にこんな処理を記述し、Pキーが押された際に

Game Instance内のGrobalFlagをTrueにし出力後、

Grobal Eventを呼び出します。

f:id:MozPaca:20161121180605p:plain

 

実行し、Pキーを押すと

f:id:MozPaca:20161121180746p:plain

GrobalFlagがTrueに変更後、出力。

GrobalEventによってCall Eventと出力されました。

 

Game Instance外のものをグローバルな変数に格納する

あらかじめ作成しておいたWidgetを戻り値に変数を

Game Instance内に作成します。

f:id:MozPaca:20161121180905p:plain

 

このままではまだ変数の中身は空なので、

Widgetブループリント内で自分自身をGame Instanceの変数に格納しましょう。

f:id:MozPaca:20161121181219p:plain

これでこのWidgetの値はGame Instanceを介すことで、

グローバルに扱えるようになりました。

 

今回はWidgetを使用しましたが、

何のコントローラーも持っていない、

おいてあるだけのObjectもグローバルに扱えると思います。

 

ただし、グローバルに扱えるということは

それなりのリスクがあるので注意して使用してください。

UE4 発光するゲージを作ってみる1

もう今更書くこともないようなことですが、
自分用のメモとして残しておくことにしました。

まぁもともとはぎんりゅーさんからの相談がきっかけですが。
(グラデーションのUIって綺麗だよねぇ)

 

今回はグラデーションで誤魔化してみよう編です。
またいろいろやってみます。

 

UE4のバージョンは4.13.2を使用しています。

 

続きを読む