投稿記事

わんころのUE5勉強会 2022/12/14 12:00

自作ゲームの進捗01:食堂っぽい部屋を作成

自作ゲームの進捗報告です。

何個かの謎解きをメインにした脱出ゲームで、
ちょっとしたホラー要素を入れる予定です。

以前このようなクロックタワー系の視点で動画を公開しました。

メインは脱出ゲームなので 2D 視点だとちょっとやりにくかったので 3D にシフトしました。



その中で作成した部屋の1つで食卓をイメージした部屋です。
周りが殺風景なのでもう少しなんとかしようと思います。
3D にしたためマップの構成が難しくなりましたね...


謎解きっぽい雰囲気を出すための読み物演出です。
以前作ってたものをこちらのプロジェクトへ移行しました。

内部的な部分をメインに触っていたので見た目に新しい変化はあまりないですが一応。


Save/Load の仮組みを実装。
規模によりますが Auto Save 機能も一応入れようと思ってます。


イベントの進捗管理を Boolean 型の配列で管理していたのを
map<String, Boolean> に変更しました。
どのイベントとインデックスが紐づいているのか把握し辛かったためです。

これで指定のイベントが完了したかを容易に取れるようになりました。


Widget へ表示するテキストを Data Table から読み込み→ 表示としてましたが、最初に一括で読み込んで変数として持っておくように変更。

Data Table と連動もさせたかったので、
map<Name, Text> で作成し、Data Table の行(Row Name) と紐づけるようにしました。

これで Data Table の行の名前を引数で送るだけで
それに対応したテキストを Widget で表示できるようになりました。

特定のものを探して取得したい時は map が使いやすいですね。


  • インタラクト可能なオブジェクトの基本
  • 取得可能なアイテム系
  • 読み物系
  • イベント系

など、これ以降のプロジェクトでも利用できるように Blueprint の Base Class を作成。後は継承して量産していけば良さそうです。


もしかしたらイベントで変化させたりする可能性があるものを Data Layer を使って一応レイヤー分け。


お試しで Level Instance も用いて同じものを使いまわしてみるテスト。

World Partition は有効にしてますが Streaming するような規模でもないので今のところは Streaming なし。


そんな感じで今月に入ってから色々作業をしておりました。
ここまで勉強を続けてこれたおかげで色々な機能を利用できてるような気がします。

今年も残りわずかとなりましたが、変わらず UE5 の勉強も少しずつ行っていこと思っております。UE5 使ってもう8ヶ月経ったみたいです...早いですね...

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

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

わんころのUE5勉強会 2022/12/06 20:14

【UE5】【検証】World Partition レベルと通常レベルのBeginPlayについて

※ 本記事は検証したことをつらつら書いただけです。
※ なにかを解決できたわけではないのでご注意下さい。
※ UE5.0.3 で検証しております。


先日、取得したアイテムをセーブ&ロードするという動画をアップロードしました。
https://www.youtube.com/watch?v=gzuJjpxYPz4

その際World Partition を使ったレベルに対してこの方法で実装すると意図した挙動にならないというコメントを頂きました。


更にどううまく行かなかったのか具体的な検証方法もコメント頂けました(本当にありがとうございます!)


<準備>


メニューバー「ファイル」>「新規レベル」から "Open World" を選択し WPMap(World Partition Map の略) という名前をつけました。

"Open World" で作成すると World Partition の設定や Enable Streaming が自動で有効になります。

WPMap にアイテムを5つ配置しました。
この青い箱が BP_Box という名前のアイテムを想定しています。


WPMap のレベルBP に画像の処理を記載します。
ゲームスタート時 BP_Box をすべて消すという処理です。

<検証頂いた内容>
WPMap からゲームスタートすると BP_Box はすべて削除されるが、別レベルへ移動して WPMap に戻ってくるとアイテムが削除されない。

更に World Partition を有効にしていない通常のレベルであれば問題がなかったという検証内容でした。

要するに WPMap のレベルBP が二回目以降機能しなかったということになりそうです。


このコメントを受けて私も検証させて頂きました。


分かりやすくするため画面上に削除されたアイテム数を表示しています。
WPMap からスタートすると BP_Box は全て削除されていますが、もう一度 WPMap に戻ったら確かに消えていません。

続いて次の検証してみます。



今度はデフォルトの ThirdPersonMap からスタートし、WPMap へ移動するというものですが、BP_Box は削除されていないことが分かります。

しかし WPMap のレベルBP に書いた「削除したアイテムは0個です」という表示は出ているため、レベルBP は実行されている事もわかります。

もう一つ検証してみます。



メニューバー「ファイル」>「新規レベル」から "Basic" を選択し NMMap(Normal Map の略) という名前をつけました。

"Basic" で作成すると通常のレベルになります。
World Partition との違いを確認するため用意しました。

NMMap にも同じく BP_Box を置いてあります。
レベルBP にも上記と同じ「Destroy Actor」する処理も記載してます。



NMMap からスタートすると BP_Box は削除されています。

ThirdPerson Map へ移動し、NMMap に戻ってくるという動きを何度か行ったところ、正しく削除されていることが分かります。


この内容から World Partition からスタートした場合と、別のレベルから World Partition のマップに移動した場合で挙動が違うということが分かります。

通常のレベルでは問題がなかったというのは
別レベルから通常のレベルに戻ってきても問題はなかったということになります。

マップの移動には「Open Level(by Name)」や「Open Level(by Object Reference)」を使用しています。



少し話は逸れますが World Partition にある機能の一つで Enable Streaming があります。

メニューバー「ウインドウ」>「ワールドセッティング」で確認できるプロパティです。

オープンワールドのような広大なマップを想定するとほとんどの場合、遠い場所にあるものをロードしておく必要はないため、設定した範囲外のものはロードさせないようにできる凄い機能のことです。
(余分なリソースを使わないようにできる)

次はこの Streaming に注目した検証を行いました。


先程の検証で WPMap からスタートすると BP_Box は全て削除されました。

実はこのスタートした場所は Streaming の機能でアイテムがロードされる距離でスタートしていました。

そうなると次の疑問は、Streaming の範囲外からスタートした場合はどうなのかです。



WPMap からスタートしましたが、削除されたアイテムは0個と表示されたことが確認できました。

そして少し近づくと Streaming の機能が働き BP_Box がロードされたという結果になりました。

Streaming でアンロードされている状態の BP_Box は「Get All Actors Of Class」で取得できなかったということになります。


「アウトライナ」パネルを確認すると、アンロードではレベル上に存在せず、ロード状態で初めて表示(インスタンス化されてる?)ような挙動をしています。


アクタ個別の「詳細」パネル> ワールドパーティションという項目に "Is Spatially Loaded" の設定があり、チェックを外すと一応この問題は解決されます。


"Is Spatially Loaded" にマウスオーバーするとこのような表記が出ます。
True の場合は Streaming の範囲内であることも条件に含まれていることが分かります。

チェックを外すと Streaming の範囲外でもロードするという設定になるため、数が多かったりロードする容量が多いと場合によっては微妙かもしれません。


※注)ここから先は検証方法があってるのか分からないので頓珍漢なことを言ってる可能性があります。


ポップアップには (1)DataLayer にないこと、(2)複数の DataLayer が有効になっている場合ということも条件に含まれています。

DataLayer とは、例えばレベル上に配置したアクタをレイヤー分けし、ロードやアンロードを好きなタイミングで実行することができるこれまた凄い機能のことです。

お絵かきソフトにあるレイヤーと同じような扱いと考えると分かりやすいかもしれません。

例えば、同じ街でも物語の序盤と中盤で見た目が変わるような作りにすることができます。
1つ目のレイヤーに綺麗な街並みを、2つ目のレイヤーに荒廃した街並みと分けることでロードすべき DataLayer を好きなように切り替えれます。

しかも DataLayer は実行時(ランタイム)以外にも
エディタ操作の設定も扱うことができるのでとてもいい機能だと思います。


5つ全ての BP_Box に "Is Spatially Loaded" を OFF(False) に設定しました。

まず「(1)DataLayer にない」というのは DataLayer に追加されていないことを指しているのかなと思い次の画像の設定をしてみました。


BlueCube という名前の DataLayer を新規作成し、5つの BP_Box を入れてみました。

BlueCube DataLayer の "Is Runtime" はとりあえず OFF にしました。


これでゲームスタートすると BP_Box はすべて削除されました。

「(1)DataLayer にない」というのがよく分からなくなりました。

"Is Runtime" の結果で変わるのかなと思いそれぞれで実行しました。

"Unloaded":削除されず
"Loaded":削除されず
"Activated":全て削除

う~ん...普通の結果だと思います。
次の検証です。



BlueCube2 という名前の DataLayer を新規作成し、3つの BP_Box を入れてみました。

BlueCube2 の "Is Runtime" にチェックを入れて同じように確認。

"Unloaded":削除されず
"Loaded":削除されず
"Activated":3つ削除

う~ん......?これも普通の結果だと思います。
ポップアップの説明を正しく理解できていないか、検証の仕方が悪いんだと思いますが、私のスキルでは今の所これが限界でした。


そんな訳で World Partition と通常のレベルが違う扱いになっていることがよく分かりました。

おまけで DataLayer も検証しましたが分からないことが増えただけでしたw

UE5 本当に難しいですね...できることが多く機能もかなりあるので四苦八苦しております;

可能であれば "Is Spatially Loaded" を ON にした状態でもアクタの数を取得できる方法があれば World Partition のメリットを更に利用できるのになあ...と思いました。

是非またチャレンジしたい内容なので
情報が集まったら動画なりで紹介してみようと思います。

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

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

わんころのUE5勉強会 2022/12/04 23:58

【UE5.0.x/UE5.1】Enhanced Input の備忘録(Triggers 編)

UE5.1 で正式に採用されることになった Enhanced Input について初心者ながらに触ったものをまとめたものになります。
そのため、間違ったことを記載している可能性があることをご承知おき下さい。

Enhanced Input の初期設定については省いてます。


UE5.1 では FirstPerson などでプロジェクトを作成すると Enhanced Input が最初から有効になっているため、本記事は UE5.1 + FirstPersonプロジェクトをベースに記載しております。

※UE5.0.x でも利用可能ですが、のちほど記載する Triggers の Combo は UE5.0.x では存在しません。



今回の備忘録ではコンテンツブラウザで右クリック> 入力から
「入力マッピングコンテキスト」と「入力アクション」で利用できる Triggers に絞った内容になります。

その前に「入力アクション」の Value Type だけ見ていきます。


Value Type:


入力するキーがどういう種類の入力かを指定します。

例えば攻撃やジャンプなどの押した離したの入力を取りたい場合は Digital(bool) を利用します。

また、キャラの移動やカメラ移動などの入力は AxisXD を使います。
Axis1D だと1つの入力アクションで1軸、Axis2D だと2軸取れるといった具合です。

UE5.1 のキャラ移動では IA_Move という入力アクションが存在し、「Value Type:Axis2D(Vector2D)」が採用されています。

前後左右で取得する入力の値が違うため
Modifiers にて前後左右の移動を変換(修飾)して利用します。

Triggers / Modifiers については「入力マッピングコンテキスト」でも指定可能です。
(本記事では Modifiers については触れません)


「入力マッピングコンテキスト」とは


キー入力の割り当てや Triggers / Modifiers などの設定を行います。
ここで「入力アクション」を登録し、それに対してどのキーを押せばトリガーされるのかが決定されます。

Triggers


本記事のメイン部分です。
キー入力がトリガーされるタイミングを指定します。
かなり多いですがそれだけ柔軟な入力が取れるようになっています。

分かりやすい順で見ていきます。


Triggers:None


キーを押し続けている間トリガーされ続けます。

画像では IA_Shoot という「入力アクション」を左クリックに割り当て、キーを押している間弾の発射がトリガーされ続けるという挙動です。

恐らく後述する Down と同じ挙動ではないかと思います。


Triggers:Pressed


キーを押した瞬間に1回トリガーされます。

画像では IA_Jump という「入力アクション」をスペースキーに割り当て、押した瞬間に1回ジャンプがトリガーされるという挙動です。


Triggers:Down


キーを押し続けている間トリガーされ続けます。

画像では、左クリックを押し続けている間トリガーされ続けます。
前述の None と同じか、同じような挙動ではないかと思います。


FirstPerson プロジェクトでは弾を発射する際
左クリックするごとに弾を1発ずつ発射します(Pressed)

Down(もしくは None) にすると左クリックを押しっぱなしで弾が連射されるという挙動になります。

発射間隔を空けるようなプロパティはない?ので
少し間隔を空けて発射したい場合は後述の Pulse を利用するといいと思います。


Triggers:Hold


"Hold Time Threshold" で指定した秒数以上キーを押し続けた時にトリガーされ続けます。
上記 Down にトリガーされるまでの時間が追加されたバージョンです。

画像では3秒左クリックを押しっぱなしにするとトリガーされ続けるため弾が連射されるという挙動になります。

"Is One Shot" にチェックを入れると
Hold のトリガー条件を満たした瞬間に1回だけ呼ばれます。
上記の例だと3秒後に1発発射されるという挙動です。


Triggers:Released


キーを離した瞬間に1回トリガーされます。

画像では左クリックを押し、
離したタイミングで1発発射されるという挙動です。


Triggers:Hold And Release


"Hold Time Threshold" で指定した秒数以上キーを押し続けたあと、キーを離した瞬間に1回トリガーされます。

画像では、左クリックを3秒以上押したあとキーを離すと1発発射されるという挙動です。

例えばチャージショットのような何秒以上押して離すような入力が取れるということです。


Triggers:Tap


キーを押したあと "Tap Release Time Threshold" で指定した秒数内にキーを放す離すとトリガーされます。

上記 Released に時間制限がついたようなバージョンです。

画像では、左クリックを押したあと 0.2秒以内にキーを離した時トリガーされます。


Triggers:Pulse


キーを押している間、"Interval" で指定した秒数ごとに1回ずつトリガーされます。

ON> OFF> ON> OFF...という挙動を繰り返し
ON のタイミングでトリガーされるようなイメージです。

"Trigger on Start" にチェックを入れると
キーを押した瞬間に1回トリガーされ、それ以降は "Interval" で指定した秒数が来るごとにトリガーされます。

チェックを外すと "Interval" で指定した秒数が来るまでトリガーされません。
押した瞬間からトリガーしたいかどうかで分かれます。


”Trigger Limit” は、ここで指定した回数のトリガーが発生したらそれ以上トリガーされません。
0を指定すると回数制限はなくなります。

画像では、左クリックを押したタイミングで1発発射し、
2秒おきに弾が3発まで発射されるという挙動です。
(最初に1発> 2秒後に1発> 2秒後に1発で計3発ということです)

例えば銃をフルオートで撃つ際、弾の発射間隔を空けたり ”Trigger Limit” を3にしておくことで3点バーストのような入力が取れるということになります。


Triggers:Chorded Action


少しややこしいトリガーです。
Chorded Action で指定する特定の「入力アクション」がトリガーされており、かつ、この「入力アクション」がトリガーされた場合にトリガーされます。

画像では、IA_Shoot の Triggers に Chorded Action を設定しています。
それに対応する入力アクションが IA_ADS となっており
そこには右クリック+Down が設定されています。

Down は上記の通り押し続けている間トリガーされ続けるので
IA_ADS は右クリックを押し続けている間トリガーされ続けるという事になります。

そして IA_Shoot はそのトリガーが発生していないと左クリックを押してもトリガーされません。

この画像は、FPS でよくあるような右クリックで ADS しながら左クリックで発射のような入力をトリガーできるようにしたものです。

IA_Shoot の Pressed ですが、右クリックを押したまま左クリックを押し続けると連射になるので、1発発射で留めるため使用しています(外せば連射になります)。


Triggers:Combo


UE5.1 より新しく追加された Triggers です。
恐らくこれが一番ややこしい気がします。

まず、黄色枠の所が他と違っていて、この「入力アクション」そのものにはキーの割り当ては出来ません(グレーアウトで操作できなくなっています)

代わりに、画像のピンク枠の部分のように「入力アクション」を設定する必要があります。
"Combo Actions" が配列になっており
"Combo Actions[0]" ~ "Combo Actions[x]" に設定した順番で入力するとトリガーされます。

画像では
Combo Actions[0]:右クリック(IA_ADS)

Combo Actions[1]:左クリック(IA_Shoot)

Combo Actions[2]:左クリック(IA_Shoot)
という順で押すとトリガーされます。

例えばストリートファイターの豪鬼が使う瞬獄殺や
伝説のコナミコマンドのような特定の順番で入力するトリガーを作成することが出来ます。


また、"Time to Press Key" で次のキー入力を受け付ける時間を設定できます。

これはキーを押すごとに次の Combo Actions に設定された "Time to Press Key" 秒以内に入力を完了させないといけないようです。


もう少し具体的に見ていくと、Combo Actions[0] の右クリックを押したタイミングで、次の Combo Actions[1] に設定した "Time to Press Key" 秒以内に入力を完了する必要があります。

そのため、この左クリックは前回の右クリックを押してから1秒以内に入力する必要があります。


更に次の Combo Actions[2] も同様に、設定した "Time to Press Key" 秒以内に入力を完了する必要があります。

そのため、この左クリックは前回の左クリックを押してから1秒以内に入力する必要があります。


Combo の検証1


"Time to Press Key" にマウスオーバーするとこういう説明が出てくるのですが、キーを押すごとに入力完了までのトータル時間が "Time to Press Key" 秒ずつ加算されるのだと勘違いしていました。

そこで疑問が出てきました。
Combo Actions[0] の "Time to Press Key" はどういう扱いなのかです。
簡単にですが下記検証を行いました。


Combo の検証2


Combo Actions[0]:右クリック(IA_ADS)
"Time to Press Key" に3秒を設定。

Combo Actions[1]:左クリック(IA_Shoot)
"Time to Press Key" に0.2秒を設定。

この状態で弾が発射されるタイミングを検証してみると
右クリックを押してから0.2秒以内に左クリックを入力しないとトリガーされませんでした。
もう一つ検証します。


Combo の検証3


先程とほぼ同じですが、Combo Actions[1] の "Time to Press Key" に0秒を設定しました。

この状態で弾が発射されるのか確認しましたがトリガーされませんでした。

右クリックを押してから0秒以内に左クリックを入力しないといけないので、実質入力不可能ということになるでしょうか。


Combo Actions[0] の"Time to Press Key" に0秒を設定しても特に影響はなかったので、ここの値は気にしなくていいのかな...?という結果になりました。


長くなりましたが Enhanced Input に利用されている Triggers の挙動を自分なりにメモしたものを公開してみました。

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

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

わんころのUE5勉強会 2022/11/20 15:21

現在の制作過程

皆様、こんにちは!

UE5 を勉強して7ヶ月ほど経ちましたが、
基本的な挙動や仕組みを勉強する日々は続いております...

現在、自分のスキルレベルで出来そうなゲームを制作中で、
ちょっとしたホラー要素のある脱出ゲーム的なものを予定しております。


▼ サンプル動画
BGMや大きな音は出ませんが
足音などの効果音は鳴るので音量にご注意下さい。

ゲーム制作も初めてなので勝手がわからず四苦八苦しております...

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

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

わんころのUE5勉強会 2022/11/20 04:32

Ci-en始めてみました!

はじめまして!
Youtube チャンネル「わんころのUE5勉強会」中の人わんころです!

Twitter で呟くと文字数や画像枚数制限などで苦労してたので
ブログ的な使い方ができるかなと思い登録してみました!
何が出来るのかもよく分かっておりません...

内容は概ね UE5 に関するものになると思います。
現在簡単なゲーム制作に向けての勉強中です。

非常にローペースになると思いますが宜しくお願いします!


最後に、当チャンネルを宣伝させて下さい!!

▼ Youtube:わんころのUE5勉強会
https://www.youtube.com/@ue5wancoro

皆様の応援の温かい応援が大変励みになっております!
是非チャンネル登録・高評価も宜しくお願い致します!


▼ フリー素材置き場(素材数は大変少ないです)
https://drive.google.com/drive/folders/12baBUJX5bKmqqYALW5Eg1KENeaDZ-fMK?usp=sharing

ゲーム制作のために作成した素材です。
気が向いた時に追加予定です。

基本的に自由に使って頂いて大丈夫な規約にしておりますが
ご利用の際は「利用規約(readme.txt)」を御一読下さい!

▼ サンプル画像

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

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

6 7 8 9 10 11 12 »

記事のタグから探す

月別アーカイブ

限定特典から探す

記事を検索