mcpField
U
ue-niagara-effects

ue-niagara-effects

github.com/quodsoler開発4191.2k 回インストール4 週間前に更新
リポジトリ

ue-niagara-effects について

UE 5.8 で Niagara エフェクトを C++ のゲームプレイコードに連携するコーディングスキルです。システムの生成と制御、ユーザーデータの受け渡し、データチャンネル、シミュレーションキャッシュ、負荷管理を扱います。

主な機能

  1. 01Niagara システムの生成と制御
  2. 02ランタイムユーザーパラメーターの設定
  3. 03データインターフェースと配列のバインド
  4. 04Niagara Data Channels の送受信
  5. 05シミュレーションキャッシュとプーリング

活用シーン

  1. 01ゲームイベントに応じたヒットエフェクトの発生
  2. 02コンポーネントへの継続トレイルのアタッチ
  3. 03ゲームデータの Niagara への送信
  4. 04エフェクトシミュレーションの記録と再生

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/quodsoler/unreal-engine-skills --skill ue-niagara-effects

インストール後、Claude Code で/ue-niagara-effectsを入力して読み込まれたか確認します。

同梱ファイルreferences/niagara-data-interfaces.mdreferences/niagara-parameter-types.md

詳細

UE Niagara エフェクト

対象エンジン:UE 5.8。以下の API は 5.8 のヘッダーを基に検証済みです。旧形式は「非推奨 — 使用しないでください」に記載しています。

Niagara は Niagara プラグイン(Engine/Plugins/FX/Niagara、デフォルトで有効)として提供されています。ゲームコードでは UNiagaraFunctionLibrary と UNiagaraComponent を通じてシステムをスポーンおよび操作し、データインターフェースと Niagara Data Channels を通じて構造化データを渡し、コンポーネントプーリングと UNiagaraEffectType のスケーラビリティでコストを制御します。モジュールの PublicDependencyModuleNames に "Niagara" を追加し、UNiagaraDataInterface をサブクラス化する場合は "NiagaraCore" も追加してください。

コンテキスト

.agents/ue-project-context.md がある場合は読み込んでください(モジュール名、規約、有効なプラグイン、GAS/ネットワーク設定)。ファイルがない場合も作業を中断しないでください。

リクエストとコードベースから該当する領域を特定してください。解釈の違いによって生成されるコードが異なる可能性がある場合に限り、質問してください。

リクエストの内容…参照先
アセット、エミッター、コンポーネントの関係システムとコンポーネントのモデル
エフェクトの発火、トレイルのアタッチシステムのスポーン
アクティベート、リセット、一時停止、シークライフサイクルの制御
エフェクトへの浮動小数点数、色、ベクトルの入力ユーザーパラメーターの設定
スケルタルメッシュ/静的メッシュ、カーブ、配列、テクスチャの DIデータインターフェース
ゲーム固有のデータを Niagara スクリプトに公開カスタムデータインターフェース
ゲームプレイイベントの Niagara への送信、VFX 間のメッセージングNiagara Data Channels
エフェクトの終了タイミングの把握完了コールバック
シミュレーションの記録と再生シミュレーションキャッシュ
低コストで大量に使用するエミッター軽量エミッター
スポーンコスト、再利用、プライミングコンポーネントプーリング
カリング、ティック順序、決定性スケーラビリティとティックの動作
Build.cs とインクルードビルド設定

システムとコンポーネントのモデル

UNiagaraSystem                    asset; holds TArray<FNiagaraEmitterHandle>
  └── FNiagaraEmitterHandle       GetEmitterBase() -> UNiagaraEmitterBase
        ├── UNiagaraEmitter       ENiagaraEmitterMode::Standard (stateful, scripted)
        └── UNiagaraStatelessEmitter  ENiagaraEmitterMode::Stateless (lightweight)
UNiagaraComponent                 runtime instance; GetSystemInstanceController()

作成者は Niagara エディターで User. 名前空間にパラメーターを配置することで、C++ から公開できます。実行時にオーバーライドできるのは User.* パラメーターのみです。System.*、Emitter.*、Particle.*、Module.* はシミュレーション内部用です。

エディターを開かずに、アセットが公開している内容を確認します。

#include "NiagaraFunctionLibrary.h"

// FNiagaraUserParameterInfo: ParameterName, ParameterType, TypeName.
const TArray<FNiagaraUserParameterInfo> Params = UNiagaraFunctionLibrary::GetAllUserParameters(ImpactSystem);
// FNiagaraMinimalEmitterInfo: EmitterName, bIsEnabled, bIsLightweight, UsedRendererMaterials, UsedRendererMeshes.
const TArray<FNiagaraMinimalEmitterInfo> Emitters = UNiagaraFunctionLibrary::GetAllEmitters(ImpactSystem);

システムのスポーン

#include "NiagaraComponent.h"
#include "NiagaraFunctionLibrary.h"

// One-shot at a world location. Returns nullptr on dedicated servers and when the
// pre-cull check rejects the spawn, so always null-check.
UNiagaraComponent* ImpactVFX = UNiagaraFunctionLibrary::SpawnSystemAtLocation(
    this,                                            // const UObject* WorldContextObject
    ImpactSystem,                                    // UNiagaraSystem*
    HitLocation,                                     // FVector Location
    FRotator::ZeroRotator,                           // FRotator Rotation
    FVector(1.0f),                                   // FVector Scale
    /*bAutoDestroy=*/ true,
    /*bAutoActivate=*/ true,
    ENCPoolMethod::AutoRelease,
    /*bPreCullCheck=*/ true);

if (ImpactVFX)
{
    ImpactVFX->SetVariableVec3(FName("User.HitNormal"), HitNormal);
    ImpactVFX->SetVariableLinearColor(FName("User.HitColor"), DamageColor);
}

アタッチされる永続エフェクトです。引数の順序に注意してください。ここでは bAutoDestroy が bAutoActivate より前です。

UNiagaraComponent* TrailVFX = UNiagaraFunctionLibrary::SpawnSystemAttached(
    TrailSystem,
    WeaponMesh,                                      // USceneComponent* AttachToComponent
    FName("MuzzleSocket"),                           // FName AttachPointName
    FVector::ZeroVector,
    FRotator::ZeroRotator,
    EAttachLocation::SnapToTarget,
    /*bAutoDestroy=*/ false,
    /*bAutoActivate=*/ true,
    ENCPoolMethod::ManualRelease,
    /*bPreCullCheck=*/ true);

2 つ目の SpawnSystemAttached オーバーロードでは、Rotation の後に FVector Scale が入り、その後の引数は LocationType, bAutoDestroy, PoolingMethod, bAutoActivate, bPreCullCheck の順です。意図的にオーバーロードを選択してください。2 つは混同しやすいので注意が必要です。

SpawnSystemAtLocationWithParams と SpawnSystemAttachedWithParams は、長い引数リストではなく名前付きフィールドを使いたい場合、単一の FFXSystemSpawnParameters 構造体(Particles/ParticleSystemComponent.h)を受け取ります。この構造体が持つのは ENCPoolMethod ではなく EPSCPoolMethod PoolingMethod です。

1 つのアクターで繰り返すエフェクトには、イベントごとにスポーンするのではなく、コンポーネントを所有します。

// Header:
UPROPERTY(VisibleAnywhere, Category = "VFX")
TObjectPtr<UNiagaraComponent> EngineTrailVFX;

// Constructor:
EngineTrailVFX = CreateDefaultSubobject<UNiagaraComponent>(TEXT("EngineTrailVFX"));
EngineTrailVFX->SetupAttachment(GetRootComponent());
EngineTrailVFX->SetAutoActivate(false);

// Gameplay. SetAsset resets existing override parameters unless you opt out,
// so re-apply User parameters after a swap or pass false.
EngineTrailVFX->SetAsset(BoostTrailSystem, /*bResetExistingOverrideParameters=*/ true);
EngineTrailVFX->Activate(/*bReset=*/ true);

ライフサイクルの制御

NiagaraComp->Activate(/*bReset=*/ false);   // resume
NiagaraComp->Activate(/*bReset=*/ true);    // restart from scratch
NiagaraComp->Deactivate();                  // stop spawning, let particles drain
NiagaraComp->DeactivateImmediate();         // kill particles now
NiagaraComp->ResetSystem();                 // restart from time 0
NiagaraComp->ReinitializeSystem();          // full re-init; more expensive than ResetSystem
NiagaraComp->SetPaused(true);
NiagaraComp->SetAutoDestroy(true);

// Warm-up: advance age before the effect becomes visible.
NiagaraComp->SetDesiredAge(2.5f);
NiagaraComp->SeekToDesiredAge(2.5f);

// Deterministic stepping for cutscenes and tests.
NiagaraComp->AdvanceSimulation(/*TickCount=*/ 30, /*TickDeltaSeconds=*/ 0.0166f);

ユーザーパラメーターの設定

セッターには名前空間のプレフィックスを含む FName を渡します。名前または型がアセットと一致しない場合、何もせずに処理を終了します。

NiagaraComp->SetVariableFloat(FName("User.DamageAmount"), 150.0f);
NiagaraComp->SetVariableInt(FName("User.ProjectileCount"), 12);
NiagaraComp->SetVariableBool(FName("User.bIsCritical"), bIsCriticalHit);
NiagaraComp->SetVariableVec2(FName("User.UVOffset"), FVector2D(0.5, 0.25));
NiagaraComp->SetVariableVec3(FName("User.TargetDirection"), AimDirection);
NiagaraComp->SetVariableVec4(FName("User.CustomData"), FVector4(1.0, 0.5, 0.0, 1.0));
NiagaraComp->SetVariableLinearColor(FName("User.TintColor"), FLinearColor::Red);
NiagaraComp->SetVariableQuat(FName("User.Orientation"), GetActorQuat());
NiagaraComp->SetVariableMatrix(FName("User.LocalToTarget"), TargetMatrix);

// Positions go through the LWC-aware setter, not SetVariableVec3.
NiagaraComp->SetVariablePosition(FName("User.WorldOrigin"), WorldSpaceOrigin);

// Object-valued parameters.
NiagaraComp->SetVariableObject(FName("User.TargetMesh"), TargetMeshComponent);
NiagaraComp->SetVariableActor(FName("User.SourceActor"), this);
NiagaraComp->SetVariableMaterial(FName("User.FXMaterial"), DynamicMaterial);
NiagaraComp->SetVariableStaticMesh(FName("User.ScatterMesh"), ScatterMesh);
NiagaraComp->SetVariableTexture(FName("User.FlowMap"), FlowTexture);
NiagaraComp->SetVariableTextureRenderTarget(FName("User.SceneRT"), SceneRenderTarget);

// Getters report success through an out parameter and are [[nodiscard]].
bool bIsValid = false;
const float CurrentRate = NiagaraComp->GetVariableFloat(FName("User.EmitRate"), bIsValid);
名前空間のプレフィックスC++ から設定可能
User.はい — 実行時にオーバーライドできる唯一の名前空間
System.いいえ — エンジン所有(Age、DeltaTime、ExecutionState)
Emitter.いいえ — エミッターごとのシミュレーション状態
Particle.いいえ — パーティクルごとのシミュレーション状態
Module.いいえ — スタックノード内でのみ使用

C++ から Niagara への型対応表、配列関数ライブラリの対応表、プールメソッドの値については、niagara-parameter-types.md を参照してください。

データインターフェース

データインターフェースは、DI 型の User.* パラメーターとして公開される UNiagaraDataInterface のサブクラスです。パラメーター名を const FString& として受け取る UNiagaraFunctionLibrary の型付きヘルパーを使ってバインドします。

UNiagaraFunctionLibrary::OverrideSystemUserVariableSkeletalMeshComponent(
    NiagaraComp, TEXT("User.SourceMesh"), GetMesh());

UNiagaraFunctionLibrary::SetSkeletalMeshDataInterfaceFilteredBones(
    NiagaraComp, TEXT("User.SourceMesh"), { FName("hand_l"), FName("hand_r") });

UNiagaraFunctionLibrary::SetSkeletalMeshDataInterfaceSamplingRegions(
    NiagaraComp, TEXT("User.SourceMesh"), { FName("UpperBody") });

UNiagaraFunctionLibrary::OverrideSystemUserVariableStaticMeshComponent(
    NiagaraComp, TEXT("User.ScatterMesh"), ScatterMeshComponent);

UNiagaraFunctionLibrary::SetTextureObject(NiagaraComp, TEXT("User.FlowTexture"), FlowTexture);

配列 DI は、フレームごとにゲームプレイデータを渡すための主力です。これらのヘルパーは FName を受け取ります。

#include "NiagaraDataInterfaceArrayFunctionLibrary.h"

TArray<FVector> Waypoints = BuildWaypoints();
UNiagaraDataInterfaceArrayFunctionLibrary::SetNiagaraArrayVector(
    NiagaraComp, FName("User.Waypoints"), Waypoints);

UNiagaraDataInterfaceArrayFunctionLibrary::SetNiagaraArrayFloatValue(
    NiagaraComp, FName("User.HeatData"), /*Index=*/ 5, /*Value=*/ 0.9f, /*bSizeToFit=*/ false);

DI を直接変更する必要がある場合は、DI オブジェクトを取得します。

#include "NiagaraDataInterfaceCurve.h"

UNiagaraDataInterfaceCurve* CurveDI =
    UNiagaraFunctionLibrary::GetDataInterface<UNiagaraDataInterfaceCurve>(
        NiagaraComp, FName("User.SpeedCurve"));

if (CurveDI)
{
    CurveDI->Curve.Reset();
    CurveDI->Curve.AddKey(0.0f, 0.0f);
    CurveDI->Curve.AddKey(1.0f, 500.0f);
#if WITH_EDITORONLY_DATA
    CurveDI->UpdateLUT();    // editor-only
#endif
    // With bUseLUT (default true) CPU and GPU both sample the LUT baked at cook time
    // (NiagaraDataInterfaceCurve.cpp:182), so key edits only take effect in cooked builds
    // if the DI was authored with bUseLUT off.
}

非テンプレートのオーバーロード GetDataInterface(UClass* DIClass, UNiagaraComponent*, FName) は、クラスが実行時にしかわからない場合に対応します。ヘッダーパス、プロパティ、シミュレーションターゲットのサポートを含む組み込み DI カタログは、niagara-data-interfaces.md にあります。

カスタムデータインターフェース

UNiagaraDataInterface(NiagaraDataInterface.h)をサブクラス化します。関数リストはエディター専用データです。#if WITH_EDITORONLY_DATA 内で宣言されたオーバーライド GetFunctionsInternal(TArray<FNiagaraFunctionSignature>& OutFunctions) const に加え、CPU 実装をバインドする GetVMExternalFunction と、インスタンスが正しく比較・複製されるようにする Equals / CopyToInternal が必要です。GPU をサポートするには、ProvidePerInstanceDataForRenderThread と PerInstanceDataPassedToRenderThreadSize を追加します。クラスの完全なテンプレートは niagara-data-interfaces.md を参照してください。

Niagara データチャンネル

データチャンネルは、ゲームプレイコードと Niagara の間、および独立したシステム間でサポートされるブリッジです。チャンネルはペイロードを記述する UNiagaraDataChannelAsset であり、ライターが要素を公開し、Niagara エミッターとゲームコードがそれを読み取ります。

#include "NiagaraDataChannelAccessContext.h"
#include "NiagaraDataChannelAccessor.h"
#include "NiagaraDataChannelAsset.h"
#include "NiagaraDataChannelFunctionLibrary.h"

void AMyProjectile::ReportImpact(const FVector& ImpactPoint, const FVector& ImpactNormal)
{
    const FNiagaraDataChannelSearchParameters SearchParams(GetRootComponent());

    UNiagaraDataChannelWriter* Writer = UNiagaraDataChannelLibrary::WriteToNiagaraDataChannel(
        this,
        ImpactChannel,                       // UPROPERTY() TObjectPtr<UNiagaraDataChannelAsset>
        SearchParams,
        /*Count=*/ 1,
        /*bVisibleToGame=*/ false,
        /*bVisibleToCPU=*/ true,
        /*bVisibleToGPU=*/ true,
        TEXT("MyProjectileImpact"));

    if (Writer)
    {
        Writer->WritePosition(FName("Position"), 0, ImpactPoint);
        Writer->WriteVector(FName("Normal"), 0, ImpactNormal);
    }
}

ゲーム側で読み取る場合:

void AMyProjectile::DrainImpacts()
{
    const FNiagaraDataChannelSearchParameters SearchParams(GetRootComponent());

    UNiagaraDataChannelReader* Reader = UNiagaraDataChannelLibrary::ReadFromNiagaraDataChannel(
        this, ImpactChannel, SearchParams, /*bReadPreviousFrame=*/ true);

    for (int32 Index = 0; Reader && Index < Reader->Num(); ++Index)
    {
        bool bValid = false;
        const FVector Position = Reader->ReadPosition(FName("Position"), Index, bValid);
        if (bValid)
        {
            SpawnDecalAt(Position);
        }
    }
}

SubscribeToNiagaraDataChannel(WorldContextObject, Channel, SearchParams, UpdateDelegate, UnsubscribeToken) は、新しい要素が公開されるたびに FOnNewNiagaraDataChannelPublish コールバックを呼び出します。FNiagaraDataChannelUpdateContext には Reader、FirstNewDataIndex、LastNewDataIndex、NewElementCount が含まれます。保存したトークンを使って UnsubscribeFromNiagaraDataChannel を呼び出し、すべてのサブスクリプションを解除してください。

UNiagaraDataChannelLibrary には、GetDataChannelElementCount、単一要素を扱う ReadFromNiagaraDataChannelSingle / WriteToNiagaraDataChannelSingle、および FNiagaraDataChannelSearchParameters の代わりに FNDCAccessContextInst を受け取る _WithContext バリアントも用意されています。検索パラメーターを使うオーバーロードは旧来の方法であり、新しいチャンネルタイプをサポートしません。新しいチャンネルにはコンテキストバリアントを使用してください。

完了コールバック

OnSystemFinished は DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnNiagaraSystemFinished, class UNiagaraComponent*, PSystem) であるため、ハンドラーはクラス本体で宣言された UFUNCTION() でなければなりません。

// MyVFXComponent.h
#pragma once

#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "MyVFXComponent.generated.h"

class UNiagaraComponent;
class UNiagaraSystem;

UCLASS(ClassGroup = (Custom), meta = (BlueprintSpawnableComponent))
class MYGAME_API UMyVFXComponent : public UActorComponent
{
    GENERATED_BODY()

public:
    void PlayBurst(UNiagaraSystem* System, const FVector& Location);

    virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;

protected:
    UFUNCTION()
    void HandleVFXFinished(UNiagaraComponent* FinishedComponent);

    UPROPERTY(Transient)
    TObjectPtr<UNiagaraComponent> ActiveVFX;
};
// MyVFXComponent.cpp
#include "MyVFXComponent.h"

#include "NiagaraComponent.h"
#include "NiagaraFunctionLibrary.h"

void UMyVFXComponent::PlayBurst(UNiagaraSystem* System, const FVector& Location)
{
    ActiveVFX = UNiagaraFunctionLibrary::SpawnSystemAtLocation(
        this, System, Location, FRotator::ZeroRotator, FVector(1.0f),
        /*bAutoDestroy=*/ false, /*bAutoActivate=*/ true, ENCPoolMethod::ManualRelease);
    if (ActiveVFX)
    {
        ActiveVFX->OnSystemFinished.AddDynamic(this, &UMyVFXComponent::HandleVFXFinished);
    }
}

void UMyVFXComponent::HandleVFXFinished(UNiagaraComponent* FinishedComponent)
{
    FinishedComponent->OnSystemFinished.RemoveDynamic(this, &UMyVFXComponent::HandleVFXFinished);
    FinishedComponent->ReleaseToPool();
    ActiveVFX = nullptr;
}

void UMyVFXComponent::EndPlay(const EEndPlayReason::Type EndPlayReason)
{
    if (ActiveVFX)
    {
        ActiveVFX->OnSystemFinished.RemoveDynamic(this, &UMyVFXComponent::HandleVFXFinished);
        ActiveVFX->ReleaseToPool();   // ManualRelease components leak unless released
        ActiveVFX = nullptr;
    }
    Super::EndPlay(EndPlayReason);
}

シミュレーションキャッシュ

UNiagaraSimCache はシミュレーションフレームを記録し、決定論的に再生します。シネマティック、ネットワーク上で表示するヒーローエフェクト、回帰テストに役立ちます。

#include "NiagaraComponent.h"
#include "NiagaraSimCache.h"
#include "NiagaraSimCacheFunctionLibrary.h"

UNiagaraSimCache* Cache = UNiagaraSimCacheFunctionLibrary::CreateNiagaraSimCache(this);

FNiagaraSimCacheCreateParameters CreateParameters;
UNiagaraSimCache* OutCache = nullptr;
UNiagaraSimCacheFunctionLibrary::CaptureNiagaraSimCacheImmediate(
    Cache, CreateParameters, NiagaraComp, OutCache,
    /*bAdvanceSimulation=*/ false, /*AdvanceDeltaTime=*/ 0.01666f);

// Play a cache back on any component running the same system, then hand control
// back to the live simulation.
NiagaraComp->SetSimCache(Cache, /*bResetSystem=*/ true);
NiagaraComp->ClearSimCache(/*bResetSystem=*/ true);

UNiagaraSimCache は IsCacheValid()、CanRead(UNiagaraSystem*)、GetNumFrames()、GetStartSeconds()、GetDurationSeconds() を公開します。独自の状態を保持するデータインターフェースは、INiagaraSimCacheCustomStorageInterface を通じてこの機能に参加します。

軽量エミッター

エミッターには 2 つのモードがあり、FNiagaraEmitterHandle::GetEmitterMode() で取得できます。ENiagaraEmitterMode::Standard(UNiagaraEmitter、スクリプトによる完全なシミュレーション)と ENiagaraEmitterMode::Stateless(UNiagaraStatelessEmitter、パーティクルごとのシミュレーションバッファーを持たない、コストが固定された解析型エミッター)です。ステートレスエミッターは Niagara エディターで作成でき、CPU とメモリのコストが大幅に低いため、アンビエントエフェクトやインスタンス数の多いエフェクトに適しています。

UNiagaraStatelessEmitter はモジュール内部の Internal/Stateless/NiagaraStatelessEmitter.h にあるため、ゲームモジュールからインクルードできません。ほかのシステムと同様に、UNiagaraComponent と User. パラメーターを通じてステートレスエミッターを操作してください。ゲームコードからステートレスエミッターを識別するには、UNiagaraFunctionLibrary::GetAllEmitters から取得した FNiagaraMinimalEmitterInfo の bIsLightweight を読み取ります。

コンポーネントのプーリング

各スポーン呼び出しで指定する ENCPoolMethod により、プールの動作が選択されます。None(新しいコンポーネント)、AutoRelease(完了時に自動で返却されます。スポーンしたティックを過ぎてポインターを保持しないでください)、ManualRelease(ReleaseToPool() を呼び出します)があります。ManualRelease_OnComplete と FreeInPool は、非表示の内部状態です。

#include "NiagaraComponentPool.h"
#include "NiagaraWorldManager.h"

// Prime one world before a gameplay-critical moment. Call the pool directly:
// FNiagaraWorldManager::PrimePool / PrimePoolForAllWorlds are not NIAGARA_API
// (NiagaraWorldManager.h:236-238) and fail to link from a game module.
if (FNiagaraWorldManager* WorldMan = FNiagaraWorldManager::Get(GetWorld()))
{
    WorldMan->GetComponentPool()->PrimePool(ExplosionSystem, GetWorld());
}

プール容量はアセット上のシステムごとのプロパティです(UFXSystemAsset の MaxPoolSize、PoolPrimeSize、Particles/ParticleSystem.h:126,135)。プライミングでは min(PoolPrimeSize, MaxPoolSize) 個のコンポーネントが作成されます。PoolPrimeSize のデフォルト値は 0 なので、設定しないとプライミングは何も行いません(NiagaraComponentPool.cpp:285)。グローバル CVars:FX.NiagaraComponentPool.Enable、FX.NiagaraComponentPool.KillUnusedTime、FX.NiagaraComponentPool.CleanTime、FX.NiagaraComponentPool.Validation。

スケーラビリティとティックの動作

NiagaraComp->SetAllowScalability(true);    // let the scalability manager cull this instance
NiagaraComp->SetTickBehavior(ENiagaraTickBehavior::UsePrereqs);
ENiagaraTickBehavior意味
UsePrereqsアタッチメントとデータインターフェースの前提条件を満たした後にティックします。最も安全で、デフォルトの設定です。
UseComponentTickGroup前提条件を無視し、コンポーネント独自のティックグループを使用します。
ForceTickFirst最初のティックグループでティックします。
ForceTickLast最後のティックグループでティックします。

スケーラビリティは、システムに割り当てられた UNiagaraEffectType で管理されます。設定項目は SystemScalabilitySettings、EmitterScalabilitySettings、CullReaction、UpdateFrequency、およびインスタンス化された SignificanceHandler です。データ駆動型であり、プラットフォームごとの C++ 設定はありません。

CPU シミュレーションと GPU シミュレーション:CPU シミュレーションはすべてのデータインターフェースに対応し、読み戻しも可能です。GPU シミュレーションははるかに多くの数を処理できますが、対応する DI の種類が少なく、明示的な読み戻し経路がないと読み戻せません。

決定性:クライアント間で一致させる必要があるエフェクトでは、UNiagaraSystem アセットで固定ティックを有効にし(bFixedTickDelta/FixedTickDeltaTime。HasFixedTickDelta() と GetFixedTickDeltaTime() で取得可能)、CPU シミュレーションを使用してください。装飾用エフェクトはクライアントのみで実行し、IsRunningDedicatedServer() でスポーンをガードしてください。

オクルージョン:SetOcclusionQueryMode(ENiagaraOcclusionQueryMode)/GetOcclusionQueryMode() により、コンポーネントごとのオクルージョンクエリを制御します(Default、AlwaysEnabled、AlwaysDisabled)。

Niagara Fluids(5.8 ではベータ版)では、GPU 流体ソルバーとガスソルバーが追加されますが、フレームあたりのコストが高いため、ヒーローエフェクトに限定してください。

ビルドの設定

PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "Niagara", "NiagaraCore" });

UNiagaraDataInterface を継承する場合にのみ "NiagaraCore" が必要です。Internal/ 以下のヘッダー(例:Internal/DataInterface/NiagaraDataInterfaceStaticMesh.h)は、ゲームモジュールからインクルードできません。

非推奨 — 使用しないでください

使用しないもの5.8 で使用するもの出典
SetNiagaraVariableFloat(const FString&, float) およびその他すべての SetNiagaraVariable* FString セッターSetVariableFloat(FName, float) および対応する SetVariable* FName セッターPublic/NiagaraComponent.h の UE_DEPRECATED(5.3)
UNiagaraDataInterface::GetFunctions(TArray<FNiagaraFunctionSignature>&)#if WITH_EDITORONLY_DATA 内の GetFunctionsInternal(TArray<FNiagaraFunctionSignature>&) constClasses/NiagaraDataInterface.h の UE_DEPRECATED(5.4)
UNiagaraDataInterface::RequiresDistanceFieldData()RequiresGlobalDistanceField()Classes/NiagaraDataInterface.h の UE_DEPRECATED(5.4)
UNiagaraDataInterface::ReadsEmitterParticleData(const FString&)GetEmitterReferencesByName()Classes/NiagaraDataInterface.h の UE_DEPRECATED(5.4)
引数なしの UNiagaraDataInterface::PostCompile()所有するシステムを受け取る PostCompile オーバーロードClasses/NiagaraDataInterface.h の UE_DEPRECATED(5.7)
UNiagaraDataInterface::IsUsedByCPUEmitter() / IsUsedByGPUEmitter()IsUsedWithCPUScript() / IsUsedWithGPUScript()Classes/NiagaraDataInterface.h の UE_DEPRECATED(5.3)
UNiagaraComponent::GetSystemInstance()GetSystemInstanceController()Public/NiagaraComponent.h の UE_DEPRECATED(5.0)
抽象クラス、またはサブミックス名を含むオーディオデータインターフェースの基底クラスUSoundSubmix* Submix プロパティをそれぞれ持つ UNiagaraDataInterfaceAudioSpectrum または UNiagaraDataInterfaceAudioOscilloscopeClasses/NiagaraDataInterfaceAudio*.h に具象オーディオ DI は 3 つのみ存在します
ENCPoolMethod::FreeInPool をスポーン引数として扱うことNone、AutoRelease、または ManualReleasePublic/NiagaraComponentPoolMethodEnum.h の UMETA(Hidden)

よくある間違い

Niagara への C++ イベント経路がないと思い込むこと: 経路はあります。User. の bool を切り替えてスポーンスクリプトが適切なティックでサンプリングすることを期待するのではなく、ゲームプレイから Niagara へのイベントにはデータチャンネル(UNiagaraDataChannelLibrary)を使用してください。

毎ティックコンポーネントをスポーンすること: Tick 内で SpawnSystemAtLocation を呼び出すと、フレームごとにコンポーネントが作成・破棄されます。コンポーネントを一度だけ作成するか、個別のイベントでのみ ENCPoolMethod::AutoRelease を指定してスポーンしてください。

名前空間または型を間違えること: SetVariableFloat(FName("Emitter.Speed"), 300.f) や、Color パラメーターに対する SetVariableVec3 は、どちらも失敗しても何も通知されません。作成者は値を User.Speed として公開し、セッターは公開時の型に合わせる必要があります。また、ワールド座標は LWC が処理されるように SetVariablePosition 経由で設定してください。

スポーン呼び出しの戻り値を無視すること: 専用サーバー上、および事前カリングチェックでスポーンが拒否された場合、戻り値は nullptr です。コンポーネントにアクセスする前に null チェックしてください。

アウトオブライン定義に UFUNCTION() を付けること: このマクロは UCLASS 本体の内部でのみ意味を持ちます。.cpp 定義の前に UFUNCTION() を付けた OnSystemFinished ハンドラーはバインドされません。上記のようにヘッダーで宣言してください。

AutoRelease コンポーネントへのポインターを保持すること: システムが完了するとプールがただちにそのコンポーネントを再利用するため、後からアクセスするのは安全ではありません。長期間有効なハンドルが必要な場合は、ManualRelease と ReleaseToPool() を使用してください。

データインターフェースをコンポーネントのように扱うこと: UpdateLUT() は WITH_EDITORONLY_DATA であり、ガードが必要です。また、MarkRenderStateDirty() は存在しません。UNiagaraDataInterface は UObject を継承しています。配列の変更は次のシミュレーションティックで反映されます。カーブのキーの変更が反映されるのは、カーブ DI で bUseLUT がオフの場合のみです。

関連スキル

  • ue-materials-rendering — パーティクルマテリアル、ダイナミックマテリアルインスタンス、DI に渡すレンダーターゲット
  • ue-actor-component-architecture — コンポーネントの作成、アタッチ、アクティブ化、ライフサイクル
  • ue-animation-system — メッシュサンプリング DI を駆動するスケルタルメッシュのソケット、ノーティファイ、ボーンデータ
  • ue-gameplay-abilities — GameplayCue によるエフェクトのスポーンと、アビリティ単位の VFX 所有権
  • ue-audio-system — オーディオデータインターフェースを支えるサウンドサブミックスとスペクトラム解析
  • ue-async-threading — バックグラウンド処理から DI にデータを渡す際のレンダースレッドとタスクグラフのルール
  • ue-procedural-generation — 配列 DI とスプライン DI が使用するポイントデータとスプラインデータの生成
  • ue-sequencer-cinematics — Level Sequence、再生、シネカメラ、Movie Render Graph

コメント