ゲーム開発備忘録

ゲームプログラマー UE4・5向けの記事を書いておりますので見ていただけるとありがたいです。

【Unity】ScrollViewのホイール移動が遅いときの設定箇所メモ

目次

 

はじめに

スクロールの移動速度がめちゃ遅いのが気になった。

 

解説

Scroll RectのScrollSensitivityを上げれば早くなった。

 

はじめからいい感じの速度にしてくr.....

 

最後に

皆様の応援が投稿のモチベーションになりますので

コメントやTwitterのフォローなどしていただけるとありがたいです。

それではよきゲーム開発を。

【Unity】実機上で外部ファイルの読み込み書き出しできるフリープラグインStandaloneFileBrowserの使い方

目次

 

はじめに

環境・・・・Unity2021.1.20f1

        VisualStudio2019

 

パッケージ状態でファイルブラウザから任意の拡張子のインポート・エクスポートができるプラグインStandaloneFileBrowserの使い方です。

ライセンス形態はMIT Licenseです。

 

ユーザーが指定した画像をゲームの中で使用したり、ストーリーが進行するとヒントが書かれたテキストデータを出力したり、様々な使い方ができます。

 

 

解説

①StandaloneFileBrowserをダウンロード

 

ここからダウンロードします。

github.com

 

②Unityにインポート

ダウンロードしたファイルのPackageにあるStandaloneFileBrowser.unitypackageをUnityにインポートします。

 

Assets/StandaloneFileBrowser/Sample/CanvasSampleScene.unity

このサンプルシーンを開いておきましょう。

③エラーの修正

1.ログで出ているエラーの修正

 

パッケージマネージャーからVersionControlをRemoveします。

 

MainCameraについているFlareLayerをRemoveComponentします。

これでエラーは消えました。

 

2.CanvasSampleSaveFileImageの誤りの修正

 

スクリプトCanvasSampleSaveFileImageに誤りがあるので修正します。

41行目の.pngpngに修正します。

▼前

▼後

 

④使い方

ボタンを押すとエクスプローラーからファイルを指定できます。

開くを押すと選択した画像が読み込まれます。

 

imageを例に挙げると

ボタンが押されるとウィンドウが表示され、選択されたファイルのパスを取得してきます。そのパスを使用して設定されたテクスチャデータに上書きしています。

49行目のstring型urlがパスの引数になっています。

このsrting型を保存しておけば、初回に設定された画像を再度読み込むこともできます。

 

最後に

皆様の応援が投稿のモチベーションになりますので

コメントやTwitterのフォローなどしていただけるとありがたいです。

それではよきゲーム開発を。

【ゼロからアンリアルエンジン5】㉞ドラッグアンドドロップで動作するシンプルなインベントリを作成しよう=アイテムの表示と移動=

目次

 

はじめに

注意

UE5.0.0の現在の情報です。

今後のアップデートによりUIや機能が変更される可能性があることをあらかじめご理解ください。

 

f:id:namiton:20220418154247p:plain



 

この記事を作成するにあたり以下の内容を参考にさせていただきました。

[UE4] ドラッグドロップで操作できるアイコンの作り方|株式会社ヒストリア

 

Unreal Engine でドラッグ アンド ドロップの UI を作成する | Unreal Engine ドキュメント

 

解説

①アイテム用の構造体を作成

アイテムの情報をやりやすくするためです。

構造体DS_ItenDataを作成します。

f:id:namiton:20220418134556p:plain

 

構造体の変数を追加します。

f:id:namiton:20220418134913p:plain

デフォルト値もセットしておきます。

f:id:namiton:20220418135016p:plain

 

②アイテム用のUIを作る

ユーザーウィジェットからWBP_Itemを作ります。

f:id:namiton:20220418132341p:plain

 

開いてフルスクリーンからCustomに変更して幅と高さを128にします。

f:id:namiton:20220418150901p:plain

 

③アイテムUIのコンポーネントの追加

SizeBoxを追加して

f:id:namiton:20220418132748p:plain

 

レイアウトを100、ビヘイビアのカーソルをHandにします。

f:id:namiton:20220418150922p:plain

f:id:namiton:20220418150932p:plain

 

オーバーレイを追加してその子に2つのimageとtextを追加します。

それぞれ名前をItemIcon,NameBack,NameTextにしてきましょう

f:id:namiton:20220418140733p:plain

 

 

ItemIconの詳細からalignmentを変更します。

f:id:namiton:20220418140150p:plain

 

NameBackはalignmentとTintとSize

f:id:namiton:20220418140824p:plain

 

NameTextはalignmentとFontSizeとJustification、

f:id:namiton:20220418141505p:plain

f:id:namiton:20220418141458p:plain

 

クリッピングを変更します。

f:id:namiton:20220418141028p:plain

 

こんな感じになったらOKです。

f:id:namiton:20220418151013p:plain



 

 

ItemIcon詳細からバインディング関数を作成します。

f:id:namiton:20220418134258p:plain

 

名前をGetItemIconに変更しましょう。

f:id:namiton:20220418134400p:plain

 

NameTextの詳細からバインディング関数Get Item Nameを作成します。

f:id:namiton:20220418141218p:plain

 

 

アイテム用に作成した構造体の変数を追加します。

f:id:namiton:20220418135256p:plain

 

スポーン時に公開とインスタンス編集可能にチェックを入れます。

f:id:namiton:20220418135309p:plain

 

それぞれの関数に接続します。

f:id:namiton:20220418135348p:plain

f:id:namiton:20220418141323p:plain

 

④アイテムUIのイベントの編集

 

イベントのオーバーライドからButtonDownとDragDetectedを追加します。

f:id:namiton:20220418133448p:plain

 

ButtonDownにはこのUIが任意のキーで押されたかどうかを設定します。

f:id:namiton:20220418133651p:plain

 

DragDetectedはドラックが開始されたときのイベントです。

ドラッグアンドドロップの動作を仲介するDragDropOperationを作成します。

f:id:namiton:20220418133626p:plain

 

イベントグラフに戻りOnDragCancelledを配置します。

このイベントはドロップ処理が失敗したときに呼ばれます。

f:id:namiton:20220418133902p:plain

 

⑤アイテムスロットUIの作成

ウィジェットブループリントUserWidgetからWBP_ItemSlotを作ります。

これはアイテムUIの受け皿です。

f:id:namiton:20220418141812p:plain

 

同じように設定します。

f:id:namiton:20220418150807p:plain

 

⑥アイテムスロットUIのコンポーネントの追加

Border、SizeBox、NamedSlotを追加します。

NamedSlotはItemSlotにリネームしておきましょう。

f:id:namiton:20220418142031p:plain

 

SizeBoxはPaddingとレイアウトを変更します。

f:id:namiton:20220418150800p:plain




こんな感じになればOKです。

f:id:namiton:20220418142311p:plain

 

⑦アイテムスロットUIのイベントの編集

 

イベントオーバーライドからOnDropを作成します。

OnDropはこのUIにドラッグアンドドロップされたときに呼ばれるイベントです。

f:id:namiton:20220418142455p:plain

 

Dropイベントを編集します。

OperationからはDragDropOperationの結果が返ってきます。

DragVisualはWBP_Itemのことです。

やっていることは非常にシンプルでこのウィジェットのItemSlotの子になにかある場合はドラッグされたアイテムの子と交換し、ない場合はそのまま配置しているだけです。

 

ここでのリターンノードでFalseになるとWBP_ItemのDragCancelledが呼ばれます。

f:id:namiton:20220418142841p:plain

f:id:namiton:20220418143041p:plain



⑧スケールボックスでラップする

 

ウィンドウのサイズによってUIが破綻するのを防ぐためスケールボックスでラップしましょう。

f:id:namiton:20220418145653p:plain

 

パレッドの詳細はコチラの記事で解説されています。

historia.co.jp

 

⑨Inventoryに配置

WBP_InventoryにUIを追加します。

 

こちらのサイトから素材を使用しました。

icon-rainbow.com

 

WBP_ItemSlotをドラッグして配置します。

(ここら辺はお好みで)

f:id:namiton:20220418154247p:plain

 

WBP_ItemSlotの子のItemSlotにWBP_Itemを配置します。

f:id:namiton:20220418150008p:plain

 

WBP_Itemの詳細から設定できます。

f:id:namiton:20220418144958p:plain

 

実行してみましょう。

こんな感じになったら成功です。

f:id:namiton:20220418153856p:plain

 

最後に

UE4やUE5向けの記事を書いています。

皆様の応援が投稿のモチベーションになりますので

コメントやTwitterのフォローなどしていただけるとありがたいです。

それではよきゲーム開発を。

【ゼロからアンリアルエンジン5】㉝ドラッグアンドドロップで動作するシンプルなインベントリを作成しよう=インベントリの表示非表示=

目次

 

はじめに

注意

UE5.0.0の現在の情報です。

今後のアップデートによりUIや機能が変更される可能性があることをあらかじめご理解ください。

 

これまでの記事の工程を行っていなくても実装できます。

 

この記事を作成するにあたり以下の内容を参考にさせていただきました。

[UE4] ドラッグドロップで操作できるアイコンの作り方|株式会社ヒストリア

 

Unreal Engine でドラッグ アンド ドロップの UI を作成する | Unreal Engine ドキュメント

 

解説

①インベントリ画面を作成しよう

ウィジェットブループリントUserWidgetからWBP_Inventoryを作ります。

f:id:namiton:20220415125559p:plain

 

CanvasPanelとBackground Blurを追加します。

f:id:namiton:20220415125725p:plain

 

Background Blurが全画面になるようにアンカーを調整し、

BlurStrengthを任意の数値にします。

f:id:namiton:20220415125906p:plain

 

②インベントリーの表示切替

 

BP_ThirdPersonCharacterを開きます。

 

インベントリが表示されたときの処理を関数でまとめておきます。ActiveInventoryControlを作成します。

 

インベントリ用のウィジェットが存在するかチェックしてなければ生成します。

f:id:namiton:20220415132951p:plain

 

Activeかどうかを変数にしておきます。

f:id:namiton:20220415133517p:plain

 

ウィジェットやカーソル、インプットモードの切り替えを行います。

f:id:namiton:20220415133716p:plain

 

全体像

f:id:namiton:20220415133826p:plain

 

イベントグラフにもどりBeginPlayに接続します。

f:id:namiton:20220415135707p:plain

またインベントリ表示キーを押したらイベントを呼びます。

f:id:namiton:20220415133950p:plain

死亡時にInventoryを無効化してUIの削除に追加します。

f:id:namiton:20220415135958p:plain



実行して切れ変えできるか確認しましょう。

f:id:namiton:20220415134225p:plain

 

③インベントリー中の操作禁止処理

インベントリー表示中のレバーを操作したり移動したりできてしまうのでこれらを無効化します。

 

DisibleMovementを使用すると落下中に停止してしまうので強引に入力箇所に判定を挟んで対応しました。うまいやり方があったらコメントで

f:id:namiton:20220415135230p:plain

 

最後に

UE4やUE5向けの記事を書いています。

皆様の応援が投稿のモチベーションになりますので

コメントやTwitterのフォローなどしていただけるとありがたいです。

それではよきゲーム開発を。

【UE5】〈Tips〉UE5で廃止されたPlaySlotAnimationの代替ノード

目次

 

はじめに

アニメーション内のスロットにBP上から再生命令を出すノードが一部廃止されたので代替ノードのメモ書きです。

f:id:namiton:20220413112020p:plain

 

メモ

 

UE4

廃止されたノード

f:id:namiton:20220414121000p:plain

 

▼UE5

ReturnValueに該当する情報はGetPlayLengthで取得できる。

f:id:namiton:20220414121109p:plain

 

使用例

f:id:namiton:20220414121305p:plain

 

最後に

UE4やUE5向けの記事を書いています。

皆様の応援が投稿のモチベーションになりますので

コメントやTwitterのフォローなどしていただけるとありがたいです。

それではよきゲーム開発を。

【UE5】〈Tips〉UE4とUE5のステートマシンの比較とステートエリアス(State Alias)についてメモ

目次

 

はじめに

UE5のThirdPersonテンプレからアニメーションステートの中身が変更され、ステートマシンにも変化があったのでメモ。

ここで触れているのはMainStatesの中身です。

f:id:namiton:20220413112020p:plain

認識違いなどミスがあったらコメントで指摘お願いします。

 

UE4

f:id:namiton:20220413102413p:plain

 

▼UE5

f:id:namiton:20220413102440p:plain

 

メモ

 

UE4との違い

まず大きなところでは足のIKが標準で利用できるようになっているところ。

f:id:namiton:20220413110026p:plain

それを実現するにコントロールリグが利用されている。

コントロールリグについては割愛

f:id:namiton:20220413110123p:plain

ステート内にもコントロールリグ用のノードが追加されている。

f:id:namiton:20220413110226p:plain

 

もう一つは落下モーション時の変化。

f:id:namiton:20220413110735p:plain

f:id:namiton:20220413110808p:plain

UE4ではジャンプスタートモーション落下直後に再生されるが、UE5ではすぐに落下中のアニメーションが再生される。

細かいところだが、UE4ではジャンプをするだけの設計で、UE5では落下も考慮した設計に変更されているのが分かる。

 

▼ジャンプスタートを無視して直接落下モーションに移動している。

f:id:namiton:20220413111138p:plain

 

②ステータス エイリアス

ステート間の遷移を制御してくれるノードらしい。

使い方はシンプル。

選択したステータスに遷移すると、このノードから繋がれている遷移条件が判定される。遷移条件を満たしていれば、このノードにワープして処理が走る。

 

GlobalAliasはどこの遷移にいても判定を行うかどうかの項目のようだ(未確認)

f:id:namiton:20220413102639p:plain

 

例えばこれまでの機能でこの遷移を実現しようとしたら、以下の画像のようにジャンプ動作だけで複数のステートから同じ条件分岐を出す必要がある。

 

これでは、今後アクションが増えていくたびに考慮する遷移が増えていき管理が大変になってしまう。

 

▼ステートエリアスを使わないで書いた場合

f:id:namiton:20220413103552p:plain


それを回避するために出てきたであろうステートエリアス。

コンセントの延長ケーブルのように遷移を中継していて、遷移可能なステートに到達している間に中継先の条件を確認しているようだ。

 

▼左が通常の書き方、右がステートエリアスで中継した書き方

f:id:namiton:20220413104549p:plain


遷移条件でステートマシン内が視覚的に複雑にならないように、かつ柔軟性が高い仕組みになっていると感じた。

 

ただ、意識して利用しないと表面上は整理されているが、裏では大量の遷移を確認する処理が走る原因にもなりそうな予感がしたので注意した設計を行いたい。

 

最後に

UE4やUE5向けの記事を書いています。

皆様の応援が投稿のモチベーションになりますので

コメントやTwitterのフォローなどしていただけるとありがたいです。

それではよきゲーム開発を。

【ゼロからアンリアルエンジン5】㉜状態異常を実装しよう=完結編=

目次

 

はじめに

注意

UE5.0.0の現在の情報です。

今後のアップデートによりUIや機能が変更される可能性があることをあらかじめご理解ください。

 

前回の状態異常の続きです。

f:id:namiton:20220412143610p:plain

 

仕様

毒沼に入っている間毒状態が蓄積し、毒状態になっている間HPが減るようにします。毒沼外にいるときは毒の蓄積が減少します。

解説

①BP_ThirdPersonCharacterの編集

インターフェースのイベントを2つ実装します。

f:id:namiton:20220412111625p:plain

f:id:namiton:20220412111940p:plain


構造体を分解して状態異常のカテゴリー別に信号を分岐します。

f:id:namiton:20220412112125p:plain

 

毒状態異常用のタイマーを作成します。

End時にはタイマーをクリアします。

f:id:namiton:20220412113140p:plain

 

②BP_AbnormalStateAriaから継承した毒クラスを作成

BP_AbnormalStateAriaからサブクラスを作成します。

サブクラス、継承に関してはここで解説しています。

namiton.hatenablog.jp

 

BP_AbnormalStateAriaを抽象クラスにします。

抽象クラスにするとこのアクタをレベル上に配置できなくなります。

クラス設定からGenerateAbstractClassにチェックをいれます。

f:id:namiton:20220412114346p:plain

 

子ブループリントクラスを作成します。

名前を、BP_PoisonAriaにします。

f:id:namiton:20220412113603p:plain

 

BP_PoisonAriaの編集

BP_PoisonAriaを開きDS Abnormal State Infoをオーバーライドします。

継承しているのでDS Abnormal State Infoと検索すると変数を設定できます。

f:id:namiton:20220412114551p:plain

 

変数へ昇格を行いDSPoisonStateInfoと名前を付けます。

f:id:namiton:20220412114641p:plain

 

この値を詳細から設定できるように編集可能にチェックを入れます。

f:id:namiton:20220412114752p:plain

 

レベルに戻り配置していたBP_AbnormalStateAriaを削除します。

BP_PoisonAriaを3つほど配置します。

f:id:namiton:20220412115614p:plain

 

詳細から毒蓄積と毒状態のダメージ速度や量を設定します。

f:id:namiton:20220412115359p:plain

 

それぞれ設定した速度で蓄積表示が出ていたら成功です。

f:id:namiton:20220412115640p:plain

 

④BP_ThirdPersonCharacterに蓄積システムの実装

毒の最大耐性変数PoisonMaxTolerance、

現在の毒の蓄積CurrentPoison、

毒状態になったかどうかIsPoisonを作成します。

それぞれデフォルト値を300、0、falseにしておきます。

f:id:namiton:20220412120648p:plain

 

現在の蓄積量に追加の蓄積量を足します。

最大量以上に増えないようにClampしてセットします。

f:id:namiton:20220412123826p:plain

 

値がPoisonMaxToleranceを超えずに蓄積されているようになったら成功です。

f:id:namiton:20220412121317p:plain

 

⑤自然状態異常回復システムの実装

毒の自然回復速度AutoPoisonHealInterval、

毒の自然回復量AutoPoisonHealValueを作成し

0.1,1などそれぞれデフォルト値を設定します。

 

蓄積の時と同じようにタイマーをセットし回復するようにします。

f:id:namiton:20220412123238p:plain



自然回復が再び毒沼に入った時に入らないように

スタート側にPoisonHealTimerをクリアするようにノードを追加します。

f:id:namiton:20220412123950p:plain


実行してみましょう。

エリア外に入ったり出たりして蓄積と回復が行われているのを確認します。

f:id:namiton:20220412124056p:plain

 

⑥毒用のUIの作成

WBP_Hudに毒用の表示を追加します。

HP_Back_Barを複製して名前をPoison_Barにします。

バーの内容が分かるようにテキストを追加しておきました。

 

適当に位置を調整します。

f:id:namiton:20220412125655p:plain

 

この表示は毒状態になった場合のみ表示したいので、

表示非表示を切り替える関数を作成しておきます。

ビヘイビアのVisibilityからバインディングを作成します。

名前をGetPoisonbarVisibilityにします。

f:id:namiton:20220412130340p:plain

 

同様にテキスト用のバインディング関数GetPoisonTextVisibilityを作成します。

f:id:namiton:20220412132427p:plain

 

関数GetPoisonbarVisibilityを開き変数へ昇格しておきます。

名前はWBP_PoisonVisibilityです。

f:id:namiton:20220412130748p:plain

デフォルト値は非表示のCollapsedにします。

f:id:namiton:20220412131907p:plain

 

同じように関数GetPoisonTextVisibilityを開き変数へ昇格しておきます。

名前はWBP_PoisonTextVisibilityです。

f:id:namiton:20220412132530p:plain

デフォルト値は非表示のCollapsedにします。

f:id:namiton:20220412132638p:plain

 

実行してみて表示されないことを確認しましょう。

f:id:namiton:20220412131950p:plain

 

バー用のバインディングもHPバーと同様に作成します。

名前はGet_Poisonにします。

f:id:namiton:20220412130903p:plain

 

2種類の変数に昇格しておきましょう。

f:id:namiton:20220412131200p:plain

 

⑦BP_ThirdPersonCharacterからUIに変数をセット

ウィジェットの生成後に最大毒耐性をセットしておきます。

f:id:namiton:20220412131538p:plain

 

スタート側のWBP変数のセット箇所です。

f:id:namiton:20220412133157p:plain

 

エンド側のWBP変数のセット箇所です。

f:id:namiton:20220412133538p:plain

 

⑧毒状態になったらHPを減らす処理

毒状態になった瞬間の沼のダメージを蓄積するようにします。

ダメージインターバルとダメージ量を変数化します。

スタート側の最後にDoOnceを繋げてセットします。

f:id:namiton:20220412134054p:plain

 

毒状態用のタイマーを設定してキャッシュしていたダメージを与えるようにします。

f:id:namiton:20220412140250p:plain

 

全体像

f:id:namiton:20220412140225p:plain

 

復活したとき前回のウィジェットが残らないように死亡時にウィジェットを削除するようにします。

f:id:namiton:20220412140344p:plain

 

⑨毒沼に入ったら移動速度を遅くする

構造体DS_AbnormalStateInfoに移動速度の追加をします。

f:id:namiton:20220412140859p:plain

このキャラクターの移動速度は500.0 cm/sなので

f:id:namiton:20220412141237p:plain

試しに250で設定します。

f:id:namiton:20220412141342p:plain


スタートとエンドのタイマー設定後にMaxWalkSpeedを更新するようにします。

▼スタート

f:id:namiton:20220412141921p:plain

f:id:namiton:20220412141909p:plain

▼エンド

f:id:namiton:20220412141931p:plain


これで移動制限がかかるようになりました。



最後にやばそうなマテリアルを適当に作成してStaticMeshに適応して完成です。

f:id:namiton:20220412142728p:plain

 

最後に

UE4やUE5向けの記事を書いています。

皆様の応援が投稿のモチベーションになりますので

コメントやTwitterのフォローなどしていただけるとありがたいです。

それではよきゲーム開発を。