スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

UE4ゲーム制作入門二十三日

一人UE4ゲーム制作入門アドベントカレンダー二十三日目です。

今日は攻撃力やらHPを反映させました。今まではデバッグ用に攻撃力は絶対に倒せる値でやっていたので。あと、多少ゲーム性を持たせるために制限時間を実装しました。

まずPlayerのメインUIを作ります。UserInterfaceからWG_Mainの名前で新しくウィジェットを作成します。
見た目はこんな感じです。左下のプログレスバーをTransformのAngleで-90度回して縦向きにしました。あと回転の中心点のPivotをいじっています。
右上のは制限時間です。
WG_Mainのデザイナ

まず、ST_StatusにHP_MaxとAttackを追加します。HP_MaxはPlayerのHPバー用とステータスを持ってるアクターのHP初期化用に使います。

EnemyとPlayerのBeginPlayにステータスを初期化する処理を加えます。同じ処理なのでEnemyのスクショだけですが、これもマクロライブラリーにまとめたほうがよさそうですね。
HPの初期化

HPのダメージ処理部分も構造体に要素が増えたため修正を行います。HP_MaxやAttackの値をきちんと引き継ぐようにしました。
CalcDamage.png

PlayerとEnemyなどのAddDamageのDamage部分にST_Statusの攻撃力を与えるようにして、ダメージ処理関係は一通り完成です。

制限時間のほうに移ります。こちらはゲームインスタンスに制限時間をもたせ、計算できるようにしました。
GameInstance.png

BP_GameModeでこれを呼ぶ関数を実装しています。時間切れだったらResult画面へ移行するようになっています。
CalcLimitTime.png

この関数は実際にはウィジェットのTickEventで呼ばれています。戻り値はWG_Mainの変数であるLimitTimeに設定するようにしています。
WG_Mainのイベントグラフ

制限時間ですが、00:00というフォーマットで表示するために多少手間をかけています。他にやりようが思いつかないので、知っている人は教えていただけると助かります。

まず、デザイナで作った制限時間用のテキストウィジェットに設定する関数です。これはテキストウィジェットの詳細パネルのTextからバインドする関数を作成することで宣言できます。別にこちらのイベントグラフで作ってデザイナの方でバインドしても問題ありません。
getLimitTimeText.png

分と秒に分けるマクロはそれぞれこんな感じです。floatには100秒とかそういう値で入っているため、分に直さなければなりません。
getSecond.png
GetMinute.png

こちらで実際その値を、想定しているフォーマットに変換しています。実際の値が10未満なら数字は一桁部分にしか存在しないことになるため、その数字の前に0を付け足すようにしています。
checkDigit.png

HPの方は単純明快にプレイヤーから取ってきて、パーセントに変換してプログレスバーに反映しています。
getHealth.png
HealthPercent.png

実際の画面はこんな感じになります。

gamenn.png


UE4ゲーム制作入門二十二日目

一人UE4ゲーム制作入門アドベントカレンダー二十二日目です。

今回はサウンド周りです。ただ再生してるだけですけど。

まず、音素材自体を持ってこなければいけません。魔王魂とか煉獄庭園とか色々ありますが、今回は楽(?)さを考えて、UnrealEngine4内で入手します。

といってもまともに見たアセットは少ないので、カウチナイトとランドスケープのプロジェクトから持ってきました。

カウチナイトからはFootStepやらStab_Toneなどを、ランドスケープからはBGMを持ってきました。

再生方法としてはPlaySound関連でやります。効果音にはPlaySoundAtLocationを、BGMにはAudioComponentを使えばなんかそれっぽくなります。

効果音用にSceneComponentを作りました。ブループリントクラス作成から作れます。単純に関数を呼ぶと、そのコンポーネントに設定した音が、その位置から鳴るようになります。
PlayOneShot.png

BGMはそれ用にアクターを作りました。AudioComponentをつけて、ランドスケープのBGMを設定しているだけです。もし、ステージごとに切り替えたいなら列挙体などで曲を指定できるようにして、任意のタイミングでその列挙体に応じた音素材に切り替わるようにするとよいでしょう。
おそらくゲームモードでも問題はありません。
BP_BGM.png

基本的にはこの2つがすべてです。

ライフルや弾にコンポーネントをくっつけて、それぞれ発射時と着弾時に音がなるように設定します。
BP_Rifle_20161222022651654.png
発射時に音がなる
BP_Shot.png

あとは歩いてるとき用のもつけましょう。スピードを取得したいので、プレイヤーに実装します。
isSpeed.png

ステージがゲームで、移動中に鳴り続けます。スピードが一定以上なら移動中扱いにします。
移動

移動や攻撃はアニメーションがあるならアニメーション通知をつけて、通知イベントごとにならせたい音を決めると楽です。今回は移動がいっぱいで設定がめんどうなのと、攻撃アニメーションがないため、こんな感じに実装しました。

今回はこんな感じ。個人的には歩きの音は別のがいいかなって思いますが、音がつくだけでだいぶゲームっぽい感じを受けると思います。

UE4ゲーム制作入門二十一日目

一人UE4ゲーム制作入門アドベントカレンダー二十一日目です。

死亡アニメーションをロボとボスにつけました。ロボの方は物理アセットアニメーションを用意しました。

ロボのスケルタルメッシュを右クリックして物理アセットを作成とアタッチします。

物理アセットを始めに開くとコリジョンがどれもこれも重なって大変なことになってたので、消したり小さくした結果がこれです。基本的にはBodiesで拡縮と位置を調整しました。
ちなみにこれはそんなに調整がうまくいってませんが、ロボットなのでぶっ壊れ方が多少派手でも問題ないだろうと思いそのままGOしました。
物理アセット1
物理アセット2

ボスの方は、単純なアニメーションです。アニメーションの名前から察するに気絶状態ですが、いい感じに倒した感がでたので使いました。
単純に死亡状態を列挙体に追加して、Trueなら死亡アニメーションに遷移するように変えました。
アニメーションボス

きちんと死んだときに遷移するようステータスを更新します。
ボスブループリント

できたのがこれです。

UE4ゲーム制作入門二十日目

一人UE4ゲーム制作入門アドベントカレンダー二十日目です。

今回は弾がヒットしたときのパーティクルです。

使うマテリアルの一つは便利なStarterContentに入ってるm_flare01です。もう一つはマテリアル関数で作ります。
こんな感じに組むと円形になります。
Mat_FuncCircle2.png

そんでもってこうやってやると、円形の輪郭がとれます。
M_Hit.png

すみません。中身は殆ど理解できてないので丸パクリです。ここから引用させていただきました。
http://qiita.com/nkdtr/items/e6cf18160a5f3ff2fd18

次はこのマテリアルを使って、パーティクルをいじります。
左のパーティクルはこんな感じのぽわって感じのやつです。単純に色を青っぽくして開始時に一回だけパーティクルを生成します。
P_Hit1.png

方法としては、まずはRateを0にします。1秒間に生成するパーティクルの数を表しています。今回のは発生時一回のみなので時間単位での生成は必要ないので0に設定しています。
P_HitRate.png

こちらはBurstを設定しています。これは生成からTime秒後にCount分のパーティクルを生成する設定です。
P_HitBurst.png

SizeByLifeです。時間ごとに大きさを変えてます。InitialColorもそうですが、このへんは好みとかで変えてください。
P_HitSize.png

LifeTimeは0.2秒です。ヒット時なんで即消します。
P_HitLifeTime.png

二つ目。あの円形輪郭のマテリアルです。ぶっちゃけ、パラメータとしてはサイズを一回り一つ目のパーティクルよりも大きくしているだけなので割愛します。この辺も割りと好みの問題です。
P_HitRing.png

3つ目です。なんかまわりにぱーっと広がってるやつです。これはRequiredでのScreenAlignmentをPSAVelocityにします。これをセットすると進行方向に伸びる(らしい)
P_HitThird.png

Sphereで球体状の中で生成するようにします。Locationのなかにあります。
P_HitShpere.png

基本的には公式のリファレンスなどで学びましょう。あと、UnityのShurikenもパラメータの値は参考にできるのでそちらも見てみるといいと思います。
今回はこのブログの記事を一部参考にしました。
http://cascade-memo-atm.hatenadiary.jp/entry/2016/05/30/152650

理解していたらもっと詳しく説明したかったのですが、割りとなんとなくでやっているためこのくらいが限界です。ちなみにきちんと動いてるとこうなります。

UE4ゲーム制作入門十九日目

一人UE4ゲーム制作入門アドベントカレンダー十九日目です。

昨日の続きで、ボスAIの中身です。

攻撃開始時
攻撃開始タスクから呼び出してるAnimStartでは、更にBP_EnemyBossのSetAnimState関数を呼び出して、引数を渡しています。
AnimStart.png

さらに、呼ばれている関数ですが、アニメーションブループリントのアニメーション管理用の変数にセットしています。この変数が変わるとアニメーションが切り替わるように設定しています。
ANimStartBoss.png

アニメーションの通知イベントごとにAI側で作った関数を呼んでます。アニメーションスタートだけ今のとこやることがないのと、別のに変えてしまったので放置してる状態です。
ABP_Bossのイベント関連

AttackStartから行きます。AIの関数を呼んでいますが、これもBP_EnemyBossの関数を呼んでいるだけなので、そっちは飛ばします。
BP_EnemyBossの方では、攻撃用のコリジョンを有効にしたりしてます。遠距離攻撃ではBP_Weaponのほうで更に処理を行いますが、未実装です。
AttackStart関数

AttackEndでは攻撃判定やフラグを消したり折ったりしています。
AttackEnd関数1
AttackEnd関数2

次はAnimEndです。こちらは多少変なことになってますが、開始時にエラーメッセージを吐かれたので、変数に設定ができていなくてアクセスできないならば、もう一回コントロールしているBP_EnemyBossをキャストして取得してやり直しています。
その後に、今のアニメーションの状態が待機モーションであるなら攻撃開始フラグを、そうでないなら攻撃をしていたはずなので、次のアニメーションに待機モーションへと移行し、次の攻撃をセットするフラグを立てています。
AnimENd.png

プロフィール

shiratori00

Author:shiratori00
ゲームプログラミング頑張って勉強中です。

最新記事
最新コメント
月別アーカイブ
カテゴリ
Twitter on FC2
カウンター
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。