しんばりん日記

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

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

それでは、敵をサーチする処理を作成していこうと思います。

最初に発見した敵を追い続ける予定です。

 

というか、軽く検索したらトップにAnswerHubのページが乗っていたので、これを丸々コピーしましょう。

 

f:id:sinvary:20190220013853p:plain

コピーしたものを関数化し、MagicControllerにて検索するようにしました。

内容は個人で検索してみてください。

魔法側、あるいはHomingコンポーネントで検索しようと考えたのですが、拡散弾のホーミングを作成した場合、状況によっては数弾だけ別の敵に向かってしまう可能性があるため、このような形にしました。

もしそうなったら格好悪いですし。

 

また、「向き続ける」ものにも時間制限を設けることにしました。

もう少し砕けた言い方するなら、ホーミング時間を設けた、ですね。

f:id:sinvary:20190220014723p:plain

まぁこの制限を外してもホーミング魔法が強くなりそうですが。

あとはホーミング魔法だとぶつかったら魔法は消滅、とかのデメリットな性能ぐらいはついてもいいかもしれませんね。

 

えぇと、次にこのホーミングパラメーターを魔法のリストに組み込みます。

f:id:sinvary:20190220015556p:plain

HomingTimeにしようかなと思ったのですが、氷魔法の場合は貫通力にしようと思いなおしたので汎用性のありそうな名前に変更しました。

 

これに合わせてリストも更新すれば完成です。

近くにいる敵を取得し、そいつを追う処理、そして追い続ける時間を設定しました。

まぁこのホーミング処理はゲームが完成するころには修正するでしょう!

 

さて、次回からAIやっていきたいです!

どのように動かすか全く考えてないけど!

・・・その前にまた攻撃アニメーションを組み込んだほうがいいのかなぁ。

その時はその時で。

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

今回は前回作成したホーミング機能を、コンポーネントへ移行してみようと思います。

といっても、以前に作成したMagicControllerとほぼ同様の処理となりますが。

...よく考えたらMagicControllerはコンポーネント化する必要ありませんでしたね。

 

えぇと、まずは新規作成からブループリントを選び、ActorComponentを選びます。

名前はHomingComponentとします。

この処理の中身は[Tickで向きを変え続ける]だけにしてみました。

f:id:sinvary:20190219014908p:plain

このTargetの型はActorです。もちろん、インスタンス編集可能にチェック済み。

 

f:id:sinvary:20190219015102p:plain

このコンポーネントをFireMagicにくっつけ、前回作成した向き続ける処理を削除し、
BeginPlay等にでもTargetを入れてあげれば完成です。

 

これで、ホーミング処理を入れたい他のBPを作成した場合、このコンポーネントをくっつけてあげればすぐに適用されます。

 

あとはホーミング処理の緩和ですが。

うーん、考えてない!

これはまた別の機会にしましょう。めんどくさくなったとかではないです。多分。

 

次回は近い敵をサーチしてホーミングする、というのを...やりましょうかね。

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

今回はかなり短めです。

本日からホーミング処理を作成してみます。

といっても、誘導性が100%のものならあっという間に作成できます。

今回はとりあえずターゲットを自身にして、誘導性を100%のものにしたものを作成します。

 

ホーミング性能を付与するのは炎魔法だけの予定なので、今回はひとまず炎魔法のBPに直接書きます。

f:id:sinvary:20190215022718p:plain

内容はこんな感じ。

Tickで移動する処理の直前に、自身の角度を変えています。

このFind Look at Rotationは大変便利な関数で、2点間の角度を求めることができます。

誘導性100%でいいならば、この結果をそのままいれればいいだけですね。

逆に誘導性を下げるならば、0.1倍したものを入れればいい...というわけでもないようで。

まぁそこらへんはおいおいやっていきましょう。

 

とりあえず今回は炎BPに直接記述しましたが、実際は前回のようにコンポーネント化する予定です。

敵の攻撃を作成する際同様の処理をつくるのも面倒ですが、コンポーネント化すればくっつけるだけで楽になる...はずですので。

次回はコンポーネントへの移行と、誘導性の緩和を目指します。

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

前回の続きで、魔法攻撃の管理を行う「MagicController」的なクラスを作成していきます。

 

[新規作成]→[ブループリントクラス]から...うーん、今回はActorComponentを選択しましょう。

名前は適当にMagicControllerで。

 

ひとまず、今まで実装してきたただ魔法を射出するだけの処理を作成してみます。

 

f:id:sinvary:20190214011012p:plain

イベントを作成し、引数によって氷か炎か、をわけます。

それ以外はControllerに記載していたものと同様です。

また、アクターの手の位置を取得するためのCharacter変数はインスタンス編集可能にしています。

 

次に、キャラクターBPを開きます。

f:id:sinvary:20190214011421p:plain

左上に、キャラクターBPにくっついているコンポーネントたちがあるので、[コンポーネントを追加]を選択して作成したMagicControllerを追加します。

その後、BeginPlayにてMagicControllerの変数Characterをセットします。

 

f:id:sinvary:20190214011720p:plain

最後に、Controller内をこのようにスポーン処理の代わりに[Get Component by  Class]からMagicControllerを取得し、イベントを発行すれば完成です。

 

f:id:sinvary:20190214012857p:plain


ちなみに、氷魔法に実装していた散弾はこんな感じに移行しました。

あくまで魔法BPの中身はシンプルなものにしていきたいと思います。

 

さて、通常と拡散ができたので次はホーミングですね。

このホーミングに限っては、炎魔法特融のものにしたいと思っていました。

というわけで、次回からホーミング魔法作成していこうと思います。

 

 

ちなみにといいますか、イベントで魔法の形を分けるようにしたのですがゲームの実装はどうしようかなとちょっと悩み中...

チャージレベルで通常→拡散となるのか、プレイスタイル変更で通常←→拡散になるのか。

どちらにしても、コントローラーからのイベントは1つにして、中で分岐すればすっきりしそうですね。

そのようにするならば、通常と拡散はイベントではなく関数化したほうがもっとよさそうです。

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

散弾作成の続きを行いたいと思います。

が、その前にちょっとしたバグ修正を。

今回はバグ修正のみです

 

現在魔法攻撃ボタンを連打したらモーションこそ通常に戻りましたが、UIがおかしいまま放置していましたので、それを先にちょちょいと修正します。

おかしいというのはゲージが増加し続けることですね。

 

ゲージが増加し続けているので、そのイベントの直前にログを仕込みつつ確認をしてみると、

魔法射出して腕をさげる間に魔法攻撃ボタンを[押す]→[離す]してしまうと正常にフラグがfalseにならず、この現象になってしまうようでした。

うーん、直す場合は...どうしましょう。

 

新たにアニメーションにイベントを仕込んだりするよりかはフラグ追加したほうがよさそうですね。

ようはボタンから離したと言ってるのに値が増加し続けているのが問題なので、インプットイベントにTrue/Falseを入れるフラグを追加します。

f:id:sinvary:20190208012027p:plain

実際の判定処理はこんな感じで。

ノードの先は魔法精製後の処理につながっています。

 

さて、ようやく本題!

今回はスポーン側で散弾するかを判断し、散弾だったらこちら側で複製しようかなと思っています。

といってもforloopで回すだけ、結果的には同じ動きですが、今回はコントローラーに処理を書いているので、

複製する魔法には(実行しないとはいえ)複製する処理が記載されないBPが複製されます。

 

・・・とかいろいろ書いているうちに、別の方法を考えたので、申し訳ありませんが次回にします!

そもそもコントローラーか魔法そのものでスポーン、複製するのではなく、間になにかかませれば楽になりそうなので新しく[MagicController]的なコンポーネントを作成します。

 

働きは

1:プレイヤーコントローラーから「発射位置」「魔法」「レベル」を受け取り、イベントを発行。

そのイベントは「直線型」「散弾型」で別のイベント。

2:受け取ったコンポーネント側で複製するかどうかを判断し、連続スポーン。

しない場合でもスポーン。

 

こうすれば魔法の中身はごちゃごちゃしないで済みますし、コントローラー側も今まで通りきれいな見た目で済みそうです。

スポーンの処理なども全部[MagicController]にまとめられるので、修正などする場合も管理が楽になりそうです。

まぁまだ考えただけなのでちゃんと動くかはわかりませんが。

「直線型」「散弾型」で分けたのは、気分で仕様を変えたい場合すぐに対応できるからですね。

レベルごとなのかコマンドなのかまた別なのか。どれにしてもイベントで発行できればすぐに対応できそうです。

 

まぁこんな感じなのを次回から作りたいですね。

今日はバグ取りだけになっちゃいました...

それでは。また。

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

今回から、魔法の強化ですね。

散弾を作成していこうと思います。

 

けど...どうつくっていこうかなぁ...

 

一応何も考えずに作るというのであれば、IceMagicブループリントのコンストラクタに書いてしまえば何とかなりました。

f:id:sinvary:20190207010008p:plain

通常の魔法スポーンには公開しない変数にて、初回かどうかを判断し、

初回ならキャストをして成功した場合スポーンする。

そしてふつうにスポーンした分は削除。

といった感じですね。まぁ今回は3wayショットしてみたので、通常スポーンは消さなくてもよさそうでしたけどね。

画像のままだとMagicLevelが0のままですね!これだめですね!

 

f:id:sinvary:20190207010256p:plain

結果はこんな感じです。

 

一応見た目的にはうまくいっていますが、できれば魔法BPの中身は魔法しかやりたくないのでこれは消す予定です。

魔法しかやりたくない、というのはエフェクトやアニメーションの管理、ダメージ判定などのみということですね。

ただ今回の処理はあくまで案の1つとして、手元に置いておきます。

 

 

他に散弾を作成する場合は、通常スポーンする側で判断するべきなのかもしれませんね。

次回はそれでいきましょう。

あとは魔法についてもう少しだけ仕様を決めておくべきですね。

どんな場合に散弾となるのか、を考えなければ作りづらいでしょうし。

 

今回も短いですがこれくらいで。では。

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

前回からの続きということで、とりあえず今回は魔法攻撃ボタンを連打するとアニメーションがおかしくなってしまうので、それを修正しようと思います。

 

その選択肢として少し考えたのが...

・アニメーション再生中に攻撃ボタン押下で魔法射出(アニメーション1巡)

・アニメーション再生中に攻撃ボタン押下しても何もしない(手を下すまで)

・攻撃アニメーション中、連打した場合攻撃アニメをループ(攻撃ボタン連打やめたら攻撃終了アニメ再生)

 

といろいろ列挙してみましたが、上記はあくまでむりやり直す場合でしたね。

そもそもどうして今回のバグが起きてしまったのかを調査しなければいけません。

というわけで調査をしてみたところ、どうやらアニメーションステートの遷移がうまくいっていなかったみたいですね。

f:id:sinvary:20190206005157p:plain

条件式では、Loopステート終了時、isMagicAttackがfalseの場合Endに遷移するようにしていましたが、

連打していた場合は遷移前にisMagicAttackがtrueとなってしまい、結果ずっと腕を上げている状態になっていたようでした。

 

これを直す場合ループ再生とするのがよさそうですね。

まぁせっかく名前がループですし。

あと、終了時のイベント発行を終了ギリギリで発行するのではなく、少し余裕をもって発行するように修正しました。

f:id:sinvary:20190206005548p:plain

 

これで連打した場合、無事に再生することができました!

しかも腕を下げている最中にボタンを押したらまた上げ始めるといううれしい誤算付きで!

アニメーションステータス的には正しい挙動なのですが、そこまで考えていなかったので少しうれしいですね。

 

今回は短いですがこれぐらいで。

次からは魔法の強化を始めます。散弾です。

エフェクトをつけ始めてもいいのですが...まぁそれはまだあとで...

といいうかもう2月なんですね...作り始めたのが1月二週目からとはいえ、全然進んでないなぁ...

散弾、ホーミングを実装したらビヘイビアツリー触り始めてもいいですかね。