パーティクル モジュール テクニカル ガイド

新規エミッタ タイプを追加して、パーティクル システムのビヘイビアをカスタマイズする方法 (プログラマー向け)

Windows
MacOS
Linux

UE4 のパーティクル システムは、多数のパーティクル エミッタより構成され、それぞれが、パーティクルの動作方法に影響するモジュールを含みます。カスタム モジュールとエミッタ タイプを使用してシステムを拡張することは、非常に簡単です。本ページではその方法を紹介します。

ParticleModule 基本クラス

すべての ParticleModule は、同じ基本クラス、ParticleModule (UE4/Engine/Source/Runtime/Engine/Classes/Particles/Modules/ParticleModule.h で定義) から派生します。

メンバ変数

ParticleModule クラスには、次のメンバ変数が含まれます。

変数

概要

bSpawnModule

モジュールが、 Spawn パーティクルを導くことを要求しているかどうかを示すブール変数 (Spawn()/SpawnEditor() 関数が何かをするなど)。デフォルト値は false です。

bUpdateModule

モジュールが、更新するパーティクルを導くことを要求しているかどうかを示すブール変数 (Update()/UpdateEditor() 関数が何かをするなど)。デフォルト値は false です。

bCurvesAsColor

モジュールのディストリビューション (カーブ) プロパティが、カラー データを含むかどうかを示すブール変数。true である場合、カーブ エディタで描いたカーブは、割り当てられた`ModuleEditorColor`ではなく、現在のカラーを表示します。デフォルト値は false です。

b3DDrawMode

モジュールが、 3D ビジュアライゼーション ヘルパーをレンダリングする必要があることを示すブール変数。デフォルト値は false です。

bSupported3DDrawMode

モジュールが、3D ビジュアライゼーション ヘルパーのレンダリングをサポートすることを示すブール変数 (Render3DPreview() 関数が何かをするなど)。デフォルト値は false です。

bEnabled

モジュールが有効であるかどうかを示すブール変数。デフォルト値は、true です。

bEditable

モジュールがデザイナーによって有効にされたことを示すブール変数。低い LOD レベルが修正されたかどうかを判断するために LOD レベルで使用されます。デフォルト値は、true です。

ModuleEditorColor

モジュールに関連付けられたカラーです。カーブ エディタで描かれたモジュールのカーブは、このカラーを使用して表示します。

bCurvesAsColor が有効である場合、カーブは、カーブが示す実際のカラー値で描かれます。

ModuleType エミュレーションも、このクラスで定義します。このタイプにより、どのタイプのエミッタがモジュールを使用できるかが示されます。次の表に、利用可能なタイプの説明が示されています。

タイプ (EPMT)

説明

General

すべてのエミッタ タイプによって使用可能な一般のモジュール。

TypeData

このモジュールは TypeData モジュールで、インスタンス化されるエミッタ クラスに命令。

Beam

モジュールは、ビーム エミッタによってのみ使用可能。

Trail

モジュールは、トレール エミッタによってのみ使用可能。

メンバ関数

モジュールを作成時、 ParticleModule クラスには、それに関連した仮想メンバ関数が含まれています。(その他に多数のメンバ関数がありますが、カスタム モジュールの話題とは関連していないので、このことについてはふれません。)以下はリストになります。

関数

概要

void Spawn(FParticleEmitterInstance* Owner, int32 Offset, float SpawnTime)

エミッタにより新しくスポーンされるパーティクルに呼び出されます。ここでモジュールが、各パーティクルの作成時の最初の値を設定 / 修正をすることができます。

void Update(FParticleEmitterInstance* Owner, int32 Offset, float DeltaTime)

エミッタにより更新されるパーティクルに呼び出されます。カラーや速度の変更など、更新中のパーティクルへの処理を、モジュールはここで実行します。

uint32 RequiredBytes(UParticleModuleTypeDataBase* TypeData)

モジュルがパーティクル ペイロード ブロックで要求するバイト数を返します。これにより、モジュールがパーティクルごとに必要なデータを保存できます。

uint32 RequiredBytesPerInstance()

モジュールが、エミッタの インスタンスごとの データ ブロックで要求するバイト数を返します。これにより、モジュールがエミッタインスタンスごとに必要なデータを保存できます。

virtual void CompileModule( struct FParticleEmitterBuildInfo& EmitterInfo )

CompileModule()は GPU パーティクル エミッタと使用可能なモジュールに対して実行されなければなりません。そのモジュールはエミッタ情報構造体を修正してモジュールのエフェクトをシミュレーションに適用します。

カスタム モジュールを書く

カスタム モジュールを作成するには、上記の関数をオーバーライドし、必要な処理を実装するだけです。例として、『パーティクル カラー』 = 『ベース カラー』 X 『ディストリビューション生成要素により計測された速度』 設定を実装するモジュールが作成されます。

モジュールの基本クラスは、ヘッディングを定義します。これは、Cascade の [Module (モジュール)] メニューを 右クリック することで表示されます。この例では、モジュールが カラー サブメニューで表示されることを確認するため、ParticleModuleColorBase クラスから派生させるようにします。

モジュールの宣言

UCLASS(editinlinenew,collapsecategories,hidecategories=Object)
public class UParticleModuleColorByVelocity : public UParticleModuleColorBase
{
    /**

     *   This is the value to scale each corresponding velocity element by prior
     *   to setting it as the color.The value is retrieved using the 
     *   Particle.RelativeTime.
     *
     *   For example, if the ScaleVelocity was (0.25,0.5,1.0) and the velocity
     *   was (2.0,2.0,0.0), then the particle color would be set to (0.5,1.0,0.0);
     */

    var(Color)   rawdistributionvector   ScaleVelocity;

    cpptext
    {
       virtual void   Spawn(FParticleEmitterInstance* Owner, int32 Offset, float SpawnTime);
       virtual void   Update(FParticleEmitterInstance* Owner, int32 Offset, float DeltaTime);
    }
}

注目すべき点:

  1. モジュールは、スポーンおよび更新の両段階でパーティクル上で動作するようにマークされます (bSpawnModule および bUpdateModule は、両方とも true に設定されます)。

  2. 弊社のモジュールは、パーティクル単位またはインスタンス単位のデータを必要としません。したがって、RequiredBytes*() 関数をオーバライドする必要はありません。

この例では、 ColorByVelocity モジュールがエミッタ モジュール スタックの前に InitialColor モジュールのあるエミッタが必要になります。 操作されているパーティクルの色を表示するのため、VertexColor 表現式を利用するマテリアルを使うパーティクル エミッタが必要です。

モジュールの実装

コンストラクタは DistributionVectorConstant を作成して ScaleVelocity を割り当て、パーティクルのスポーンと更新の両方を行うようにエンジンに命令します。

UParticleModuleColorByVelocity::UParticleModuleColorByVelocity(const FObjectInitializer& ObjectInitializer)
:Super(ObjectInitializer)
{
    bSpawnModule = true;
    bUpdateModule = true;

    UDistributionVectorConstant* DistributionScaleVelocity = ConstructorHelpers::CreateDefaultSubobject<UDistributionVectorConstant>(this, TEXT("DistributionScaleVelocity"));
    DistributionScaleVelocity->Constant = FVector(1.0f, 1.0f, 1.0f);
    ScaleVelocity.Distribution = DistributionScaleVelocity;
}

Spawn() 関数では、コードがパーティクル上に持つあらゆる初期効果を設定します。モジュールが全て Spawn() の呼び出しが必要なわけではありませんが、この例では必要です。

void UParticleModuleColorByVelocity::Spawn(FParticleEmitterInstance* Owner, int32 Offset, float SpawnTime)
{
   SPAWN_INIT;
   {
      FVector ColorScale    = ScaleVelocity.GetValue(Particle.RelativeTime, Owner->Component);
      Particle.Color        = FLinearColor(
                                            Particle.BaseColor.R * Particle.Velocity.X * ColorScale.X,
                                            Particle.BaseColor.G * Particle.Velocity.Y * ColorScale.Y,
                                            Particle.BaseColor.B * Particle.Velocity.Z * ColorScale.Z);
   }
}

Spawn() 関数は、Particle.RelativeTime を使用するディストリビューションからの ScaleVelocity 値を取得します。この値に速度をかけるた値が、スケーリングされた速度です。そして、Particle.Color はこのスケール速度の結果をかけた BaseColor として設定されます。

SPAWN_INIT は、パーティクル データにアクセス時に一般的に使用される値 (例えば、パーティクル ペイロードへのオフセット トラッキングなど) と同様、スポーンされるパーティクルに FBaseParticle 参照を設定するマクロです。詳細については //depot/UE4/Engine/Source/Runtime/Engine/Public/ParticleHelper.h を参照してください。

これは、Particle.Color を直接設定する有害なモジュールであることに注意してください。Particle.Color を変更したのみの先行したモジュールは、全て (この時点で) 意味を成さなくなります。ただし、 Initial Color モジュールのように BaseColor も同様に変更した場合、その値に依然効力があることになります。

Update() 関数は、多かれ少なかれ Spawn() と同じです。異なる点は、それぞれのアクティブなパーティクルは、シングル ループで更新されるということです。

void UParticleModuleColorByVelocity::Update(FParticleEmitterInstance* Owner, int32 Offset, float DeltaTime)
{
   BEGIN_UPDATE_LOOP;
   {
      FVector ColorScale    = ScaleVelocity.GetValue(Particle.RelativeTime, Owner->Component);
      Particle.Color        = FLinearColor(
                                             Particle.BaseColor.R * Particle.Velocity.X * ColorScale.X,
                                             Particle.BaseColor.G * Particle.Velocity.Y * ColorScale.Y,
                                             Particle.BaseColor.B * Particle.Velocity.Z * ColorScale.Z);
   }
   END_UPDATE_LOOP;
}

BEGIN_UPDATE_LOOP/END_UPDATE_LOOP は、全てのアクティブなパーティクルをループし、両マクロ間のコードを各パーティクル上で実行するためのコードブロックを展開するマクロです。詳細は UnParticleHelper.h を参照してください。

次のスクリーン ショットには、アクション中の ColorByVelocity モジュールが表示れています。パーティクルの InitialVelocity は、ランダムに [(0,0,0)、(200,200,0)] に設定されています。各パーティクルの InitialColor は白に設定されています。ColorByVelocity の VelocityScale 値は、 (0.005, 0.005, 0) の定数に設定されています。この結果、各パーティクルは、以下に設定されたカラーを含みます:

Velocity * VelocityScale

ColorByVelocity.JPG

Tags
Select Skin
Light
Dark

Welcome to the new Unreal Engine 4 Documentation site!

We're working on lots of new features including a feedback system so you can tell us how we are doing. It's not quite ready for use in the wild yet, so head over to the Documentation Feedback forum to tell us about this page or call out any issues you are encountering in the meantime.

We'll be sure to let you know when the new system is up and running.

Post Feedback