ゲーム開発備忘録

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

【UE・UEFN】〈Tips〉シーケンサーに複数同時に位置情報のキーを打つ方法

目次

 

はじめに

 

今回は同じ時間に複数のアクタの位置を同時にキーを打つ方法について解説します。

個人の備忘録としてまとめています。誤った情報がある場合があります。

コメントにてご指摘のほどお願いいたします。

 

解説

①シーケンスに記録したいものをシーケンサードラッグアンドドロップで登録します。

 

②シーケンスに記録したい時間にシークバーを動かします。

③ビュー上でその時の位置を個別設定します。

④キーを打ちたいアクタを複数選択し、Enterキーを押します。
アウトライナーでまとめるときは、Shiftを押しながらクリック。一つづつ選択&解除するときはCtrlを押しながらクリックするのが楽です。シーケンサー画面でも同様にできます。

最後に

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

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

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

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

投げ銭を投げる

 

【UEFN】〈Tips〉Verseでランダムにシーケンサーを再生しよう

目次

 

はじめに


個人の備忘録としてまとめています。誤った情報がある場合があります。

コメントにてご指摘のほどお願いいたします。

 



本記事は以下の記事を参考にしています。

dev.epicgames.com

dev.epicgames.com


シーケンスの基礎からの記事はこちら

namiton.hatenablog.jp

 

環境

UEFN5.4

解説

Verseコード

Verseコード RandomSeq_device を作成して以下のコードを記述します。

using { /Fortnite.com/Devices }
using { /Verse.org/Random }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }


RandomSeq_device := class(creative_device):

    @editable
    CinematicSequences : cinematic_sequence_device = array{}

    var CurrentCinematicSequence : ?cinematic_sequence_device = false

    OnBegin<override>()<suspends>:void =
        spawn{RepeatEvent()}

    RandomPlaySequence() : void =
        SequenceNum := GetRandomInt(0, CinematicSequences.Length-1)
        if (Element := CinematicSequences[SequenceNum]):
             set CurrentCinematicSequence = option{Element}
             Element.Play()

    StopCurrentSequence() : void =
        if(Sequence := CurrentCinematicSequence?):
            Sequence.Stop()
        else:
            Print("Sequence is Null!!")
    RepeatEvent()<suspends> : void =
        loop:
            Print("RondomSelect!!")
            StopCurrentSequence()
            RandomPlaySequence()
            Sleep(5.0)

シーケンスの作成と登録

レベルシーケンスを作成してそれぞれアクタの動きを登録しました。


 

CinematicSequenceをシーケンスの抽選する数だけ配置しそれぞれ登録します。

×3

 

バイスの配置と登録


コンパイル済みのVerseデバイスをレベルに配置します。


配列を増やし抽選するCinematicSequence を登録します。

確認

実行すると3種類のシーケンスがランダムで抽選され再生を確認できます。

Verseコード解説

複数登録するためのシーケンスを配列で定義しています。
Current~は再生中のシーケンスを検知するために変数を定義しています。

この変数はゲーム実行後から設定する変数なので、初期値は何も設定したくないため option 型を用いて定義しました。

dev.epicgames.com

  @editable
    CinematicSequences : cinematic_sequence_device = array{}

    var CurrentCinematicSequence : ?cinematic_sequence_device = false

 

こちらは定期的に(今回は5秒おきに)イベントを発火される処理です。

OnBegin<override>()<suspends> : void =
 
        spawn{RepeatEvent()}    
  RepeatEvent()<suspends> : void =
        loop:
            Print("RondomSelect!!")
            StopCurrentSequence()
            RandomPlaySequence()
            Sleep(5.0)


Randomを利用するためにusingに追記します。

using { /Verse.org/Random }


ランダムで選んだシネマティックデバイスを再生する関数です。

ランダム生成処理はシネマティックデバイスの配列数で指定しています。
RandomSeq_deviceCinematicSequence[SequenceNum]): は失敗する可能性があるのでifで囲っています。

選ばれたシネマティックデバイスはoption型のCurrentCinematicSequenceに設定されます。

   RandomPlaySequence() : void =
        SequenceNum := GetRandomInt(0, CinematicSequences.Length-1)
        if (Element := CinematicSequences[SequenceNum]):
             set CurrentCinematicSequence = option{Element}
             Element.Play()

 

すでに再生中のシーケンスを止める処理です。
CurrentCinematicSequenceの存在をチェックを後に静止処理を実行しています。

    StopCurrentSequence() : void =
        if(Sequence := CurrentCinematicSequence?):
            Sequence.Stop()
        else:
            Print("Sequence is Null!!")

最後に

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

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

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

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

投げ銭を投げる

 

【UEFN】〈Tips〉基礎からデバイスやVerseでシーケンサーの制御をしてみよう

目次

 

はじめに

この記事ではUEFNで多く多用されるシーケンスの制御をデバイスとVerseの両方で行う解説をします。ぜひ参考になれば幸いです。

個人の備忘録としてまとめています。誤った情報がある場合があります。

コメントにてご指摘のほどお願いいたします。

 

また、Verseでは非同期処理でより良いコードが書けますが、直感的にわかりやすいSubscribe方式で書いています。

非同期処理の場合でしたらこちらに素晴らしい記事がありますので、ぜひ参考にしていただきたいです!

qiita.com


本記事は以下の記事を参考にしています。

dev.epicgames.com

dev.epicgames.com

 

環境

UEFN5.4

解説

直観的に理解できるようにデバイスでの手法を紹介した後にVerseで同様の処理記述例を紹介します。

共通

①デバイスの用意

UEFNのデバイスから以下を選びます。


ボタン ×2
CinematicSequence ×1

 

マップに配置します。

アウトライナー上でPlayボタンとPauseボタンという名前に変更しました。

②シーケンスの用意

シーケンスアセットを作成します。

 

適当なモデルを配置します。

シーケンサーに登録してキーを打ってアニメーション付けます。
わかりやすく、位置を変更するものにしました。

 

③シーケンスの登録

配置したCinematicSequenceしかけにシーケンスの登録をします。

バイスでのやり方

①イベントの登録

CinematicSequenceしかけを選択して以下のように設定します。

※スポイトボタンで画面上のボタンを選択するのが便利!

 

再生機能にPlayボタンのOnInteract
一時停止機能にPauseボタンのOnInteract

 

②実行と確認

セッションを開始して実際にシーケンスの再生と一時停止を確認できたら完了です。



Verseでのやり方

バイスでやっていたことをVerseというコード形式のプログラミングで同様のことを行ってみましょう。

①Verseの新規作成

ウィンドウからVerse Explorerを開き、任意のフォルダからVerseファイルを追加します。

名前をsequence_controllerとしました。

作成ボタンを押します。


追加されたVerseコードをダブルクリックするとVSCodeが開きます。

 

②コードの編集


以下のコードを記載します。
VerseはC#C++とは異なり、改行によりコードブロックを識別している言語です。
そのため、改行の問題によりエラーが出ることがあります。半角スペースで改行に問題がないかをよく確認しましょう。

コードの解説は最後に行います。

記載が完了したらCtrl + S で保存します。

using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }


# A Verse-authored creative device that can be placed in a level
sequence_controller := class(creative_device):

    # 再生ボタンデバイス
    @editable
    PlayButton : button_device = button_device{}

    # 一時停止ボタンデバイス
    @editable
    PauseButton : button_device = button_device{}

    # CinematicSequenceデバイス
    @editable
    CinematicSequence : cinematic_sequence_device = cinematic_sequence_device{}

 
    # Runs when the device is started in a running game
    OnBegin<override>()<suspends>:void=

        # インタラクトしたときに関数を呼ぶように登録する
        PlayButton.InteractedWithEvent.Subscribe(OnPlaySequence)
        PauseButton.InteractedWithEvent.Subscribe(OnPauseSequence)

    # シーケンスを再生する関数
    OnPlaySequence(Agent:agent):void=
        CinematicSequence.Play()

    # シーケンスを一時停止する関数
    OnPauseSequence(Agent:agent):void=
        CinematicSequence.Pause()

UEFNに戻り、Verseコードのビルドを行います。

 

③VerseDeviceの配置と登録

コンテンツブラウザにあるsequence controllerをマップに配置します。

詳細から@editableで定義した変数にデバイスを登録していきます。

バイスでイベントを登録している人はVerseでの動作を確認できないので
登録を削除しておきましょう。

④実行と確認

セッションを開始して実際にシーケンスの再生と一時停止を確認できたら完了です。

 

⑤コード解説

@editable はVerseで定義した変数をエディタに公開する場合に利用します。
今回はマップに配置しているスイッチとシーケンス再生デバイスを参照するのに利用しています。

    # 再生ボタンデバイス
    @editable
    PlayButton : button_device = button_device{}

    # 一時停止ボタンデバイス
    @editable
    PauseButton : button_device = button_device{}

    # CinematicSequenceデバイス
    @editable
    CinematicSequence : cinematic_sequence_device = cinematic_sequence_device{}


OnPlaySequenceとOnPauseSequenceは独自に作成した関数です。
コメントにもあるようにCinematicSequenceの再生と一時停止を行っています。

  # シーケンサーを再生する関数
    OnPlaySequence(Agent:agent):void=
        CinematicSequence.Play()

    # シーケンサーを一時停止する関数
    OnPauseSequence(Agent:agent):void=
        CinematicSequence.Pause()

cinematic_sequence_deviceで制御できる機能はVerseの定義を見てみたり、公式のドキュメントを見てみましょう。

dev.epicgames.com

ボタン一つで切り替える場合はこの関数を利用できそう~みたいな気付きがあるのでお勧めです。

 


Verseで元から用意されているOnBeginはゲーム開始時に呼ばれるイベントです。
ここでは、ボタンを押したときのイベントと独自で作成した関数を紐づけする登録作業をしています。

    OnBegin<override>()<suspends>:void=

        # インタラクトしたときに関数を呼ぶように登録する
        PlayButton.InteractedWithEvent.Subscribe(OnPlaySequence)
        PauseButton.InteractedWithEvent.Subscribe(OnPauseSequence)

 

Verseのメリット

ここまで解説でVerseを使うメリットがないと思われるかもしれませんが、Verseを使うメリットをいくつか紹介します。

①遅延処理

バイスではタイマー系の仕掛けを使わないといけない遅延処理などはSleep(時間)で遅延させることができます。

    OnBegin<override>()<suspends>:void=
       
        # シーケンサーを再生
        CinematicSequence.Play()
 
        # 10秒待機
        Sleep(10.0)
 
        # シーケンサーを再生
        CinematicSequence.Play()

 

②シーケンスの再生位置の指定

現状、マテリアルパラメータコレクションをVerseから直接制御することができません。
そのため、あらかじめシーケンスに焼きこんで、シーケンスの時間を制御することで間接的にマテリアルパラメータコレクションを制御する方法があります。

そのような場合ではこのようなコードを書くとよいでしょう。

    OnBegin<override>()<suspends>:void=
       
        # 1秒の時のシーケンスを設定
        CinematicSequence.SetPlaybackTime(1.0)
        # 再生して止める
        CinematicSequence.Play()
        CinematicSequence.Pause()

        # 5秒待機
        Sleep(5.0)
       
# 60フレームの時のシーケンスを再生
        CinematicSequence.SetPlaybackFrame(60)
        # 再生して止める
        CinematicSequence.Play()
        CinematicSequence.Pause()
       

シーケンスの再生フレーム/時間の確認には時刻表示の選択でできます。

 

最後に

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

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

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

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

投げ銭を投げる

 

【UEFN】〈Tips〉Verseで列挙型を利用したスイッチ文の記述例

目次

 

はじめに

個人の備忘録としてまとめています。誤った情報がある場合があります。

コメントにてご指摘のほどお願いいたします。

本記事は公式ドキュメントを参考にしています。

dev.epicgames.com

 

 

環境

UEFN5.4

解説

キャラクターの状態や種類などは列挙型で定義することで文字列などと比較して可読性やデバッグが飛躍的に向上します。積極的に活用しましょう。

列挙型で定義したフルーツの種類をスイッチ文で分岐する処理のサンプル。

using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }

Fruit := enum:
    Apple
    Banana
    Grape

Sample_device := class(creative_device):

    OnBegin<override>()<suspends>:void=

        # 初期化
        var FruitInstance : Fruit = Fruit.Banana

        # Set
        set FruitInstance = Fruit.Apple

        case(FruitInstance):
            Fruit.Apple =>
                Print("Apple")
            Fruit.Banana =>
                Print("Banana")
            Fruit.Grape =>
                Print("Grape")

        if(FruitInstance = Fruit.Apple):
            Print("Apple")
           

 

最後に

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

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

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

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

投げ銭を投げる

 

【UE5.4】〈Tips〉新プラグインTextureGraphを使ってみた

目次

 

はじめに

個人の備忘録としてまとめています。誤った情報がある場合があります。

コメントにてご指摘のほどお願いいたします。

今回はUE5.4から実装されたプラグインTextureGraphについて触ってみたので解説しています。

TextureGraph は執筆現在、実験段階のプラグインなので、UIや機能が大きく変わる可能性が非常に高いです。
開発のプロジェクトで利用することは推奨されていませんのでご注意ください。

 

環境

UE5.4.0 preview

TPSample

概要

TextureGraphプラグインはテクスチャの加工、生成に特化したエディタ機能です。
これまで、Textureの加工はマテリアルエディタ内で行っていましたが、ノードの煩雑化や再利用性が非常に乏しいものでした。

TextureGraphはテクスチャを加工してアセットとして出力するだけでなく、編集可能な1つのテクスチャグラフアセットとして独立することができます。これによりランタイム上で加工済みのテクスチャを入れ替えたり、テクスチャに特化したフィルタ機能などが利用できるようになりました。

 

解説 -プラグインの有効化-


プラグインウィンドウの表示

編集->プラグインからプラグインウィンドウを開きます。

 

②TextureGraphの有効化

すべてのプラグインからTextureと検索し、TextureGraphというプラグインを有効化します。

エディタの再起動を求められるので、UE5を再起動しましょう。

 

解説 -アセットの作成-

➀テクスチャグラフアセットの作成

プラグインが有効化されている状態で、

コンテンツフォルダ右クリック->テクスチャ->テクスチャグラフを選択します。


アセットはTextureGraphの頭文字をとってTG_Test01としました。

 

解説 -テクスチャグラフの編集-

➀画面構成

作成したアセットを開きます。


構成について囲ってみました。

流れとしては、ノードを左上から選びグラフに配置、詳細を設定後プレビューする形になります。

 

ノードのプレビューでは選択しているノードを確認できます。

それぞれのノードの詳細設定はグラフ上で展開することで詳細ウィンドウと同じ内容がノード内で確認できます。

 

②基礎的な組み方

実際にノードを組んでどのようなことができるか見てみましょう。

 

こちらの例ではShapeノードで正多角形を生成しカラーをかけて色付きの正五角形の画像を作っています。

 

解説 -(気になる)テクスチャグラフのノード機能-

➀Input

inputはその名の通りデータの入力を担当するノードです。

面白いのはMaterialやTextureGraph事態も入力できるという点です。

 

ただし、TextureGraphを扱う際は自身を参照する循環参照に気を付けてください。(エディタがクラッシュします)

 

SettingノードではOutputに相当する機能があります。
そのため、テクスチャの解像度を可変的に変更することがBPからTextureGraphのセット経由で行うこともできそうです。

 

Inputノードはそれぞれがパラメータとして機能します。※

そのため同一の名前を利用することができませんのでご注意ください。

 

※ ノード右クリックから定数にすることもできます。

見た目が同じなのでわかりづらいです。

 

②output

outputはテクスチャの出力についての項目です。

 

それぞれの設定のOutputSettingをAutoにしておくとOutputノードの設定に応じて解像度や形式が自動で決定するので、基本的にはAutoでよいでしょう。


画像の形式や解像度はOutputノードの設定で決定します。

デフォルトのAutoでは1024×1024の画像が生成されるように設定されています。

 

もちろん自分で指定することもできるので、比率を変えることでこのような生成を行うことも可能です。

 

また、Outputノードは複数配置可能です。

 

モバイル向けに解像度を落としたものを用意したり、テクスチャタイプ別に用意するといったこともできます。

 

③Procedural

プロシージャルノードはTextureGraphの目玉機能といってもいいでしょう。

形状の生成やグラデーション、ノイズ、変形など、マテリアルエディタで頑張っていた機能が使いやすくまとまっています。

 

④Filter

現在はぼかししかないですが、将来的にもっと増えることを期待します!

 

解説 -データの利用-

➀テクスチャアセットして利用

TextureGraphで生成した画像をテクスチャとしてエクスポートします。

 

outputに接続した画像について不可逆的なuassetとしてかき出します。

 

タブのエクスポートを押してかき出します。


成功すると、Outputノードで指定したPathと名前でアセットが出力されます。

 

この状態では通常のテクスチャアセットですので、これまで通りの利用ができます。

 

また、このエクスポートの操作はBPからも行うことが可能なため、エディタユーティリティ系のツールとの親和性も高そうです。

 

余談ですがuassetのテクスチャはUEの機能でPNGBMPといった形式で画像出力も可能なので、外部のペイントツールで加工もできます。(本末転倒)

注意してほしいのはこのエクスポートはアセットのエクスポートであり、
TextureGraphのエクスポートとは全く関係ないのでご注意ください。

 

 

②TextureGraphアセットして利用

執筆時点では、TextureGraphを事前にマテリアルに導入する方法はありません。

TextureGraphが実行時に同期してロードする必要があるからです。
そのため、動的にマテリアルのテクスチャに対して反映する必要があります。

 

DynamicMaterialInstanceについては以前記事で触れているので今回は省略して解説します。

namiton.hatenablog.jp

 

マテリアルの作成と編集

マテリアルを作成します。

 

名前はM_TestMatとしました。

 

DynamicMaterialInstanceで反映できるようにテクスチャのパラメータを作成します。

 

名前をTGInputとして適当なテクスチャをアサインしておきます。

 

適応対象のBPアセットを作成

ブループリントの作成からアクタを作成します。

 

名前はB_TestActorとしました。

 

コンポーネントからキューブを追加します。

 

先ほどのマテリアルをアサインしておきます。

 

TG_Sampleという名前のTextureGraph変数を作成します。

 

インスタンス編集可能にしておきます。

デフォルト値に作成したアセットを反映します。


ノードを開き以下のように組みます。

DMI_TestMatはダイナミックマテリアルインスタンス変数です。

TextureGraphのアセットを非同期でロードし、ロードできたものをマテリアルのTextureパラメータに反映しています。

そのため、ParameterNameを誤字しないように注意しましょう。

 

ロードした値が配列で帰ってくるのは、TextureGraphのOutputが複数持てるからです。

Indexの順番はOutputノードのIndexと一致しています。



配置と実行

この状態でアクタをレベルに配置し実行してみましょう。


TGSampleに登録したTextureGraphがロードさせると上書きできました!

TextureGraphを新規で作ってTG_Sampleに設定することで自由に切り替えることができます。

 

TextureGraphへの値の変更

TextureGraph内のInputパラメータの値についてもBPから変更することが可能です。

 

反映されるタイミングはRenderを行ったタイミングなので、注意が必要です。
また、TG_Sampleに登録されたTG_Test01のアセットを書き換えているので、
参照しているすべてのアセットがRedner時にこの影響を受けるのでご注意ください。


更新タイミングを手動で制御できるマテリアルパラメータコレクションといってもよいでしょう。

 

 

最後に

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

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

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

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

投げ銭を投げる

 

【UE4・UE5・UEFN】〈Tips〉ボス戦で使える、FF風 攻撃予測機能の作り方

目次

 

はじめに

個人の備忘録としてまとめています。誤った情報がある場合があります。

コメントにてご指摘のほどお願いいたします。

今回はF〇14風の攻撃予測機能の実装方法について簡単にまとめました。

UEFNの厳しい制約下でも動作するようマテリアルの機能を利用しています。

 

環境

UE5.4.0 UEFN

 

解説 (共通)

⓪共通 マテリアルをデカール対応にする設定

地形を無視して貼り付けられるようにデカール対応の設定にします。

コンテンツ右クリックでマテリアルを作成

 

名前はM_VisualizeDamageにしました。

 

マテリアルの詳細からドメインDeferred Decal

ブレンドモードをTranslucentにします。

 

これでデカールの準備は完了です。

BaseColorに任意のカラーを入れてレベルに配置すると、地形に沿って色が塗られることが分かります。


これをベースに機能を作っていきます。

①共通 マテリアルパラメータコレクションの準備

UEFNでマテリアルを制御するには現状MPCとシーケンサーを利用する必要があるため、このためのMPCを作成します。

名前はMPC_VisualizeDamageにしました。

 

制御用のパラメータ、Box,Circle, Sector を用意しました。

 

M_VisualizeDamageを開きコンテンツブラウザからMPCアセットをドラッグアンドドロップすることで利用できるようになります。

 

いよいよこれを利用して実装を作成していきます。

 

解説 ボックス型

共通①で作成したマテリアルを複製し、M_VisualizeDamage_Boxという名前にします。

以下のようにノードを組みます。
元々デカールの形状が四角なので、Step関数とグラデーションを利用することで実現できます。

 

このMPCのBoxに対して0~1を入力することで動かすことができます。

UEFNの場合、任意のシーケンサーなどで0~1, 終了したら定数の0を入れてあげて完了です。

 

解説 円型

共通①で作成したマテリアルを複製し、M_VisualizeDamage_Circleという名前にします。

 

以下のようにノードを組みます。
RadialGradientExoponentialというノードで半径を変更できる円のノードが、あるのでそちらを利用しました。

 

このMPCのCircleに対して0~1を入力することで動かすことができます。

UEFNの場合、任意のシーケンサーなどで0~1, 終了したら定数の0を入れてあげて完了です。

 

解説 扇型

共通①で作成したマテリアルを複製し、M_VisualizeDamage_Sectorという名前にします。

以下のようにノードを組みます。

VectorToRadialValueを利用することでレーダーのようなふるまいをすることができます。これを円形でマスクすることで扇形を実現しています。

 

大きくなってしまったので拡大しているスクショも上げています。

拡大

 

このMPCのSectorに対してRに0~1、Gに0~360度を入力することで動かすことができます。

UEFNの場合、任意のシーケンサーなどでRに0~1, 終了したら定数の0を入れてあげて、Gに度数を入れて完了です。

最後に

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

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

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

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

投げ銭を投げる

 

【UEFN】〈Tips〉実行時に不正なアセット リファレンス /ACLPlugin/ACLAnimBoneCompressionSettings.で失敗する。

目次

 

はじめに

UEからアセットをUEFNに入れた時以下のようなエラーが出ていたので修正できたことを共有します。

▼怒ったログ
[AssetLog] / ~ : 不正なアセット リファレンス /ACLPlugin/ACLAnimBoneCompressionSettings. 。(FortValidator_IllegalReferences)

 

個人の備忘録としてまとめています。誤った情報がある場合があります。

コメントにてご指摘のほどお願いいたします。

 

環境

Windows10,11 
UEFN5.4.0

問題と改善

UE側で入る圧縮設定がUEFNでは認知できずエラーとなってしまうようです。

手元の環境では、アニメーションアセットで発生しました。

 

UEFNへの初めて移植したときに出てくるアセットステートをプライベートアセットに変更して更新することで不正な参照が切れ解決できました。

 

最後に

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

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

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

投げ銭を投げる