プログラマーの卵の日記

備忘録になってます!小難しそうなことから超簡単なことまでやってます!!

【UE5】【CRI ADX LE v2】基礎からおさらいしてみる vol.3

 

 

概要

【UE5】【CRI ADX LE v2】基礎からおさらいしてみる vol.2 - プログラマーの卵の日記

前回の続き的な立ち位置

 

 

 

公式

こちらのNo.15から学習始めます

game.criware.jp

 

 

カテゴリに関する関数

カテゴリを用意して、キューを用意して、それぞれにカテゴリを設定しておく

 

unreal側でもカテゴリ設定状態が見れます。

 

一時停止

 

停止

 

音量変更

 

ミュート

指定したカテゴリのものすべてをミュートにする

 

 

 

AISACと関連する関数

適当に、Atom Craftで音量を弄るAISACをキューに追加

 

1. Aisac Control型の変数を作成

2. 該当するコントロールを変数に設定

3. Set Aisac Control Valueを使用してキューとコントロールを紐づける

 

AISACだけ弄るとかいうのは出来なそう。

 

コードの方
  • void UAtomComponent::SetAisacControlValue(const FAtomAisacControl& AisacControl, float Value)
    {
        if (FAtomRuntime* AtomRuntime = GetAtomRuntime())
        {
            FAtomAisacControlParameterInfo ParamInfo;
            ParamInfo.Control = AisacControl;
            ParamInfo.Value = Value;

            DECLARE_CYCLE_STAT(TEXT("FAtomThreadTask.AtomSetAisacControlValue"), STAT_AtomSetAisacControlValue, STATGROUP_AtomThreadCommands);
            AtomRuntime->SendCommandToActiveSounds(AtomComponentID, [ParamInfo](FAtomActiveSound& ActiveSound)
            {
                ActiveSound.SetAisacControl(ParamInfo);
            }, GET_STATID(STAT_AtomSetAisacControlValue));
        }
    }

 

  • USTRUCT(BlueprintType)
    struct CRIWARECORE_API FAtomAisacControl
    {
        GENERATED_BODY()

    public:

        FAtomAisacControl()
            : ID(INDEX_NONE)
        {}

        FAtomAisacControl(FName InName, int32 InID)
            : Name(InName)
            , ID(InID)
        {}

        bool operator==(const FAtomAisacControl& Other) const
        {
            return ID == Other.ID;
        }

        bool operator!=(const FAtomAisacControl& Other) const
        {
            return !(*this == Other);
        }

        /** Name of the AISAC control. */
        UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "AISAC")
        FName Name;

        /** Unique Atom Craft ID of the AISAC control. */
        UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "AISAC")
        int32 ID;
    };

    inline uint32 GetTypeHash(FAtomAisacControl A) { return static_cast<uint32>(A.ID); }

 

AISACコントロールIDを渡せばいいように見える

 

 

 

DSPバスは後回し…

 

 

 

レベル移動しても再生を維持する

公式のやり方を記載。

要はGameInstanceにAtomComponentを所持して、ゲームが終了されるまで破棄されないようにするというもの。

 

1. GameInstanceを作成

2. GameInstance内でAtomComponentを所持

3. レベルでAtomSoundBaseからAtomComponentをSpawnさせる

4. GameInstanceをキャストして取ってきて先ほどSpawnしたAtomComponentを渡す

レベル移動してもGameInstance内で再生しているAtomComponentがあるので維持される

 

 

 

キューシートのリソースのライフタイム

?????それはどこで設定されてるんだ…??どっかのiniファイルなのかなぁ…。

 

Force Inline:

uassetが読み込まれるときにキューシートがロードされる。

 

Retain on Load:

再生命令の時にキューシートのロードが行われる。

 

Prime on Load:

uassetが読み込まれるときにキューシートのロードがされる。

 

Load on Demand:

再生命令の時にキューシートのロードが行われる。

 

uassetの破棄でアンロードとなるよう。

ちょっと書き方違うだけでForce InlineとPrime onLoadが同じだったりでわけわからん…。

 

 

 

一つの音源が複数個所から再生(AtomMultiPositionComponentが正しく使えないので保留)

CriWare Unreal Engine: ADX チュートリアル No.20 : 広範囲のエリアをカバーする距離減衰の作成方法

こちらの方法らしいが、SourceActorsが設定できないのでまだ試運転かな…?

 

以下途中メモ

同時再生のずれが起きないのと、複数個所から鳴るけど一音となるためメモリ節約となるそう。

 

1. AtomMultiPositionComponentをアタッチさせる

 

2. レベル上に配置する

3. 発生させる箇所に適当なアクターを配置する

 

4. 配置したアクターから発生するように設定する

設定できない!

 

 

 

発音数制御

カテゴリごとの制限設定

カテゴリ内のキュー数を制御できるようです。

近距離優先というので、新しく再生するキューはリスナーに近いキューから優先して再生するようになります。すでに再生済みのものには影響しないはずです。

 

キューごとの制限設定

キューごとで設定できます。

後着優先は、キュー制限数まで再生していた場合、一番古い再生を停止して新しく再生するものを必ず再生するようになります。