You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
159 lines
12 KiB
Plaintext
159 lines
12 KiB
Plaintext
INTSourceChangelist:3151855
|
|
Availability:Docs
|
|
Title:パーティクル モジュール テクニカル ガイド
|
|
Crumbs:%ROOT%, Programming, Programming/Rendering
|
|
Description:新規エミッタ タイプを追加して、パーティクル システムのビヘイビアをカスタマイズする方法 (プログラマー向け)
|
|
Version:4.9
|
|
tags:Rendering
|
|
|
|
[TOC (start:2 end:3)]
|
|
|
|
|
|
|
|
|
|
|
|
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` | モジュールに関連付けられたカラーです。カーブ エディタで描かれたモジュールのカーブは、このカラーを使用して表示します。[REGION:note] `bCurvesAsColor` が有効である場合、カーブは、カーブが示す実際のカラー値で描かれます。 [/REGION] |
|
|
|
|
`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` に設定されます)。
|
|
1. 弊社のモジュールは、パーティクル単位またはインスタンス単位のデータを必要としません。したがって、`RequiredBytes*()` 関数をオーバライドする必要はありません。
|
|
|
|
[REGION:warning]
|
|
この例では、 **ColorByVelocity** モジュールがエミッタ モジュール スタックの前に **InitialColor** モジュールのあるエミッタが必要になります。
|
|
操作されているパーティクルの色を表示するのため、**VertexColor** 表現式を利用するマテリアルを使うパーティクル エミッタが必要です。
|
|
[/REGION]
|
|
|
|
#### モジュールの実装
|
|
|
|
コンストラクタは `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` を参照してください。
|
|
|
|
[REGION:note]
|
|
これは、`Particle.Color` を直接設定する有害なモジュールであることに注意してください。`Particle.Color` を変更したのみの先行したモジュールは、全て (この時点で) 意味を成さなくなります。ただし、 **Initial Color** モジュールのように `BaseColor` も同様に変更した場合、その値に依然効力があることになります。
|
|
[/REGION]
|
|
|
|
**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
|
|
|
|

|
|
|