しんばりん日記

ue4を使ってのゲーム制作ブログです。間違いを指摘していただけると助かります!

攻撃してみる:魔法作成(8)

前回の続きからで、ダメージ値を受け取るところですね。

当たったらメッセージを表示していた、のイベント通知に値を持たせてみよう、という感じです。

 

まずはダメージを受ける側から実装してみましょう。

f:id:sinvary:20190205011156p:plain

といっても、以前作成したEnemyBaseのイベントディスパッチャーのインプットにintを追加しただけですが。

これを、ダメージ計算関数に渡せば受け取り側は完成です。

 

次に、ダメージを渡す側として魔法BPを久しぶりに編集しましょう。

というわけで、これも以前に作成したDataBaseを使用するわけですが...

そういえばこのデータベースをどこかで使用していましたが忘れてしまいました...

なのでリファレンスビュワーで確認します。

f:id:sinvary:20190205011731p:plain

確認することができました。あぁ、IceMagicでしたね、そういえば。

[左]が[右]を参照している、とみてもらって間違いないと思います。多分。

ちなみに、中央が読み込まれた時点で右側も読み込まれるみたいですね。

なので、できる限りリファレンスビュワーで確認する際のつながりは少ないほうがいいみたいです。

 

さて、IceMagicBPではBeginPlay時に自身のレベルに応じて、データテーブルからステータスを引っ張り、それを保持していたようですね。

これをFireMagicでも同じことをします。

 

f:id:sinvary:20190205012220p:plain

それをMagicBase側にて、Enemyタグに当たった場合ダメージ値を相手に与えるようにします。

一応はこれで完成です。

現状だとデータテーブルの値は氷も炎もダメージ値が100だったので、片方を変えてみたりレベルごとに変えてみたりするとはっきりとわかるかと思います。

 

ただ...BlueprintFunctionの簡易ダメージ計算関数がうまく働いていないようですね...

自身のHP(100) - ダメージ値(50)なのに結果が0...二回来ているようには見えないし...

といろいろやって思い出しました。ひとまず、こうしました。

f:id:sinvary:20190205013139p:plain

このノードでつながっている限り、同じ[入れ物]なんだってことをすっかり忘れていました。

つまり、前回までのままだと

f:id:sinvary:20190205013501p:plain

赤丸の箇所を参照するたびに計算式が行われていたということですね...

文章で書くと、

1:構造体とダメージ値を持ってきて、HP-ダメージ値の結果を構造体にいれる

2:更新された構造体の値とダメージ値を再度計算し、その結果を返す

という流れになっていました。

今回の修正は計算結果を別の入れ物に入れることで、何度も計算することを防ぎました。

まぁリファレンス参照しなければいいだけではあるんですが。

 

もちろん、これが便利な場合もありますが、今回は意図していない挙動だったため、修正をしました。

 

ひとまず今回はここまでで。

次回は...何しようかな。

連打すると今バグるのでそれの修正にしようと思います。

あとは魔法のバリエーションの追加ですかね。

散弾とホーミングいれたい。では、また。

攻撃してみる:魔法作成(7)

攻撃を受けたら、HPを減らして、HPが0になったらDestroyする処理を作成します。

結構前に魔法作成していた際、敵側に「魔法が当たったらPrintstring」みたいな感じの処理を書いていたので、実装はそれなりに楽のはずです。

 

それでは実装していきます。

まずはEnemyBaseに...と思ったのですが、せっかくなのでこいつらのパラメーターをデータベースで管理しましょう。

 

実装方法は魔法作成と同様で、まずは[キャラクター共通の構造体]を作成。

中身はひとまず体力だけにしておきました。

今後、この中に攻撃力や移動速度などが入る予定です。

次に、[敵共通の構造体]を作成。

この中に、[キャラクター共通の構造体]を持たせます。

他にも、何を倒したか、をわかりやすくするために[名前]を追加するかもしれませんし、倒した際のスコアやらお金やらを追加するかもしれません。

とにかく、これで構造体は完成です。

これを元にしたデータベースを作成します。

f:id:sinvary:20190201010204p:plain

超適当...

 

BaseのBeginPlayにて、データベースを取得します。

今回もタグでー...と思ったのですが、そういえば魔法の当たり判定の際に、Enemyタグで判定しているのを忘れていました。

もう一つタグを設定してもいいのですが、列挙型を利用してみましょう。

 

[新規作成]→[ブループリント]から[列挙型]を選べばすぐ作成できます。

作成したら、先ほどのデータテーブルにつけた名前をコピー&ペーストで追加していきます。

はい、めんどいですね。拡張すれば、どちらかを追加したら連動してもう片方も追加される、なんてことができるかもしれませんが。

それはともかく...

作成したら、Baseに戻ります。

 

魔法の時と同様に、データテーブルを取得します。

今度は、先ほど追加した列挙型を変数に追加し、これをName型にキャストして検索します。

f:id:sinvary:20190201013010p:plain

注意すべきなのは、直接Name型にキャストするのではなく一度Stringにキャストしなくてはいけないことです。

こうしないと、ユーザー定義の名称にならないみたいですね。

とにかく、これで無事に取得することができました。

次は、ダメージ計算です。

 

ダメージ計算といっても、現状考えているのは[HP-ダメージ]なのでそこまで難しくするつもりはありません。

が、それをEnemyで作成して、Playerでも同様の処理を作成するのは面倒ですよね!ね!

なので、FunctionLibraryを使用してみましょう。

 

[新規作成]→[ブループリント]→[ブループリント関数ライブラリ]にて作成します。

f:id:sinvary:20190201014142p:plain

中身はこんな感じに作成しました。

[リファレンス渡し]にチェックをいれると、〇ではなく◇になります。

こうすることで、関数にいれた変数の値が変わってくれるようになります。

箱の中身を使っていろいろするのではなく、箱の名前を変えて使う、といったイメージですかね。

返すboolの結果は、計算した結果(ダメージ計算結果、体力が0以下なら)を返しています。

 

f:id:sinvary:20190201014533p:plain

実装箇所はこんな感じです。

inStatusParamの型は[キャラクター共通の型]にしているため、いったん分解したものを渡しています。

 

今はinDamageの値に10を入れていますが、実際は左のイベントからダメージ値をもらって、それを入れる予定です。

今回長くなっちゃったので、次回にダメージ処理を回したいと思います。

それではまた!

 

...の前に。

今回実装した列挙型の変数のプロパティをインスタンス編集可にすることで、配置後のキャラクターに個別に名前を付けることができます。

f:id:sinvary:20190201015142p:plain

こうすることで、似たような大量のアクターを作成する無駄を省くことができるかもしれませんね。

スポーン時に公開するのもいいですね。

あくまで似たような挙動するMob達なら、ある程度はまとめられそうですね。

 

それでは今度こそ、また。

攻撃してみる:アニメーション作成(5)

前回の続きからですね。

前回はアニメーションが一度再生されるとそのまま腕が上がりっぱなしだったので、

今回は

攻撃する→腕をあげきる→魔法をはなつ→腕をさげる

の流れを作っていこうと思います。

 

というわけで、まずはループアニメーションの中にイベントを仕込みましょう。

どうやらアニメーションにイベントを配置する方法としては、

・[通知を追加]・[AnimNotifyStateを利用]の2つが主だった方法みたいですね。

他に遷移する利用法としては、アニメーションの時間にあわせて値を変化させているみたいですね。

腕を下げるためにアニメーションに値を変化させるトラックを追加してもいいですが...ま、今回は豪華に全部イベントで作っちゃいましょう。

AnimNotifyStateを利用してもいいのですが...まぁそれはまた別の機会にでも。

f:id:sinvary:20190131000425p:plain

右クリック→通知を追加→新規通知にて、イベントを追加していきます。

ループアニメのいい感じの箇所にてスポーンさせるイベント、あと最後の箇所に腕を下げるための通知をおくるイベントを追加します。

どっかにアニメーション終了の通知とかあった気がしましたが...思い出せたら修正します。

 

それではこの通知を利用していきましょう。

ただその前に、コントローラー内を少し修正します。

f:id:sinvary:20190131002408p:plain

f:id:sinvary:20190131002537p:plain

イベントディスパッチャーを追加し、以前作成していた魔法スポーン関係をまるっと移動しました。

 

f:id:sinvary:20190131002020p:plain

アニメーションBP内側は、このように修正しました。

1:MagicShotイベントがControllerからきたら腕をあげ

2:MagicSpawnEventの通知が呼ばれたらController内のSpawnEventに通知を飛ばし

3:その後AttackEndイベントが呼ばれて腕を下げる

といった流れですね。

 

これで無事にアニメーション編は終了となりました。

思ったよりも短く済んでよかったです。

ただやりたいモーションが魔法だけでもあと1つ追加したいなというのがあるので、近いうちに触れることになるかもしれません。

イメージ的に絶対必要というわけではないので別にいらないっちゃいらないのですが。

 

さて、次は何をつくろうか...

メモには魔法作成の次には敵の作成とありましたね。

魔法作成はこれでいいのか、と言われたら全然だめですが、ひとまず魔法に攻撃力を持たせて、敵にHPを持たせて、0になったら消える程度は作っていきましょう。

タイトルは再び、魔法作成のままでいこうと思います。

では、また。

攻撃してみる:アニメーション作成(4)

今回は攻撃ボタンを押したらアニメーションを再生してみようと思います。

いろんな方法があるようですが、自分はイベントディスパッチャーが好きなのでこれを使用したいと思います。

 

というわけで、まずは魔法スポーン処理にイベントディスパッチャーを作成します。

f:id:sinvary:20190130012334p:plain

こちら側は、ひとまず呼び出しだけで。

 

次に、アニメーションブループリントを開きます。

f:id:sinvary:20190130012509p:plain

BeginPlayイベントから、Pawnを取得する→コントローラー取得する→キャストするときて、

先ほど作成したイベントをバインドします。

呼び出された場合、つまり魔法がスポーンされた場合はフラグがTrueとなり、結果アニメーションが再生されるようになりました。

 

ただこれだけだといろいろとダメですね。

・流れ的にスポーン→アニメーション再生となっているため、欲しいタイミングで魔法が発射されない

・一度再生されたら手が元に戻らない

ここら辺はアニメーションにイベントを仕込めば楽にできそうです。

 

あとはまぁ、普段のブレンド値を0にしたほうが自然体っぽいのでそこの修正も必要そうですね。

 

ちょっと本日は...うん気分が乗らないのでこれぐらいで。

次回はーまぁこれぐらいの遷移を終わらせたいですねー

はい。短いですが。お疲れ様です。

攻撃してみる:アニメーション作成(3)

今回は前回の続きということで、ステートマシンを完成させます。

完成といってもそんな大げさなもんではなく、

[魔法攻撃スタート]→[魔法攻撃ループ]→[魔法攻撃エンド]

の推移完成ですね。これを目指します。

 

まずは[魔法攻撃ループ]と[魔法攻撃エンド]アニメの作成から入ります。

ループの場合は以前に作成したスタートアニメを流用すればあっという間に作成できます。

f:id:sinvary:20190129001035p:plain

フレームを最後に指定すれば、ちょうど魔法を放つ瞬間になります。

その状態で、アセットを作成→アニメーションを作成→現行ポーズ

これにて、片手をあげた状態のアニメーションが作成されました。

 

攻撃終了の場合は、逆再生でいいかな、ということで攻撃開始をコピー。

そのRateScaleを-1.0にすることで逆再生となりました。

 

これを、ステートマシンに配置していきます。

f:id:sinvary:20190129003858p:plain

だいたいこんな感じで。

State→MagicAttackAnim_Startは[isMagicAttack]がTrueの時に。

Loop→Endの時はFalseの時に遷移するようにしています。

Start→Loopと、End→StateはTrueを入れているのでアニメーション終了時に自動で遷移してくれています。

 

今回はここまで。

Loop中に攻撃を想定していましたが、考えてみたらLoopアニメじゃないですね。

レベルによって発射タイミングがずれる、というのであればLoopでもよさそうですが、どちらにしても発射アニメがあったほうが将来的によさそうですね。

まぁ必要になった時に追加しましょう。

 

次回は攻撃ボタンを押したらisMagicAttackフラグをOnにする、とかをやっていこうと思います。

あとはアニメーションにイベントを仕込んだりですね。

攻撃してみる:アニメーション作成(2)

今更だけどブログ名が日記なのはどうなんだろ...まぁいっか

今回は前回の続きでアニメーションですね。

 

前回はアニメーションを作成しただけで終わったので、今回はアニメーションBPにセット、ブレンドあたりをやってみます。

 

公式ドキュメントとにらめっこしながら作成していきます...

 

まずはアニメーションBPを開きます。

アニムグラフのDefaultから出力された結果を出力されているようですね。

中身をみると、立ち、歩き、ジャンプなど基本的な遷移が完璧にできていますね。

ここはいじらず、せっかくなので出力された結果をブレンドすることにします。

 

というわけで、Defaultの結果をキャッシュに保持し、それをBlendします。

今回使用するブレンドの関数は Layered Blend Per Bone です。

ボーンを指定し、その先から影響してくれる便利なブレンドですね。

えぇ、本当に便利です。

f:id:sinvary:20190125003206p:plain

[ボーン毎のレイヤードブレンド]というのはLayered Blend Per Boneのことですね。

その設定として、BoneName等を指定しています。

BlendDepthはどのくらいブレンドするか、みたいですね。

数値が大きければ大きいほどだんだんブレンド「されなくなる」みたいです。

また、-の値はブレンドされませんでした。

0でもブレンドはされたのでデフォルトでいいかもしれませんね。

MeshSpaceRotationは現在のメッシュの角度に応じた角度(ローカル座標てきな?)でブレンドするみたいですね。

今回、走っていても肩より上に腕を上げたアニメーションをしたかったのでチェックをいれました。

チェックを外した場合、例えばお辞儀をした状況でアニメーションをした場合だと腕は地面に向けます。

他はよくわからないので今回はスキップ。

 

f:id:sinvary:20190125004433p:plain

[走り]と魔法使用のブレンド結果です。

ただ、今回のアニメーションだけだと腕をあげる→あげきる→腕がパッっと戻る

と挙動がおかしいので、デフォルトアニメと同様なステートを作成する必要がありそうです。

 

f:id:sinvary:20190125004928p:plain

とりあえずループアニメなどの作成は後回しにして、

新規のステート...を選択し、名称を決めてDefaultAnimに行ったことと同様にキャッシュ、ブレンドにつなぎます。

ステートマシンの内容は適当に。

MagicAttackに攻撃アニメを入れましたがStateの中は何もないです。

変数を追加し、遷移に必要な条件として仕込みました。

 

 

本日はこんな感じで。

次はステートマシンの完成、その次くらいに実際に攻撃した際に再生する、ぐらいですかね。

うん、いい調子だ...

攻撃してみる:アニメーション作成(1)

それでは今回からアニメーションを作成していきます。

といっても新たにスケルタルメッシュを作成するわけでもないのですが。

すでにデフォルトで入っているグレーマンにアニメーションを利用?して作成していきましょう。

初めての作業なので多分失敗ばかりの記録になりそうです。

 

まずは[アニメーション]を作成しましょう。

f:id:sinvary:20190124000809p:plain

適当にデフォルトで作成されているアニメーションから、アニメーションを作成しました。

現行ポーズは...どれもパットしないのでリファレンスポーズから作成しました。

 

また、さすがに0フレームは何もできないので適当に30フレームに増やしておきました。

これはフレームの箇所に右クリックで増やせるので楽ですね。

今回作成するのは魔法を掌から発射するアニメーションです。

なので動かす腕は以前にソケットをアタッチした側ですね。

その肩の部分を選択し、「+キー」をクリックします。

次に下のフレームの部分を右いっぱいまでもっていき、30フレームの箇所で

腕を上げた状態で「+キー」をクリックします。

これで、腕を上げるアニメーションの完成です。

f:id:sinvary:20190124001611p:plain

今回ホネが見えなかったので、[Character]→[Bones]から[すべての階層]を選択しました。

これにより、選択していないホネをクリックしやすくなります。

それにしても...Playするとかなりスローリーですね...思い切って半分のフレームにしましょう。

後ろのフレームを削除するとキーが変更されるので、修正します。

 

さて、これでアニメーションは作成されました。

次は攻撃時にアニメーションを再生するだけです。

といっても、このまま単純に再生するだけだと

走っていたプレイヤーが急に立ち止まって(足などが止まって)腕を持ち上げて魔法をだす...

とんでもないものになってしまいます。

それを防ぐために、アニメーションブレンドを使用したいと思います。

マネキンが歩く→走るを滑らかにしているのはこれを利用しています。

同じようにすれば、きっとできるようになるのではないかと!

アニメーションのキー同士がブレンドされるならいいのですが、

もしボーンの状態がブレンドされるのならまた考えないといけませんが...

 

ということで、本日はここまで。

なんもしてないけど。

明日はアニメーションブレンドに取り掛かりたいと思います。