UE4:BPマクロ/関数の入力でPass-by-Reference利用時の注意
UE4.8.3でBPのIncremenIntノードのOutputs変数Resultの値がなぜか期待する値より1多いので調べたところ、どうも入力に参照渡し(Pass-by-Reference有効)を利用して中で値を変更する場合、値の評価順序が感覚的に思っている順になっていませんでした。
バグでは無いならば、マクロ/関数の入力でPass-by-Referenceを利用して中で値を変更する場合は注意が必要です。
- 「IncrementIntノード」のResultは1多い値が返る。ちなみに「DecrementIntノード」は-1されないので、UE4.8.3時点で共にバグってる。
- マクロまたは関数のInputsで指定した変数のプロパティーPass-by-Referenceを有効にすると参照渡しになる。
- 誤:入力In Intの変数が+1された後、その変数の値を+1した値を出力Out Intから返す。「加算ノード」は「Set Integer(byRefn)ノード」時と「Outputノード」時の2回別々に呼ばれているみたい。
- 正:入力In Intの変数が+1された後、その変数の値を出力Out Intから返す
UE4:Beamを2つのActor間に発生させる(BP版)
前回は、BeamのEmitterのSourceとTargetをエディターのDetailsからプロパティInstanceParametersを追加して指定しましたが、今度は、BluePrint(BP)から設定してみました。
こっちのほうが実際は利用する気がします。
BeamのParticleからBPをつくり、そのBPのPostBeginPlayでNoteを二つ生成して、SetActorParameterで
SourceとTargetにそのNoteを設定しています。
UE4:Beamを2つのActor間に発生させる。
ラーニング動画をみてつくったBeamパーティクルを応用して、2つのActor(二つのNote)間にBeamを発生させてみました。
Emitter側で受け取るActor情報を配置したパーティクルのプロパティInstance Parametersを追加して指定するというのがわからずに手間取りました。
1,パーティクルエディタで、EmitterのSourceModuleのプロパティSourceMethodにActorを設定して、SourceNameに適当な名前をつける。TargetModuleにも同様な設定をする。
2,レベルに、ビームパーティクルとNoteを配置する。
3,配置したビームパーティクルのDetailsのグループParticlesにあるInstance ParametersにSourceとTargetを指定する為のパラメターを二つ追加する。
4,追加したパラメターのNameにパーティクルエディター側で指定したSourceNameとTargetNameを設定して、ParamTypeをActorに設定して、配置した二つのNoteを指定する。
5,正しく設定できていれば、二つのNoteの間にビームが発生します。
UE4:「Introduction to Particles in UE4」 を見て気づいたこと
UE4のパーティクルのラーニング動画「Introduction to Particles in UE4」を見終わったので、気づいたことを書きます。
全体
- 英語がわからなくても、画面を見ながら、トレースすれば、実際に手を動かして試すことができました。
- 「ContentsExampleプロジェクト」と「StarterContentsありのEmptyプロジェクト」があれば,ほぼ試せました。
- 試しながら全て見るのにだいたい半日ぐらいかかりました。
- 「Introduction to Particles in UE4」 はプレイリストは以下
各章
- 1 - Particle Terminology - YouTube
- UE4のパーティクルの仕組みの説明のみ
- 2 - Cascade at a Glance - YouTube
- カスケードの説明のみ
- 3 - Particle Level Setup new - YouTube
- これ以降のチャプターで利用するレベルの作成。
- 試すときは、ContentsExampleプロジェクトが必要
- 4 - Creating a Sprite Emitter - YouTube
- 一番基本のエミッターをつくるデモ
- エミッターのプロパティScreenAlignmentの設定デフォルトのSquareだと、XYZのスケールを別々してもすべてX値が適用されることがわかった
- CollisionのプロパティMaxCollisionの数字で実際に衝突するパーティクルの数を指定している。
- 試すときは、ContentsExampleプロジェクトが必要
- 5 - Creating a GPU Sprite Emitter - YouTube
- 6 - Creating a Mesh Emitter - YouTube
- 牛のメッシュを利用したパーティクルを作るデモ
- メッシュのマテリアルをパーティクルシステム側から上書きして、色などを変化させられる。
- パーティクルシステム側からメッシュの色を変えるときは、上書きするマテリアルにParticleColorをInputDataとして設定する必要がある。
- 試すときは、ContentsExampleプロジェクトが必要
- 7 - Creating a Beam Emitter - YouTube
- 始点と終点を指定してその間にビームを走らせるデモ
- 試すときは、ContentsExampleプロジェクトが必要
- 始点と終点を指定するSourceとTargetにActorを設定すれば、二つのActor間にビームを走らせることができるみたい。
- 試すときは、ContentsExampleプロジェクトが必要
- 8 - Creating a Ribbon Emitter - YouTube
- パーティクルの後ろにリボン(軌跡っぽいもの)をつけるデモ
- レザーとかビームとか光の軌跡みたいなもののマテリアルは、テクスチャ素材がなくても、数式だけで結構作れるみたい。
- 1章で作ったマテリアルと7章でつくったマテリアルをコピーして、利用して作っている。
- 試すときは、ContentsExampleプロジェクトが必要
- 9 - Creating an AnimTrail Emitter - YouTube
- 体の部位を動かした後に軌跡エフェクトをつけるデモ
- AnimTrailをアニメーションのどのタイミングでどの箇所につけるか?は、AnimationSequence側で設定するみたい。
- AnimTrailのプレビューはパーティクルシステム側のプレビュー画面では表示されなのでAnimationSequence側のプレビューで確認する必要がある。
- 試すときは、ContentsExampleプロジェクトが必要
- 10 - Starter Content Particle Systems - YouTube
- 「StarterContent」の中に入っているパーティクルの仕組みの説明です。ほぼ説明だけ。
- 壁にパーティクルのスプライトがめり込んで切れたように見えないようにするには、マテリアルで「DepthFade」を利用するらしい。
- 試すときは、「StarterContent」が必要
- 11 - Particle LODs - YouTube
- 煙のパーティクルに2段階のLODをつけるデモ
- LODのレベルに応じて、パラメータの数値だけでなく、エミッターのON・OFFも変えられるみたい。
- 試すときは、「StarterContent」が必要
UE4:パーティクルのチュートリアル
パーティクルのチュートリアルは、公式ドキュメントには見当たりませんでした。
パーティクルのシステムはUE3とほぼ同じのようなので、UE3のチュートリアルのページをみながら、パーティクルを試しました。
- ここのパーティクルで雪を降らせるチュートリアルは、UE4でも試せました。
-
- SubUVをつかったスプライトパーティクルのチュートリアル
UDK | ParticleSpriteSubUVEmitterTutorialJP
本当に、QuickStartレベルです。
ちゃんと覚えたいならば、そのあとは、英語ですが、公式ラーニングの動画をみるのが、いいっぽいので見てます。www.youtube.com
UE4:エディタでプロパティーを変更したときの呼ばれるPostEditChangeProperty について
エディタでプロパティーを変更したときの呼ばれるC++関数PostEditChangeProperty で取得できる
PropertyとMemberPropertyの違いを実際に値を変更して調べてみました。
LocationもRotationもScaleもXを変更した場合はPropertyにはXが返ってくることを期待したのですが、なんか違ってました。
バグかも。
LocationのXを変更した場合
LogTemp: PostEditChangeProperty Property:RelativeLocation MemberProperty:RelativeLocation
RotationのXを変更した場合
LogTemp: PostEditChangeProperty Property:RelativeRotation MemberProperty:RelativeRotation
ScaleのXを変更した場合
LogTemp: PostEditChangeProperty Property:Z MemberProperty:RelativeScale3D LogTemp: PostEditChangeProperty Property:RelativeScale3D MemberProperty:RelativeScale3D
#if WITH_EDITOR //エディターで値を変更するとその時呼ばれる void AMyActor::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent){ Super::PostEditChangeProperty(PropertyChangedEvent); const FName PropertyName = PropertyChangedEvent.Property == nullptr ? NAME_None : PropertyChangedEvent.Property->GetFName(); const FName MemberPropertyName = PropertyChangedEvent.MemberProperty == nullptr ? NAME_None : PropertyChangedEvent.MemberProperty->GetFName(); UE_LOG(LogTemp, Log, TEXT("PostEditChangeProperty Property:%s MemberProperty:%s"), *PropertyName.ToString(), *MemberPropertyName.ToString()); } #endif