投稿記事

わんころのUE5勉強会 2023/04/12 22:21

【UE5】MetaSoundで同時に鳴らす音を制限する

効果音を鳴らす際、複数の効果音を同時に鳴らすと音が重なり、数によっては音割れや爆音が発生することがあります。

例えば敵Actor を撃破した時に「Play Sound 2D」を使って撃破時の効果音を鳴らしたとします。

1体の敵であればただ効果音が鳴るだけですが、30体の敵が存在し、必殺技などで同時に撃破した場合、「Play Sound 2D」が(多分)30回呼ばれ結果的に効果音が沢山重なって凄い音が鳴ります。


今回は MetaSound を使い、最大で発生する音の数を制限する方法を記事にしてみました。

MetaSound を利用する前に


MetaSound を利用するためにはプラグインを有効にする必要があります。

メニューバー「編集」>「プラグイン」を開き、MetaSound を有効にします(プロジェクトの再起動が促されるので再起動も行います)

※ 本記事を執筆時点では MetaSound は Beta 版となってますのでご注意下さい ※

MetaSoundソースを作成


次にコンテンツブラウザで右クリックし「サウンド」>「MetaSoundソース」を選択します。

「MetaSounds」>「メタサウンド」

「サウンド」の中に別途「MetaSounds」というカテゴリがあります。そこから「メタサウンド」というものが作成できますが「MetaSoundソース」とは役割が違います。

「メタサウンド」の方はオーディオソースとしての入出力(In/Out)は存在しません。

代わりにグラフとしての入出力が提供されており、MetaSound 版の関数のような役割になっています。

例えば音にある効果を掛ける処理を「メタサウンド」で作っておき、実際に「MetaSoundソース」で利用する時にグラフ上へドラッグすると追加することができるため、処理を使いまわすような使い方が可能になってます。(マテリアル関数と同じような扱いかなと思いました)


音を鳴らす最大数を直に設定する

先程作成した「MetaSoundソース」を開き、画面上部の「ソース」をクリックします。

「ボイス管理」>「Concurrency」まで展開し "Override Concurrency" のチェックを入れます。

そうすると "Concurrency Overrides" が編集できるようになります。
ここにある最大数を設定すると音を同時に鳴らす数を制限できるようです。

この方法はその「MetaSoundソース」のみ適用されるので、他の「MetaSoundソース」と設定を共有したい場合は、サウンドの並列処理というアセットを作成することで対応可能です。


サウンドの並列処理

サウンドの並列処理(Sound Concurrency)に関しての公式ドキュメントはこちらです。

サウンド並列処理のリファレンス ガイド


コンテンツブラウザで右クリック>「サウンド」>「サウンド並列処理」をクリックし、適当な名前を付けてこれを開きます。


このアセット開くと先程の "Concurrency Overrides" の項目がアセット化されていることが確認できます。

プロジェクト全体でこの「サウンド並列処理」をデフォルトにしておく設定も可能です。(上記公式ページの「サウンド並列処理アセットを設定する」をご確認下さい)

サウンドの並列処理をMetaSoundソースにセットする


「MetaSoundソース」に戻り、「ボイス管理」>「Concurrency」まで展開し "Override Concurrency" のチェックを外した状態にすると "Concurrency Set" の [+] ボタンがクリックできます。

ここに先程作成した「サウンド並列処理」をセットすればOKです。
(ファイル名は Sound Concurrency の頭文字で SC_ をプリフィックスでつけてます)

この設定だけアセット化されているので他の「MetaSoundソース」でも同じアセットを使いまわすことも可能になりました。
その他の細かいプロパティの説明も公式サイトに記載されております。

おまけ:サウンドキュー


サウンドキューにも同じ設定があるので同じように設定可能です。

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

わんころのUE5勉強会 2023/04/10 20:34

【UE5】別Widgetを「Add Child」した後、その子Widgetを使いたい

忘れそうなので覚書きです。

はじめに

直前が切れていますが「For Each Loop」を利用し、Scroll Box へ自分で作った WidgetB(子Widget)を「Add Child」していく画像です。

複数の WidgetB が Scroll Box 内に含まれます。

その追加した WidgetB 個別の関数や変数へアクセスしたい時にどうすればいいのかよく分かりませんでした。



Scroll Box から「Get Child...」で調べるといくつかヒットしました。

「Get Children Count」

追加されている子Widget の数を取得できます。
子Widget 分ループする場合、そのまま利用すると配列の範囲外へアクセスしてしまうため -1 する必要があります。

「Get Child At」

指定したインデックスの子Widget を取得できます。
欲しい子Widget はどうやって判断すればいいのか一応確認してみました。

「Add Child」した順番に画面も並んでたので心配する必要はなさそうでしたが、「Add Child」した順番で配列[0]から入ってそうでした。

「Cast To WidgetB」

この後、WidgetB へキャストしてアクセスできました。

まだ未確認ですが、ターゲットが指定できるのなら Blueprint Interface を利用できそうです。


「Blueprint Interface」を利用してみる


適当な Blueprint Interface を作成し、WidgetB に適当な変数を「Print String」するだけの実装を行いました。

結果はそれぞれの変数の値が出力されました。
あとは WidgetB に配置した「On なんとか」系のイベントが実行されたかを WidgetA 側で判断出来たら色々便利そうな気がしなくもないんですが、これも確認出来たら追記しようと思います。


イベントディスパッチャを使う(2023-04-11追記)

前述の WidgetA で「Add Child」した WidgetB に「Onなんとか」系のイベントがあった場合、それが実行されたかを親で知ることができないかなと思い Twitter に書いたところとても丁寧にご回答頂けました!

https://twitter.com/NelisLuna/status/1645449379397111810

まさにこの通りの実装で実現が可能でした。
ネリスさん、本当にありがとうございます!!
今後絶対使うテクニックですね!!




あまり使ったことがなかったため、バインドするイベントはカスタムイベントを作成してバインドしないと駄目なんだと思ってました。

そのため、関数内でのバインドに利用できないと勝手に思い込んでたのですが、バインドするイベントから引っ張ると「Create Event」というものがあり、更に "一致する関数の作成" を選択すると、その関数をバインドすることも可能でした。

これで通知するための手段が増えたので嬉しいですね~~!

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

わんころのUE5勉強会 2023/03/29 21:50

【UE5】Splineを使って Instanced StaticMesh を配置する

YouTube からのお勧めは関連ない動画ばかり出てきて好きではないんですが、最近ちょくちょくいいお勧めが上がってきているのが嬉しいです。

本日は Spline に沿ったメッシュ配置ツールが上がってきました。
Spline でのメッシュ配置は以前アンリアルクエストの動画を参考に作成させてもらったんですが、その動画では (確か)StaticMesh の配置でした。

去年 UE5 を始めてまだ間もない時で、こんなことできるんだ!すごい!と思いながら丸パクリしましたね!

基本的な用語なども全然知らない時に触ったのを今でも覚えています。

参考動画

前置きはそんな所で今回お勧めされた YouTube の動画から。
https://www.youtube.com/watch?v=OdjvlvGRYRE&t=633s

こちらの動画は Instanced StaticMesh を Spline で配置するというものです。ツールの作成は動画と同じなので割愛しますが Instanced StaticMesh にするメリットがどうあるのか少し確認しました。

以降、Instanced StaticMesh を ISM、StaticMesh を SM と表記しています。



ISM Component を追加し、マウスオーバーすると表示される説明には同一 SM を複数描画する時に効率よく描画できることが記載されています。

StaticMesh を配置する

動画では ISM を配置するツールになっていますが、SM を配置するように変更し、画像のように1つだけ描画している状態にしました。


Mesh draw calls を確認し、Average が大体34~35の間に落ち着きました。


Spline のツールを使い、メッシュを4つ並べた画像です。
Mesh draw calls の Average が大体38~39の間に落ち着きました。
メッシュが増えたので Draw Call が増えています。
(もっと配置するとそれに比例して上がっていきます)

Instanced StaticMesh を配置する

次は動画で作成した ISM を配置するもので、同じように1つだけ描画している状態にしました。


Mesh draw calls の Average が大体37~38の間で落ち着きました。


メッシュを5つ配置した状態です。
SM と違い Mesh draw calls の Average が大体37~38の間で同じ結果になっています。

沢山配置しても効率よく描画されていることが確認できます。
配置するメッシュのポリゴン数が多かったりするとさらに恩恵が大きくなりそうな気がします。


最後に

改めて Spline で配置するツールの勉強になりました。

ISM がどういうものかは Level Instance の Packed Level Actor などでお世話になっているので少しくらい理解していましたが、Spline で配置するのもこれでやる方が良さそうですね。

今日はそこまで元気がないので未確認ですが、SM で配置数が増えるとエディタ上の操作も比例して重たくなったりするのかなど気になる所があります。

ゲーム制作もあれこれ考えて作れるので楽しいんですが、こういう細かいサンプルを量産していくのもかなり楽しいので時間がすぐ溶けていきますね。

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

わんころのUE5勉強会 2023/03/27 21:43

【UE5】最近マテリアル系を触ってました

数日前、YouTube でコメントを頂き、雨のマテリアルを作成する動画を紹介して頂きました。ありがとうございます!

勝手ながら紹介させて頂きますが、Ben Cloward さんのこちらの動画です。
https://www.youtube.com/watch?v=fYGOZYST-oQ
Episode 13 ~ Episode 18 で雨の表現をするためのマテリアルを作成するチュートリアル動画となっています。

私はまだ Episode 17までしか確認出来てないため途中なのですが、動画の通り進めて一旦このようなマテリアルを作成出来ました。

Megascans の Surface から適当なマテリアルを取得し、上記の動画シリーズで作成したマテリアル関数をその中に組み込んでみた結果の動画です。

丸パクリしたものを入れただけですがもの凄いクオリティですね...
効果音などがあれば更に説得力のある表現になるんじゃないかと思います。
次の Episode18 でここまでのものを全部統合するような動画になってるそうなのでこの記事を書いてる間にさっさとやれよ!と思わなくもないです。

時間が出来た時に Episode18 を確認します。


動画の後半に青い波紋が広がるようなエフェクトも入れたのですが、これはまた雨のとは別のものです。

以前から興味のあった Blender を触りました。
と言っても基礎の基礎で、ビューポートの操作をほんの少し学び、エフェクトに使えそうなディスク形状のメッシュを作成しただけです。

UE5 で利用するためにマテリアルやテクスチャも必要だったので CLIP STUDIO を使って一つテクスチャを作成しました。

利用したブラシ:
火炎影ブラシ / Flame Silhouette Brush

超手軽に火の表現が可能な本当に素敵なブラシです!



マテリアルはこんな感じで割とシンプルですが、メッシュ外側の切れ目が目立つのでフェードアウトさせるとかした方がいいですね...

前回プロジェクトを新規にしたところからゲーム制作も再開したのでそちらも進捗があればこちらで報告していきます。


毎年花粉や鼻炎で年がら年中鼻水には尽きないのですが、今年は花粉がやばいのか目が痒いし鼻声が続く日が多くなりましたね。

ここ数日爆弾低気圧とやらで雨も続いて頭痛も酷いしなかなか辛いところです。

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

わんころのUE5勉強会 2023/03/20 23:01

【UE5】Enhanced Input:Player Bindable Input Config

2024-04-04 追記:
【注意】
この記事は UE5.3 で非推奨な機能となっており、Enhanced Input User Settings を使うよう記載がございました。
しかし、Experimental な機能も含まれていたため今後変わるかもしれません。



またまた Enhanced Input です。

今回の記事では Enhanced Input のプラグインが有効になっているとコンテンツフォルダで右クリック> 入力(Input)に出てくる Player Bindable Input Config(UE5.1 だとPlayer Mappable Input Config) について見ていこうと思います。


https://youtu.be/aBI8n3Il0sg
このファイルを使ったキーコンフィグの実装例を動画にて作成しました。

始める前に

以降、日本語の説明がついているので UE5.1 で操作しますが UE5.0.x と違う部分が出るかもしれません。
また、ソースコードを見れるスキルはないため Blueprint での操作・お話を前提としております。


Player Bindable Input Config / Player Mappable Input Config の名前について

※注:UE5.3 で非推奨な機能になっています。


UE5.0.x と UE5.1 で名前が若干違います。
(UE5.0.x では Bindable、UE5.1 では Mappable)

一応日本語用と英語用の名前も画像で載せましたが中身は同じです。

Enhanced Input を使う前の入力では「プロジェクト設定」> 「インプット」で軸マッピングやアクションマッピングという名前だったので、"マッピング" という名前の方がしっくりきますね。

UPlayerMappableInputConfig

このファイルは UPlayerMappableInputConfig になっていて色々中身を登録できるようになっています。

URL に PythonAPI と書いてますが使用できそうな関数や変数、簡単な説明が確認できます。

https://docs.unrealengine.com/5.0/en-US/PythonAPI/class/PlayerMappableInputConfig.html


関数の名前や説明、そしてこのファイルのポップアップからなんとなくキーコンフィグに使えそうな雰囲気があります。

Player Bindable Input Config / Player Mappable Input Config を作成

コンテンツブラウザで右クリック> 「入力(Input)」から「Player Bindable Input Config」または「Player Mappable Input Config」を作成可能です。


作成後、何もせずにすぐ保存するとエラーが発生します。

「有効なConfigNameがありません!」と分かりやすく書いてくれています。このファイルを開いてみます。


先頭の「ConfigName:None」を指しています。なんでもいいので任意の名前を付ければこのエラーは解消されます。


とりあえず中身をこのようにしてみました。

Config Name:この構成を識別するための一意の名前のようです。サフィックスに分かりやすく _ConfigName とつけてみました。

Config Display Name:この機能に限らず「Get Display Name」という関数を使い、デバッグ用途で画面出力を行い確認することも多いですが、恐らくこれもそういう用途ではないかと思います。サフィックスに分かりやすく _DisplayName とつけてみました。

▼「Get Display Name」
https://docs.unrealengine.com/5.1/en-US/BlueprintAPI/Utilities/GetDisplayName/

Is Deprecated:このファイルが非推奨かどうかをマークするために利用するフラグのようです。新しく作成して以前のものは非推奨にとかそういう用途なんでしょうか。

MetaData:ポップアップには「アイコン、アビリティ、アセットなど、キーマッピングに関連する他の項目を格納するために使用できるメタデータ」と書いてあります。必要な情報をプラスで紐づける時に利用するんだと思います。

Contexts:IMC の配列です。このファイルの利用用途が主にキーコンフィグを扱いやすくするためにデータをまとめるためなので、キーコンフィグに利用したい IMC を右の入力欄(Priority)とセットで登録します。

配列で複数登録できるので、今回はプレイヤーの基本移動と弾を発射する IMC をそれぞれ登録してみました。

ファイルの準備は一旦こんな感じでいきます。

変数の作成


"Player Mappable Input Config" 型の変数をオブジェクト参照で追加し、変数名はそれぞれの頭文字を取って PMIC としています。

初期値には先程作ったファイルを設定しています。

Get Config Name/Get Display Name

先程サフィックスにそれぞれ _ConfigName / _DisplayName と付けましたがそれが出力されていることが分かります。

Get Mapping Contexts


PMIC 内で登録した IMC の一覧を取得できます。

戻り値は、"Input Mapping Context" が Key
Priority である "Integer" が Value のマップになっています。


これは先程設定したこの画像の下にある IMC と Priority のセットが返ってきます。

必要なキーを取得するための設定

ゲームによってはキャラの移動やマウスのカメラ移動など、キーコンフィグにそもそも使用されないキーが出てくることがあります。

キーコンフィグで利用したいキーだけ自分で設定し、必要な情報だけ取れるようにする設定です。
PMIC はこれを目的で利用する事がメインになると思いますが、利用するために少し準備が必要です。


キーの割り当ては IMC 内で行いますが、そのキー1つ1つに "Is Player Mappable" というフラグが存在します。

このフラグを ON にし、"Player Mappable Options" の中にある "Name" に好きな名前を登録すれば準備完了です。

今回の例ではジャンプに利用するスペースバーと、ゲームパッドAボタンのみ設定しました。
(Name は None や空欄になっているとエラーが発生します)

Get Player Mappable Keys:必要なキーだけ取得


先に BP を載せておきます。

PMIC から「Get Player Mappable Keys」を呼びます。
戻り値は Enhanced Action Key Mapping 構造体の配列です。
Enhanced Input の入力設定が詰まった構造体です。

画像のように構造体ピンを分割すると、Triggers や Modifiers など見覚えのある情報が表示されると思います。

今回の例では、この中の Key から「Get Key Display Name」を使って割り当てたキーを表示するということをしてみました。

結果はこの画像の右上の通り、ジャンプに利用するスペースバーと、ゲームパッドAボタンが出力されました。

"Is Player Mappable" にチェックを入れて設定した情報のみが出力されることが分かりました。

この関数は、PMIC に登録さえできていれば「Add Mapping Context」で追加されていなくてもキーの情報が取得できる点が優れています。

ゲーム開始時には「Add Mapping Context」されていない IMC もキーコンフィグの対象になっている場合はこのファイルを使うと色々扱いやすいと思います。


Add Player Mappable Config(2024-04-04修正)

※注:UE5.3 で廃止され、この関数が利用出来なくなりました

書き忘れてたので追記。


「Add Mapping Context」では1つの IMC を追加できますが、この関数を使うことで複数の IMC を一気に追加することが可能です。

"Config" に「Player Bindable Input Config」または「Player Mappable Input Config」を指定するだけです。
(追加したい IMC と Priority はそれぞれアセット内で設定します)


キーコンフィグ以外の使い方になりますが、例えばゲーム開始時に追加する IMC が複数ある場合、このアセットに登録しておくことで「Add Player Mappable Config」を一回呼べば済むのでノードをすっきり出来るかもしれません。

ゲーム内で IMC を複数登録したり外したりを繰り返すような実装の場合は便利かもしれません。


最後に

最初このファイルの利用用途が分からなさすぎて、どういう使い方をするのかさっぱりでした。
色々検証している間に Is Player Mappable のフラグがここで絡んでたんだなと勉強になりました。

この情報を使えばキーコンフィグの処理をする際の準備も簡単に出来そうだなと思いました。

仕様変更に追いつけない...

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

5 6 7 8 9 10 11

記事のタグから探す

月別アーカイブ

限定特典から探す

記事を検索