一定時間で消えるコンボ数を表示【UE5】
実行環境
・UE5 5.1.1
やりたいこと・要件
・攻撃ヒット数を画面表示させたい。
・攻撃しない状態が一定時間続いたら、コンボ数表示を消したい。
(=コンボ攻撃が続いていれば表示し続ける)
実装
UIを作成
今回は画面右上にテキストボックスを2つ配置。
コンボ数表示する方には、GetTextというバインドを追加しました。
バインド内容はただただ戻り値のテキストをScoreTextという変数に昇格しただけ。
一定時間内の攻撃ヒット数をカウントアップ、画面表示する
メインロジックの部分です。レベルBP側に実装する方法もありそうでしたが、BP_Playerのアクタをレベル上に配置していない(プレイ開始時にスポーン)からか、上手くいきませんでしたので今回はプレイヤーBPの方に実装しました。
まずはカスタムイベント「DisplayCombo」を用意。中身は大体こんな感じ。
・初回ヒットの場合だったら、コンボ数表示UIを作成してadd to viewport
その後コンボ数+1にカウントアップ
・2回目以降は一旦Widgetを消して、再度上記処理を繰り返す。
・処理開始時には、タイマーを3.0秒間セット。時間になったらUI消してコンボ数をDefault値に初期化。
初学者的には、赤枠の「ウィジェットを作成」のReturn Valueから変数(UI)に昇格
→WidgetBPからコンボカウント数を取得して、カウントアップ
しているところがわかりやすいなと思いました。参考動画のおかげです。
途中呼び出されているSetComboScoreイベントは、ただPlayerBPから受け取ったインプットScoreをWidgetBP側で、score(Integer型)→ScoreText(Text型)に変換しているだけです。
最終的にはこんな感じ
攻撃が一定時間続いている間のみ、コンボ数をカウントして右上UIに表示させることができました。ものすごくシンプルですが。
参考リンク
「UE5 コンボ数表示」で検索して色々なリンクを漂流しましたが、
最終的には猫でも分かる動画に落ち着きました(最初に観ておけばよかった。。。!!)
ありがとうございます。
猫でも分かる UE4を使ったゲーム開発 超初級編 #7 UMGを使ってスコアなどのUIを画面に表示してみよう! - YouTube
イベントディスパッチャーの使い方【UE5】
EventDispatcherを理解する!
今回参考にさせていただいた動画です。↓
【UE4/UE5ゲーム制作講座】超基礎編・これを見ればイベントディスパッチャーがわかる! - YouTube
【できること】
・キャラクターが別のアクタにオーバーラップしたら、イベントをレベルBPから起動する。とか、「誰が何かをしたら、何かを起動させてアクションを実行させる」みたいな感じのことができる。
・下手に相手の参照を追加する形で組むとBP間の依存関係ができてしまうが、EventDispatcherだと依存関係ができずクリーンにイベントを起こせる。
(ロードすると依存関係にあるBPもロードされる→処理が重くなる??)
つまり、影響起こす側と起こされる側がお互い知らない相手同士でも、問題なく相互作用させることができる!!みたいなイメージに捉えました。EventDispatcherが介在している感じ。
【こう組んだら大体できる】
・何かイベントを起こしたい側への設定(Trigger、発生源)
・何に対してイベントを実行するか、実行対象(イベントDispatcher受け取り側)
カスタムイベントにアクション関数を追加。
・レベルBP側の処理内容
①レベル上に配置したアクタ(イベントで影響を与えたい側)をレベルBPに置く。
選択した状態でドラッグドロップすればOK。
②Create Eventでイベントを作成。署名に実行したい関数名を指定。
最初、トリガーObject側で作成したEventDispatcherに対してイベントをバインドする。
→これで、EventDispatcherを呼び出した際にバインドされたイベント(今回でいうとJump)も同時に実行される。
今回結び付けているレベルBP側は、もともと配置されているプレイヤー側とトリガー側のどちらの参照も持っているため問題なし。
【UE4】BGMと効果音の付け方
BGMと効果音
<学習した語句の意味>
・パンニング, panning
ステレオ化された音声が、位置情報とともに耳に聞こえてくること。右で発生した音声は右から聞こえて、左から発生した音声は左から聞こえる、といったように音を左右に配置することで音声の位置情報が空間的に認識できるようにすること。
・減衰, Attenuation
音源との距離や大気、遮蔽物によって、プレイヤーの耳に聞こえてくる音声が小さくなる。
→多くのゲームエンジンではこのパンニングや減衰を自動で処理する3Dサウンドの概念を取り入れて、音源を3D空間座標付き(Spatialize)で演奏できるようにしている。つまり、UE4でも音源を正しい座標に配置するだけで、パンニングや減衰を自動で計算してくれる。
・大元の波形の音声データをサウンドウェーブ、そのサウンドウェーブをどう再生するのか手続きを記述したものがサウンドキューといわれる。複数のサウンドウェーブ(音源)を交互に組み合わせたり、ループ再生したり、いわゆる編集作業ができる。
1) 新規作成したサウンドキューの編集画面で、[Sound class]を[SFX]に指定する
2) Wave PlayerのLoopingをオンにする
3) [出力値]ノードの[Attenuation(減衰)] > [Override Attenuation(減衰設定の上書き)]をオンにする
4) グレーアウトされていた[Attenuation Overrides]の設定が有効化して、自動で減衰とSpatialize(空間座標付き)の両方にチェックが入っている→そのため、3Dサウンドとしてこのまますぐ配置できる!
5) 環境音の対象となるものをマップ上に配置して、サウンドキューを配置(この場合、[Ambient Sound(環境音)アクタ]として配置される)
減衰設定のアセット化
毎回、音源ごとに減衰設定すると面倒なので、典型的な減衰具合をテンプレとして保存しておけるという便利さ!
1) [Audio]フォルダに[サウンド] > [サウンド減衰]で新規のアセットを作成する
2) 距離による減衰のアルゴリズムをAttenuation Logarithmicに設定、半径とFalloff Distanceをそれぞれ設定する
3) 対象のサウンドキューに設定した減衰設定を割り当てる
サウンドの減衰 | Unreal Engine Documentation
ランダムノードで交互に足音を鳴らす方法
高頻度でゲーム中に発音されるサウンドは、単一のサウンドしかないと単調さが出てしまいチープになる。よって、2種類の音声データを用意して、サウンドキューでランダムに鳴らし分けるだけでもそれっぽさが出る。
2種類のサウンドウェーブを用意して、[Random]ノードに入力する。また、その後に[Modulator]ノードで音量とピッチにランダム変化をつけて出力する。
ゲーム中にサウンドキューを組み込む
サウンドキューをレベルマップ上に組み込むには、いくつか方法があります。
<方法①> キャラクター死亡時のジングル
ブループリントを用いて 、Any Damageのシーケンスノードに接続した[Activate]の先に[Play Sound at Location]ノードをつける。
このPNGameModeへのキャスティングで気づいたんですが、キャスティングは対象のタブを開いているときしかユーティリティ欄にノードの候補として表示されないんですね、、初めて気づきました。
<方法②> かがり火に音声をつける
アクタのクラスブループリントを開き、Audioコンポーネントを新規追加してアクタに配置する。このAudioコンポーネントの詳細設定で、サウンドキューを割り当て、サウンド減衰も先ほど作成した減衰アセットを割り当てる。
<方法③> 走りアニメーションにサウンドキューをつける
中央下のアニメーション通知画面で、左右の足が着地するときにサウンドキューを仕込む。右クリックで[通知を追加]からサウンドを追加して、右上の詳細設定でサウンド、どのボーンから音を出すかを設定するのみ。意外と簡単でわかりやすい!
【UE4】パーティクルシステムの作成
パーティクルシステムの導入
・パーティクルシステムとは
ポリゴンの板に描いた絵(スプライト)やメッシュを、粒子(particle)に見立てて空間に放出するビジュアルエフェクトの一種。
スプライト:2Dゲームで動くキャラクターを動作させるために、背景の上で動くセル画の部分に相当する。
参考 http://smilebasic.com/academy/sprite/
・パーティクルはエミッタという放出器から放出されているが、パーティクルシステムの編集をする際にはこのエミッタの設定などを変更して行う。
一つのエミッタは1種類のパーティクルを放出する、よってパーティクルシステムの中に複数のエミッタを混合したり、同じパーティクルを違う動きで飛ばすことで個性を表現できる。
・エミッタのデザインは、構成部品であるモジュールを新規追加・削除したりして行う。モジュール名の右横マークは、チェックがモジュールの有効無効化、波形が値の時間変化を設定するカーブエディタの編集ができるようになるマーク。
1. パーティクル用のマテリアルを新規作成する。
付録ファイルよりインポートしたテクスチャを割り当てて、Texture SampleノードとParticle Colorノードを組み合わせてエミッシブカラーとオパシティに接続する。
2. パーティクルシステムを作成し、見た目や放出時間などを設定する
必要に応じて右クリックで新規モジュールを作成し(下図)、パーティクルの詳細な発生設定を行う。
主なモジュールは以下
Required:見た目の変更方法(テクスチャの割当)と描画ソートの変更方法
Spawn:パーティクル生成量と頻度
Location:パーティクル生成位置
Lifetime:パーティクル生成して消滅するまでの時間
Velocity:パーティクルが放出する速度、方向
Acceleration:放出後の加速
Size:パーティクルの初期サイズ、サイズ変化
Color:パーティクルの色変化
[Distribution]で値を設定する際に、3種類の指定方法がある。
固定の定数値を指定できる=Distribution Vector Constant
範囲内でランダム指定できる=Distribution Vector Uniform
時間で変化させる指定ができる=Distribution Vector Curve
3. パーティクルシステムを実際のマップに組み込み、処理を記述する
例えば、コイン取得時の星型パーティクルシステムの場合、コインアクタのブループリント編集エディタに移動し[OnComponentBeginOverlap]ノードの処理に追記する。
[destroy actor]ノードから[Spawn Emitter at Location]でPSをスポーンさせるようにする。(下図)
【スケルタルメッシュのインポート、キャラの組み込み手順】
【スケルタルメッシュのインポート】
①テクスチャをインポートする
②右クリックでマテリアルを作成し、別ファイルに分別整理する
③スケルタルメッシュをクリックして、ペルソナアニメーションエディターを開く
コンテンツブラウザで対象のマテリアルを選択したまま、別タブのペルソナエディタに移動するーメッシュの詳細からエレメント(部分構造)のすべてにマテリアルを割り当てる
ここの割り当てが非常に便利ですね
④PNPlayerPawnのブループリントエディタ画面を開き、詳細の[Mesh]>[Skeletal Mesh]に対して、スケルタルメッシュを割り当てる。
⑤[Mesh]コンポーネントの相対位置を足が底になるように修正、回転(向き)もキャラ正面をさす水色とY軸を揃える。
【感想・課題】
・手順順序がやや複雑になってきたため、やっぱり慣れの部分が大きいと感じた。ファイル参照や割り当てなど、直感的に分かりやすい操作感のおかげで、今のところすんなりいけています。
・ただ語句の意味が曖昧なまま進めていると、逐一操作の目的もわからずに放置してしまいがちになるので、わかる範囲で語句理解も進めていく。
【学んだ語句】
・ストレーフィング
キャラクターの正面と進行方向が一致していない、滑るように平行移動するような動き方。原因として、キャラの向きはPawnの回転値で決まるが、移動を制御するPlayerControllerがプレイヤーのエイミングを決めているために向きが不一致になるため。
その解決策として、まずPNPlayerPawn(キャラクターのアクタ)のコンポーネントパネルから[Use Controller Rotation Yaw]のチェックを外す。その後、キャラの移動処理を担う[Character Movement]コンポーネントの詳細欄から、[Orient Rotation to Movement]にチェックをつけて、移動方向へと体を向けるように設定する。
・スケルタルメッシュとスタティックメッシュ
Autodesk maya外部などの外部モデリングツールで作成したキャラモデルには、関節(=骨、ボーン)がないスタティックメッシュと関節があって細かい動きを出せるスケルタルメッシュがある。
【初投稿】UE4の学習始めました
初投稿です!UE4を使ってゲーム制作を最近始めました
その過程で学んだ内容や疑問について毎日投稿できればと思います
ちなみに、現在参考にしている教材は、「極め本」と言われている?こちらの書籍を参考にしてゲーム制作をしています。”極め本”と検索したらトップに出てきました、、そんなに著名な参考書なんですね、、、
始めてから数日経ってからのブログ投稿開始なので、かなり途中からの内容を投稿し始めることになると思いますが、学習内容の定着を目的に気楽にやっていきます
それでは、よろしくお願いいたします。