スポンサーサイト

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

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

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

今日は細かい修正だけをしておきました。スクショは特に写すものもないんでないです。ごめんなさい

まず、現状フィールドを突き抜けていた弾をなんとかしました。blockAllDynamicにしてBeginOverlapからHitイベントに変更です。基本スタティックメッシュはBlockAllなので特に問題なくイベントが発生します。

次にボス。現状遠距離攻撃も単純に腕振ってるだけだったので、岩を投げるようにしました。岩のモデルはStarterContentの岩モデルです。

あとは敵の当たり判定が死亡アニメーション再生段階で残っている部分や実は前に走りながら撃つと弾が自機にヒットする不具合など、思ってたよりバグがいっぱいありました。

内容がとても薄いですが、以上で今回のアドベントカレンダーは終了になります。色々思うとこはありますが、後日に完走した感想でもブログに上げるつもりなので、そこで色々ぶちまけたいと思います。

約一ヶ月の長い間お付き合い頂きありがとうございました。
スポンサーサイト

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

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

今日はちょっとしたフィールドのギミックを実装しました。どんなのかというと、スイッチ的なあれで、弾が当たったら道があらわれるよくあるギミックです。

まずはスイッチとなる的のアクターを作ります。AnyDamgeイベントが発生したら今回なら橋を出現させるようにしています。
BP_Mato.png

出現する橋はこっちです。初期値ではNoCollisionとVisibleにfalseをセットしています。
BP_Hashi.png

それぞれにいい感じのStaticMeshを設定してマップに配置して、表示するための変数に設定してやるとおっけーです。

以上が今日(22時くらいから)の進捗になります。

一日の休みを寝てたりゲームしてたりでめちゃくちゃサボって過ごした結果です。最終日前日に燃え尽き気味・・・。明日は出勤キーンなのもやる気ゼロシステム発動に拍車をかけてる気がしますが。

ついに最終日なので、できることは悪あがきだけはしておこうと思います。それでは。

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

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

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

今日はボスのAIを組みました。

全体はこんな感じです。
ボスのビヘイビアツリー

BTTask_CheckFlg
このタスクではAIコントローラに作った2つのフラグをブラックボードに反映しています。
それぞれのフラグの説明ですが、
isAttack : 攻撃モーションに移れるかどうか
isNextAct : 次のアクションを決める処理に移れるかどうか
になっています。これらが別れてる理由はあるのですが、今日は実装できてないので平日のどこかで説明すると思います。

フラグの管理がなんだか面倒になってる理由ですが、アニメーションの開始終了イベントとかをAIで受けて、フラグを反映させる方法として、これとブラックボードの値を直接AI側から変える方法を思いついたのですが、個人的に初期化以外でブラックボードの値をビヘイビアツリーからいじりたくなかったのでこうなりました。
BTTask_CheckFlg.png

セレクターの下にいきます。こっちは次の行動を決めたり攻撃モーションへの移行を示してます。

左側から行きましょう。こちらは次の行動を決めるツリーなため、isNextActが真のときにのみ実行します。
ビヘイビアツリー2

BTTask_GetLengthToTarget
プレイヤーとの距離をブラックボードのLength変数に設定しています
BTTask_GetLengthToTarget.png

BTTask_SetNextAct
次の行動を決めています。攻撃前には一回しか決める必要がないため、次の行動が決まったらAIコントローラのisNextActにfalseを入れています。
これで、攻撃が終わるまでは実行されなくなります。
行動の振り分けですが、遠距離攻撃と近距離攻撃で分けています。距離に関しては未調整ですが、とりあえず400以下なら近距離攻撃、それより大きければ遠距離攻撃となってます。
BTTask_SetNextAct.png

攻撃側のツリーに移りましょう。といってもこっちはほとんど中身が同じなので、説明事項はほとんどないです。下手したらタスクを別々に作る必要ないです。試す時間が(遊んでたせいで)なかったので、平日のうちの課題としておきます。
ビヘイビアツリー3

こちらのツリーは攻撃可能を表すフラグが立っていたら実行します。

BTTask_LookAtPlayer
確か前にも説明しましたが、プレイヤーのほうにRotationを向けるだけです。

先程のisNextActで設定したボスの次の行動に応じて攻撃アニメーションを実行させるタスクに移ります。

攻撃系のタスク
AIコントローラにある、指定した状態のアニメーションを実行する関数を呼んでいるだけです。それぞれ与えてる引数が違うだけです。これ多分タスク統一できるので後で直します。
BTTask_AttackNear.png

時間がやばいので細かい説明は明日の記事に回します。後半になって息切れ気味になって本当に申し訳ないです・・・。

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

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

今回は簡単なパーティクルとボス部屋の改良です。名古ゲ部忘年会前にもっとすすめるつもりでしたが、寝てました。

ボス部屋ですが、適当にジオメトリで組み直して、屋内にしました。ライティングとかが微妙にひどいのでそのうちなんとかします。

ボス部屋改良

オーラぽいパーティクルをつくりました。かなりちゃっちいのは許してください。

カスケード一部
こんな感じです。マテリアルは1つ目がM_Sparkで、2つ目はM_Flare01ですが、ライティングしか使ってない気がするので必要ない気もします。
パラメータの説明は時間の都合上割愛します。今年のUnrealEngine4アドベントカレンダーの他の方が説明されてたりするので、そちらを見ていただくのがいいです!
http://unlimited-games.hatenablog.com/entry/2016/12/11/225112

ボスの足元に置くと、いい感じになります。
パーティクル

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

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

モンスターハウス的な感じのを作りました。なんか無駄に面倒な処理をしてる気がするので、もうちょっとスッキリさせてやりたい気はします。

敵ブループリントクラスを多少変える


死亡時に敵生成兼管理アクターを持っていた場合、死亡したときの処理を走らせて消えるようにしました。
BP_Enemy1.png

BP_Roboにはダメージ処理と死亡時処理をしていなかったことに気づいたので追加しました。
BP_Robo.png

ブループリントインターフェースを用意する
モンスターハウスが起動したり終わったりしたときに、異なるブループリントクラスすべてが何かしらの処理を行えるように、ブループリントインターフェースを用意します。
このブループリントインターフェースは宣言だけを持っていて、継承しているアクターそれぞれがイベントの中身を実装して、メッセージを受け取ったらそれを実行することになります。
これのいいところは、アクターの継承は必ず親が一つしか選べませんが、インターフェースは複数持たせられるので、必要なインターフェースを持って、色々な処理を異なるアクターで同時に実行できるようになることだと思っています。違ったらおしえてください。
BPI_Trap.png

モンスターハウスの起動と管理アクターを作成する
BP_SwitchActorという名前のブループリントクラスを作成します。Acotrクラスが親です。
塞ぐ出入り口を塞げる程度の大きさのBoxコリジョンとスタティックメッシュを用意します。イベントグラフはこんな感じ。Boxコリジョンを通り抜けた瞬間モンスターハウスを起動します。配列には今のところスポーンポイントをセットして、インターフェースのトラップ起動時のメッセージをそれぞれに送っています。
そして、敵が全滅したときなどにEnd時のメッセージが飛んで来るので、モンスターハウスをクリアしたことを、終わったときにイベントを実行したいアクターすべてに終了時イベントを知らせるメッセージを送っています。
BP_SwitchActor_eventGraph.png

スポーンポイントを作成する
このアクターはSwitchからモンスターハウス開始メッセージが飛んできたときに、生成するポイントに指定した敵を生成します。
ホントはロボとクマ両方出そうと思ったのですが、AIの都合上クマはエラーしか吐かないのでやめました。
BP_SpawnLocation_EventGraph.png

生成処理です。敵が生成に成功するたびに生成した数を増やします。これがゼロになったときに、Switchに全滅したことを知らせます。
BP_SpawnLocation_SpawnFunc.png

敵が死んだときには数を減らしていきます。ゼロ以下ならSwitchにメッセージを飛ばしています。
BP_SpawnLocation_DestroyFunc.png

完成

全部作成できたら、ステージ内に配置して、やるとだいたいこんな感じになると思います。
プロフィール

shiratori00

Author:shiratori00
フリーでソフトウェア開発者してます

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

この人とブロともになる

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