Files
UnrealEngineUWP/Engine/Documentation/Source/Programming/Rendering/ParticleModules/ParticleModules.JPN.udn
Jason Bestimt 23eb9d381e #DEV-VR - Merge MAIN @ CL 4091939
#RB:none

[CL 4094007 by Jason Bestimt in Dev-VR branch]
2018-05-25 10:16:49 -04:00

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
![ColorByVelocity.JPG](ColorByVelocity.JPG)