PaperSloth’s diary

主にゲーム開発関連についての記事を書きます。

UE4 NiagaraExtrasについて

環境

UE4.19.0


概要

NiagaraにはNiagara Pluginとは別にNiagaraExtrasというプラグインがあります。
このプラグインがサンプルとしてすごく参考になるので紹介します。


NiagaraExtrasの有効化

NiagaraExtrasはNiagaraと同じPluginsのFXカテゴリにあります。
有効化した際にはエディタの再起動が必要になります。
f:id:PaperSloth:20180326232701p:plain


NiagaraExtrasPluginの見方

ContentBrawser上でShow Engine ContentとShow Plugin Conentを有効化します。
これでEngineにインストールされたPluginの一覧を見ることが出来ます。
f:id:PaperSloth:20180326232835p:plain

ContentBrawserを下にスクロールしていくとNiagaraExtras Contentがあります。
f:id:PaperSloth:20180326233031p:plain


NiagaraExtrasとは

さて、ようやく本題に入ります。

実はNiagaraExtrasにはC++ソースコードが含まれていません。
その代わりにNiagaraのサンプルと便利なNiagara Function ScriptとNiagara Module Scriptが含まれています。

サンプルというのはNiagara Emitterで、これを開くだけで圧巻です。
f:id:PaperSloth:20180326233700p:plain

以下がサンプルの実行結果です。

なんだか弾幕シューティングみたいですね!

これを少しいじるだけで下記のようなエフェクトが簡単に作れます。



Niagaraを触り始めたけど、なかなか上手く作れないという人はNiagara Extrasを参考にして色々なエフェクトを作ってみてください!
f:id:PaperSloth:20180326234256p:plain

UE4 NiagaraとBlurprintの連携

環境

UE4.19.0


概要

今回はNiagaraActor, NiagaraComponentについても軽く触れます。

前回と前々回の記事も参考にしてください。
前回
papersloth.hatenablog.com
前々回
papersloth.hatenablog.com


Niagaraと連携するためのノード

f:id:PaperSloth:20180326223627p:plain

Niagaraを利用する上で使うノードは基本的には上記の3つです。
これらはNiagaraFunctionLibraryの中に定義されています。
Engine\Plugins\FX\Niagara\Source\Niagara\Public\PublicNiagaraFunctionLibrary.h
Engine\Plugins\FX\Niagara\Source\Niagara\Private\NiagaraFunctionLibrary.cpp
NiagaraParameterCollectionはまだ解析できていないため、今回は説明を省かせていただきます。

Cascadeを利用したことがある方は先程のノードを見ただけでピンときたかもしれません。
実は今まで何度も使っているノードと使い方が一緒なんですね。
f:id:PaperSloth:20180326224404p:plain

Spawn - AtaLocationはその指定した場所にエフェクトを生成します。
Spawn - Attachedは指定したComponentにエフェクトのコンポーネントを追加します。


BlueprintからNiagaraを生成する

Level BlueprintでNiagaraを生成してみました。
この時にSystem Templateに指定するのはNiagara Systemになります。
f:id:PaperSloth:20180326225536p:plain

今回はサンプルのNiagara Emitterを登録しただけのNiagara Systemです。
実行結果は下記のようになります。

これさえ分かればあとはヒット時の処理でヒットエフェクトを出したり
攻撃時の処理で斬撃エフェクトを出したりできるようになりますね。


既存のBlueprintにNiagaraをアタッチする

キャラクターBlueprintがあって、そのBlueprintにエフェクトをアタッチしたい場合の例を紹介します。
ロボやジェットパックのブーストエフェクトとかとかですね。
f:id:PaperSloth:20180326230609p:plain

方法① NiagaraComponentを追加する
AddからNiagaraを選択してNiagaraComponentを追加するパターンです。
これもCascadeと使い方は同じなので直感的ですね。
f:id:PaperSloth:20180326230841p:plain

方法② Spawn System Attachedを使って任意のタイミングで追加する
f:id:PaperSloth:20180326231237p:plain

今回はMeshにNiagaraComponentを追加した場合です。
BeginPlayで行っているので、動きとしては特別なことはありませんが
アイテムを拾ったときなどタイミングは様々ですね。



今回はBlueprintからの呼び出しについて紹介しました。
Cascadeを触ったことがある人にはおなじみの内容でしたね。
他にもCascadeと変わっていない部分が幾つかあるので、Cascadeを触ったことがある人なら直ぐに馴染めます!

UE4 CascadeからNiagaraへ

環境

UE4.19.0


概要

Cascadeは触ったことがあるけど、Niagaraは初めてという人向けです。
Cascadeについては知っている前提で書いています。

また、手っ取り早く何か動かしたいという方はこちらも参考にしてください。
UE4 Niagara入門 - PaperSloth’s diary


CascadeNiagaraの画面の違い

CascadeNiagara System

先ずは従来のCascadeの画面
f:id:PaperSloth:20180326001237p:plain

そして、それに該当するのが
Niagara Systemです。
f:id:PaperSloth:20180326001525p:plain
f:id:PaperSloth:20180326001530p:plain

しかし、Niagara Systemを新規作成した段階では空の画面が表示されます。
f:id:PaperSloth:20180326001633p:plain

CascadeNiagara Emitter

新規作成したCascadeNiagara Systemの違いはEmitterの有無です。
CascadeのEmitterとはこれですね。
f:id:PaperSloth:20180326001830p:plain

Cascadeでは複数のEmitterを組み合わせてヒットエフェクトや爆発エフェクト等を作成しますね。
これはNiagaraも同様です。
しかし、Niagaraは個々のEmitterは別アセットとして持つことになります。

それがNiagara Emitterです。
f:id:PaperSloth:20180326002035p:plain

Niagara SystemにNiagara Emitterを追加する方法は2つあります。
方法① Niagara SystemのTimelineにNiagara EmitterをDrag & Dropする
f:id:PaperSloth:20180326003235p:plain

方法② Timelineの+Trackから追加する
f:id:PaperSloth:20180326003350p:plain

CascadeのModuleとNiagara Module Script

Cascadeでのパラメーター調整はModuleを使用して行いますね。
CascadeでのModuleは赤枠で囲ったパラメーター一つ一つがModuleですね。
f:id:PaperSloth:20180326002543p:plain

続いてNiagaraでのModuleです。
Niagara Emitterの赤枠で囲ったパラメーター一つ一つがNiagara Module Scriptです。
f:id:PaperSloth:20180326002912p:plain

Niagara Module Scriptは下記から追加することが出来ます。
f:id:PaperSloth:20180326004919p:plain

CascadeNiagaraのアセットの違い

一旦ここまででまとめます。
CascadeのAsset1つにおさまっていたものがNiagaraでは分離されています。

CascadeNiagara System
CascadeのEmitter → Niagara Emitter
CascadeのModule → Niagara Module Script

実際にNiagaraで使用しているModuleはもっと多いですが
大まかに下図の2つで結果は同じです。
f:id:PaperSloth:20180326004049p:plain


Niagaraについて

これまでの説明だとNiagaraCascadeの1画面におさまっていたものが分離されて
Asset管理が面倒になっただけに見えます。

しかし、Niagara Module Scriptはとても魅力的なものです。

従来のCascadeは複雑な動きはVector Fieldを使用しないと作れないものもありました。
しかし、Niagaraでは動き、生成数、大きさ、回転等のあらゆるものをScriptで制御できるようになりました。

先程のNiagaraModuleを見てみましょう。
試しにこのAdd Velocityをダブルクリックで開いてみましょう。
f:id:PaperSloth:20180326004519p:plain

すると動きの処理はノードエディタで計算されていることが分かります。
これがNiagara Module Scriptの中身です。
f:id:PaperSloth:20180326004609p:plain


そして、このNiagara Module ScriptではSin, Cos等の計算も可能です。
そこで、新規に下図のようなNiagara Module Scriptを追加してParticle Updateに追加するだけで
f:id:PaperSloth:20180326005144p:plain

Vector Fieldなしでも渦のような動きを作ることが出来ます。


また、Niagara Module Scriptは他のNiagara Emitterでも再利用できます。
そのため、便利なNiagara Module Scriptを大量に作ってしまえば
それだけでほとんどのエフェクトの動きを作ることも出来てしまいます。


なんとなくCascadeからNiagaraに移行できそうな気がしてきましたか?
Niagaraは無限の可能性を秘めていますね!
さぁ!早速Niagaraを触ってみましょう!

UE4 Niagara入門

環境

UE4.19.0


概要

下記のShadowriverさんが作成してくださったチュートリアルを概ねなぞった内容になります。
動画の大凡52分までの手順をなぞることで同じものが作れます。
動画ではUE4.18で作成されているため、UIの配置や名前が異なっている箇所があります。
State of Niagara in Unreal Engine 4.18 - YouTube

CascadeからNiagaraへの移行ガイドも簡単にですが用意したのでこちらも見てください。
UE4 CascadeからNiagaraへ - PaperSloth’s diary



Niagaraを有効化する

UE4.19ではNiagaraはPluginとして提供されています。

PluginsのFXカテゴリの中にNiagaraがあるので、有効化することで利用できます。
Pluginを有効にした後はエディタの再起動が必要です。
f:id:PaperSloth:20180325175409p:plain


Emitterを作ってみる

Particleを作成するとなると先ずはEmitter(発生源)を作成するところからですね。

Niagara関連の項目はFX以下にあります。
f:id:PaperSloth:20180325175627p:plain


先ずはEmitterを作成してみましょう。
Niagara Emitterを作成すると下図のようなEditorが開きます。
f:id:PaperSloth:20180325175858p:plain

しかし、このままでは色等のパラメーターを変更しても変化がわからないため
Particle用のMaterialを割り当てます。
今回は下記のような簡単なMatarialを作成しました。
BlendMode : Translucent
Shading Model : Unlit
f:id:PaperSloth:20180325180748p:plain

これをNiagara EmitterのMaterialに割り当ててみましょう。
f:id:PaperSloth:20180325180927p:plain

結果は下図のようになります。
f:id:PaperSloth:20180325181025p:plain

Colorを変えたりして結果が反映されることを確認しましょう。
f:id:PaperSloth:20180325181124p:plain


EmitterのNodeGraphを使ってみる

次にNiagaraのNodeGraphを見ていきます。

Window > Selected Emitter Graphから開くことが出来ます。
f:id:PaperSloth:20180325182308p:plain
f:id:PaperSloth:20180325182422p:plain


先ずは動きを追加してみます。
Particle Update内の+ボタンを押下し、VelocityのAddVelocityを追加します。
f:id:PaperSloth:20180325182942p:plain

Emitter Graphを開くと新たにAdd Velocityが追加されていることが確認出来ます。
グラフのOutputはそれぞれ上から順に
・EmitterSpawn
・EmitterUpdate
・ParticleSpawn
・ParticleUpdate
Add VelocityはParticleUpdateのカテゴリなので、ParticleUpdateの末尾に追加されました。
f:id:PaperSloth:20180325183151p:plain

続いてAddVelocityノードをダブルクリックするとAddVelocityノード内の処理を見ることが出来ます。
f:id:PaperSloth:20180325183516p:plain


Niagara Module Scriptを作成する(移動の練習)

先程作成したAdd VelocityをNiagara Module Scriptとして別名で保存します。
f:id:PaperSloth:20180325183657p:plain
f:id:PaperSloth:20180325183922p:plain
f:id:PaperSloth:20180325184014p:plain

下図のように新規作成しても問題はありません。
f:id:PaperSloth:20180325184150p:plain

先ずはノード内の処理を一旦全て削除し
Parameter Map Getノードを呼び出します。
f:id:PaperSloth:20180325184358p:plain

続いてMapノードの+ボタンを押下して
ParticlePositionを取得します。
f:id:PaperSloth:20180325184536p:plain

取得した値に変更を加えるためにAddノードを呼び出します。
f:id:PaperSloth:20180325184724p:plain

ここまでで一旦Parameterの取得、セットまでを行ってしまいましょう。
f:id:PaperSloth:20180325184948p:plain

このままでは取得した値に何の変更も加えていないため、Vectorを追加します。
f:id:PaperSloth:20180325185121p:plain

Zに10をセットし、上方向への移動を加える処理が出来ました。
f:id:PaperSloth:20180325185802p:plain
f:id:PaperSloth:20180325185854p:plain

しかし、これでは変更が反映されないためEmitterのグラフを下図のように繋ぎ変えましょう。
f:id:PaperSloth:20180325190020p:plain

すると先程より早い速度でパーティクルが上に移動することが確認出来ます。
f:id:PaperSloth:20180325190048p:plain

試しにXYに乱数を与えたりして動きが変わることを確認しましょう。
f:id:PaperSloth:20180325190249p:plain


Niagara Module Scriptを作成する(Emitterからの入力)

DeltaTimeの取得
Tickノード等の引数にあるDeltaTimeの取得は下記のように CommonEngine~から取得できます。
f:id:PaperSloth:20180325190835p:plain

DeltaTimeを先程のVectorと掛け合わせると移動が緩やかになったのが確認できます。
f:id:PaperSloth:20180325191155p:plain

DeltaTimeには前のフレームと今のフレームの間の時間の差分が格納されています。
そのため、この値を掛け合わせることで処理落ちした場合や30fpsでも120fpsでも意図した通りに動作します。

さて、次にEmitterから入力できるパラメーターを追加しましょう。
Define Module Localで定義されたパラメーターを追加するとEmitterから値を更新することができるようです。
ここではVectorにSpeedという名前を付けました。
f:id:PaperSloth:20180325191943p:plain

試しにSpeedの値を足して動かしてみましょう。
f:id:PaperSloth:20180325192017p:plain

SpeedのXに5を入れてみるとX軸方向に移動していることが確認できますね。
f:id:PaperSloth:20180325192158p:plain

因みにUE4.19でNiagara Emitterを作成した場合は最初からAddVelocityが登録されているため
この値を0に戻しておきます。
f:id:PaperSloth:20180325192351p:plain
f:id:PaperSloth:20180325192417p:plain

これで完全にX軸のみの移動となりました。
f:id:PaperSloth:20180325192455p:plain


Niagara Module Scriptを作成する(渦を作る)

先程作成したノードを幾つか削除して下図のようにします。
ここから動きを作っていきましょう。
f:id:PaperSloth:20180325192913p:plain

まず最初に新しいパラメーターとしてSpriteRotationを追加します。
名前はAgeとして登録します。
f:id:PaperSloth:20180325193647p:plain
f:id:PaperSloth:20180325193750p:plain

また、先程の手順でやったようにModuleの追加で
AplitudeとFrequincyを追加します。
f:id:PaperSloth:20180325194300p:plain

ModuleはDefine Module Localから追加でしたね。
f:id:PaperSloth:20180325194432p:plain

続いて下記のようにノードを組みます。
f:id:PaperSloth:20180325195201p:plain

AplitudeとFrequincyに値を入れます。
f:id:PaperSloth:20180325195335p:plain

しかし、これだけではX軸にSinカーブを描くだけになってしまうため
先程0にしたAdd Velocityを再びZを100にします。
f:id:PaperSloth:20180325195619p:plain

そうすると下図のようにX軸上に渦を描くことが出来ました。
f:id:PaperSloth:20180325195807p:plain


Niagaraで作成したエフェクトをLevelに配置する

さて、これでエフェクトは一旦完成したのですがこのままではLevelに配置できません。
配置するにはNiagaraActorをNiagaraSystemが必要になります。


先ずはNiagaraSystemを作成します。
f:id:PaperSloth:20180325200951p:plain

Systemを開いても特に何も表示されません。
f:id:PaperSloth:20180325201123p:plain

SystemのTimelineに先程作成したNiagaraEmitterをドラッグ&ドロップするとEmitterのPreviewが表示されます。
f:id:PaperSloth:20180325201328p:plain

これでSystemの準備整ったので、続いてNiagaraActorの作成です。
※NiagaraSystemだけでもレベル上に配置することが可能です。
f:id:PaperSloth:20180325201426p:plain

NiagaraActorを開くとNiagaraComponentがあります。
f:id:PaperSloth:20180325201524p:plain

そのComponent内にNiagara System Assetがあるので、そこに先程作成したSystemを設定します。
f:id:PaperSloth:20180325201724p:plain

これであとはActorをLevelに配置すればゲーム上でも使えますね!
f:id:PaperSloth:20180325201915p:plain


まとめ

最後に少し弄ってこうなりました!


動画の手順をなぞるだけで解説が不十分なのですが
手順を追ってみると何をするとどういう動きになるのか
どうやって作るのかという感覚は得られると思います。

Shadowriverさんに感謝!

SVN ゲームエンジンのプロジェクトを管理しよう

環境

Windows10
TortoiseSVN 1.9.6
Unity 2017.1.0f3
Unreal Engine 4.19.0


概要

VCSを仕事でも趣味でも使っていなくて、興味はあるけどどうしたらいいか分からない。
そんな人向けのローカルでのバージョン管理の続きです。

前回
papersloth.hatenablog.com


Unityプロジェクトを管理してみる

今回はリポジトリの作成、チェックアウトまで済んだところから始めます。
チェックアウトしたフォルダ内にUnityプロジェクトを作成しましょう。

前回同様に先ずは追加から。
f:id:PaperSloth:20180321151701p:plain

最初にプロジェクトを作成した段階だと
Asset以下とProjectSettingsを追加しましょう。
f:id:PaperSloth:20180321151912p:plain

さて、Unityで管理するデータですが全てを管理する必要はありません。
そこで、前回紹介できなかった無視リストの活用をしてみましょう。

無視リストの活用

先ずはLibraryフォルダ以下のデータをバージョン管理から除外します。
無視リストに追加されたデータは今後追加、コミットをする際の選択肢から除外されて管理がしやすくなります。

無視リストへの追加は下図のように2種類あります。
Library
Library (recursively) または Library (再帰的)

この2つの違いですが、再帰的を選択すると
このフォルダだけでなく、すべてのサブフォルダも同様に無視されます。
この機能はSVN1.8以上が必要になります。

今回は通常のLibraryを無視リストへの追加を選択します。
f:id:PaperSloth:20180321152109p:plain

するとLibraryフォルダから ? マークが消えました。
これでバージョン管理外のデータとして扱う事ができます。
f:id:PaperSloth:20180321152702p:plain

同様にTempフォルダも管理する必要が無いため、無視リストに追加してしまいましょう。

あとは必要なデータだけをコミットして完了です。
f:id:PaperSloth:20180321152849p:plain

Diffツールの活用

この時無視リストに追加したデータは(ProjectName)フォルダに記入されています。
コミット画面にある(ProjectName)ここではNewUnityProjectフォルダをダブルクリックしてみましょう。
するとTortoiseMergeというツールが立ち上がります。
左画面が変更前のデータ、右画面が変更後(今回変更した)データになります。
Library, Tempが追加されていることが確認できますね。
f:id:PaperSloth:20180321153437p:plain

今回は無視リストと差分の見方について紹介しました。
もう少し作業を続けてみましょう。
続いてPlayerControllerのスクリプトを追加しました。
f:id:PaperSloth:20180321154125p:plain

これでコミットしようとすると色々とデータが増えていますね。
今回は.vsとobjが必要ないのでまた無視リストに追加します。
無視リストへの追加はコミットのメニューからも行えます。
しかし、メニューが4種類になっていますね。
"*"を選択してしまうと
プロジェクト以下のバージョン管理したいデータも無視リストに加えてしまいます。
ここでは.vsを選択します。
f:id:PaperSloth:20180321154416p:plain

同様にobjも無視リストに加えましょう。
これで随分とスッキリしましたね。
さて、状態のところがバージョン管理外となっているので、これらも追加をしてやる必要がありますね。
f:id:PaperSloth:20180321154745p:plain

ですが、追加を行わなくても下図のように選択してコミットを行うことで追加とコミットをまとめて行ってくれます。
f:id:PaperSloth:20180321154932p:plain
f:id:PaperSloth:20180321155106p:plain

続いて先程さらっと流してしまった差分の見方についてもう一度おさらいをしましょう。
PlayerContollerを先程作成してコミットしましたね。
あのクラスに少しを変更を加えて差分を確認してみましょう。
f:id:PaperSloth:20180321155410p:plain

先程コミットしたので、状態がバージョン管理外から変更になっていますね。
PlayerContollerをダブルクリックしてTortoiseMergeを開いてみましょう。
左側が変更前の元データで右側が変更後の現在のデータでしたね。
削除した行はグレーで表示され、変更された箇所は黄色で表示されていることが確認できます。
f:id:PaperSloth:20180321155547p:plain

変更の取り消し

続いて変更の取り消しについて紹介します。
バージョン管理を使う理由の1つですね。
先程差分の確認方法について確認しましたね。

ですが、作業前のデータに戻したいという場合もあるでしょう。
そういった場合は下記のように変更の取り消しから変更を元のデータに戻すことができます。
f:id:PaperSloth:20180321160308p:plain
f:id:PaperSloth:20180321160351p:plain

Logの確認方法

時には過去の変更履歴を確認したいこともあるでしょう。
そういった場合はログを表示から確認することができます。
f:id:PaperSloth:20180321160728p:plain
f:id:PaperSloth:20180321160920p:plain

特定リビジョンに戻る

ログから戻りたいリビジョンを選択することでそのリビジョン状態へと戻すことが出来ます。
f:id:PaperSloth:20180321161214p:plain


UE4プロジェクトを管理してみる

基本操作等はUnityと同様ですので、一旦上のUnityの内容に目を通している前提で進めます。

Unity同様にリポジトリの作成、チェックアウトまで済んだところから始めます。
チェックアウトしたフォルダ内にUE4プロジェクトを作成しましょう。
今回はC++の空のプロジェクトで行います。
f:id:PaperSloth:20180321161947p:plain

Unityの時と同様に先ずはプロジェクトを追加します。
f:id:PaperSloth:20180321162359p:plain

無視リストの活用

UE4では.vs, Binaries, Intermadiate, Saved, sln, VC.db, .opendbはバージョン管理の必要がありません。
これはPluginでも同様です。
逆を言ってしまえばConfig, Content, Source, uproject, upluginだけ管理すればいいわけですね。
f:id:PaperSloth:20180321162725p:plain

(ProjectName)フォルダの差分を確認して、無視リストが更新されていることを確認しましょう。
sln, db等はそのファイルだけでなく拡張子ごとまるまる無視リストに追加しています。
f:id:PaperSloth:20180321163048p:plain

また、ContentフォルダのCollections. Developersフォルダも不要であれば無視リストに追加しましょう。
f:id:PaperSloth:20180321163729p:plain

UE4で管理するデータはこれだけになりました。
最初に比べて随分とシンプルになりましたね!
f:id:PaperSloth:20180321163859p:plain

UE4との連携

UE4ではPluginとしてSVNとの連携がサポートされているため、こちらも活用しましょう。
今度はUE4側での操作となります。
Connect to Source Controlを選択しましょう。
f:id:PaperSloth:20180321164204p:plain

すると下図のようなWindowが開くので
ProviderをSubversion
Repository, UserNameを指定しましょう。
f:id:PaperSloth:20180321164415p:plain

接続がうまく行けばSource Controlアイコンが緑になり、下図のような情報が出てきます。
f:id:PaperSloth:20180321164624p:plain


まとめ

UnityとUE4の実際のバージョン管理を交えつつ紹介させていただきました。
まだまだ紹介しきれていない機能があるんですが
とりあえず個人で簡単にバージョン管理を行う場合や練習としてはこれで必要十分だと思います。

バージョン管理したことがないという人は是非ともこの機会に挑戦してみてください。

また、+や?などのアイコンがファイル上に出ないということがあると思います。
これはDropboxやOneDriveなどのIconOverlayの優先度の問題で結構対処が面倒な問題です。
レジストリを書き換えたりしないといけないこともあります。
subversion icon overlays not showing
でググってみてください。

SVN 初めてのバージョン管理

環境

Windows10
TortoiseSVN 1.9.6


概要

VCSを仕事でも趣味でも使っていなくて、興味はあるけどどうしたらいいか分からない。
そんな人向けのローカルでのバージョン管理をご紹介します。
ローカルでのバージョン管理なので、個人プロジェクトや簡単なテスト環境に使える程度に考えてください。
まずはSVNに慣れるところから始めてみましょう。


TortoiseSVNのセットアップ

TortoiseSVNとは

TortoiseSVNApacheSubversion®のWindows版クライアントのことです。
ようはインストールするとExplorerからSVNの機能を呼び出すことができるようになります。
f:id:PaperSloth:20180321105644p:plain

似たものでTortoiseGitというのもあります。
Gitクライアントは自分のように特殊な理由がない限りはSourceTreeを使用する人が多いです。

TortoiseSVNのダウンロード、インストール

下記URLからTortoiseSVNをダウンロードできます。
合わせて日本語の言語パックもダウンロードしておきましょう。
Downloads · TortoiseSVN

インストール作業自体は双方共にNextをぽちぽちするだけです。
注意点として先にTortoiseSVNからインストールし、あとからLanguagePackをインストールするようにしましょう。

インストールが完了したら下図のようにSettingsを開きます。
f:id:PaperSloth:20180321132754p:plain

General -> Languageから日本語に変更します。
f:id:PaperSloth:20180321135636p:plain
これでメニューが日本語になったら準備完了です。


SVNリポジトリ作成

そもそもリポジトリとは?って人に向けて簡単に説明すると
データの保管庫のようなイメージです。
ここに作業データを格納して、更新したり復元したりを行います。

手順① 空のフォルダを作成する
私はDドライブ直下にExampleRepositoryというのを作成しました。
(ProjectName)Repoとか(ProjectName)Repositoryにすると良いでしょう。

手順② 作成したフォルダをリポジトリにする
図のようにフォルダを選択してここにリポジトリを作成を選択するだけです。
f:id:PaperSloth:20180321170540p:plain

すると下図のようにリポジトリを作成したことを示すダイアログが出ます。
f:id:PaperSloth:20180321133756p:plain
OKを押して閉じます。

これで作業データを保管する保管庫が出来ました。


作成したリポジトリをチェックアウトする

先程の手順では保管庫が出来ただけで今は中身は空です。
使用するにはチェックアウトを行う必要があります。

チェックアウトを行うとリポジトリから管理データをダウンロードすることが出来ます。


実際に作業データを格納するディレクトリに移動し、そこで下図のようにチェックアウトを行います。
f:id:PaperSloth:20180321134425p:plain

すると下図のようなダイアログが出ます。
リポジトリのURLの欄に先程作成したリポジトリのパスを入れます。
この時先頭に file:/// と入力するのを忘れないようにしてください。
チェックアウト先のディレクトリというのは実際に作業データを作成するディレクトリを指します。
f:id:PaperSloth:20180321134647p:plain

チェックアウトを行うと下図のようなダイアログが出ます。
f:id:PaperSloth:20180321134958p:plain

チェックアウトしたフォルダ内には.svnというフォルダがありますが
これは削除しないで残しておいてください。
f:id:PaperSloth:20180321140128p:plain


SVNを使ってみる

TortoiseSVNのメニューだけでも色々あって最初は面食らってしまうと思いますが
とりあえず基本の3つだけを知っていれば最低限は動かせます。
追加、SVNコミット、SVN更新です。

追加
ファイルやディレクトリをリポジトリに追加するコマンドです。
コミットするまではリポジトリには追加されません。

コミット
ローカルの作業コピーの変更をリポジトリに渡し、
リポジトリの内容を更新するコマンドです。

更新
リポジトリからデータを取得するコマンドです。
他の人が行った変更も合わせて取得されます。

試しにExampleCommitText.txtというデータで練習をしてみます。
新規にファイルを作成すると ? アイコンが追加されます。
ファイルを選択し、下図ように追加を選択します。
f:id:PaperSloth:20180321142106p:plain

追加を行うと下図のようにアイコンが ? から + に変わったことが確認できます。
f:id:PaperSloth:20180321142321p:plain

続いてコミットを行うことで初めてリポジトリにデータが追加されます。
下図のようにコミットを行いましょう。
f:id:PaperSloth:20180321142621p:plain

コミットをする際にはメッセージを残す必要があります。
このメッセージは後からログを参照した場合などに
どういう変更を行ったかを明確にするためにきちんと書くことをオススメします。
f:id:PaperSloth:20180321142750p:plain

コミットに成功すると下図のようなダイアログが出ます。
f:id:PaperSloth:20180321142932p:plain

リビジョンが0から1になりましたね。

リビジョンとは
変更をするたびに、リビジョンがリポジトリに作成されます。
変更履歴から作業を戻したい場合などにリビジョンNのような形でリポジトリを調べる時に役立ちます。


自分のPC複数でデータを共有する

ここで紹介する方法は荒業ですが、個人でしか作業していないという場合は役に立つかもしれません。

やり方は簡単でDropboxやOneDriveなどにリポジトリを作成するだけです。
今回はDropboxで作成する方法を紹介します。

Dropboxクライアントをインストールすると
C:\Users\(UserName)\Dropboxにファイルが同期されますね。

そこに新規でリポジトリを作成します。
すうと、同一ユーザーの他のPCでもリポジトリが同期されるため
このリポジトリからチェックアウトすることでファイルを共有することが出来ます。


用語のおさらい

リポジトリ
 データを格納する場所。保管庫のようなもの。
 本来はネットワーク上で管理をする。
・チェックアウト
 空のディレクトリに、リポジトリからデータをダウンロードし
 ローカルの作業コピーを作成するコマンド。
・リビジョン
 コミットをするたびに、リポジトリに作成される。
 変更履歴から作業を戻したい場合などにリビジョンNのような形で指定する。
 作業データの管理履歴IDのようなもの。
・追加
 データをリポジトリに追加するコマンド。
 コミットするまでリポジトリに追加されない。
SVN 更新
 リポジトリから最新データを取得するコマンド。
 他の人が行った変更や別PCで行った作業の最新データを取得する。
SVN コミット
 ローカルの作業コピーの変更データをリポジトリに渡すコマンド。
 リポジトリのリビジョンを新しく作成するのに使用する。


最後に

1回では紹介しきれない機能が沢山あるため、続きを書きます。
次回は無視リスト、ログ表示、差分の見方を紹介する予定です。

冒頭でも軽くふれましたが、VCSを仕事でも趣味でも使っていない人向けの入門記事です。
そのため、仕事ではありえないような運用ですが
やらないよりはマシ、まずはやってみようという内容になっています。

続きを書いたらこちらにもリンクを載せます。
続きを書きました。
SVN ゲームエンジンのプロジェクトを管理しよう - PaperSloth’s diary

UE4 Moduleについて

環境

Unreal Engine 4.17.2
Visual Studio Community 2015


概要

今回はPluginではなく、Moduleの分割でビルドを早くしたりコードの結合度を下げたいとかそういう人向けです。
Plugin開発についての知見も得られると思います。


Moduleの追加

先ずは新規にModuleを追加する方法を説明します。
基本的にはTemplateからのPluginの作成とかで勝手に作られるのですが
BlankでC++プロジェクトを作成した状態から開始します。

今回はModuleSandboxというプロジェクトに
BattleSystemという新規Moduleを追加します。

手順①
追加したいModule名のフォルダをProject/Source以下に作成する。
f:id:PaperSloth:20180305213201p:plain

手順②
[ProjectName].Build.cs
[ProjectName].cpp
[ProjectName].h
を手順①で作成したModuleNameフォルダにコピー
f:id:PaperSloth:20180305213402p:plain

手順③
コピーした
[ProjectName].xxxを
[ModuleName].xxxに変更する
f:id:PaperSloth:20180305213657p:plain

手順④
[ModuleName].Build.csのProjectNameの箇所をModuleNameに変更する

using UnrealBuildTool;

// 変更前:public class ModuleSandbox : ModuleRules
public class BattleSystem : ModuleRules
{
	// 変更前:public ModuleSandbox(ReadOnlyTargetRules Target) : base(Target)
	public BattleSystem(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
	
		PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });

		PrivateDependencyModuleNames.AddRange(new string[] {  });
	}
}

手順⑤
[ModuleName].cppのProjectNameの箇所をModuleNameに変更
Moduleのクラスを追加し、Moduleの種類を指定する。

// 変更前:#include "ModuleSandbox.h"
#include "BattleSystem.h"
#include "Modules/ModuleManager.h"

// 追加
class FBattleSystemModule : public IModuleInterface
{
public:
    virtual void StartupModule() override
    {
    }
    virtual void ShutdownModule() override
    {
    }
    virtual bool IsGameModule() const override
    {
        return true;
    }
};
// 追加終わり

// 変更前:IMPLEMENT_PRIMARY_GAME_MODULE( FDefaultGameModuleImpl, ModuleSandbox, "ModuleSandbox" );

// 今回はGameModuleとして追加する。
// GameModule, Moduleの違いは次の章で解説します。
IMPLEMENT_GAME_MODULE(FBattleSystemModule, "BattleSystem");
// IMPLEMENT_MODULE(FBattleSystemModule, "BattleSystem");

IMPLEMENT_PRIMARY_GAME_MODULEはプロジェクト中に1つしか存在しません。
追加するModuleは全てPRIMARYを外す必要があります。

手順⑥
ExtraModuleNamesに追加Moduleを加える。
[ProjectName].Target.cs
[ProjectName].Editor.Target.cs
上記2つに変更を加えます。変更方法は同じです。

using UnrealBuildTool;
using System.Collections.Generic;

public class ModuleSandboxTarget : TargetRules
{
	public ModuleSandboxTarget(TargetInfo Target) : base(Target)
	{
		Type = TargetType.Game;

		// 変更前:ExtraModuleNames.AddRange( new string[] { "ModuleSandbox" } );
		ExtraModuleNames.AddRange( new string[] { "ModuleSandbox", "BattleSystem" } );
	}
}


手順⑦
uprojectにModuleを登録する。
[ProjectName].uprojectをテキストエディタで開き、追加Moduleの設定を加える。

{
    "FileVersion": 3,
    "EngineAssociation": "4.17",
    "Category": "",
    "Description": "",
    "Modules": [
        {
            "Name": "ModuleSandbox",
            "Type": "Runtime",
            "LoadingPhase": "Default"
        },
        // 追加分
        {
            "Name": "BattleSystem",
            "Type": "Runtime",
            "LoadingPhase": "Default"
        }
        // 追加終了
    ]
}

手順⑧
Solutionの更新
.uprojectを右クリックし、Generate Visual Studio project filesでslnの更新を行う。
f:id:PaperSloth:20180305215306p:plain


エラーが出なければこれでModuleの追加が出来ています。
ソリューションを開いてSource以下に追加されていれば成功です。
f:id:PaperSloth:20180305215549p:plain


GameModuleとModuleの違い

この辺りは少し面倒な話でUE4 C++本でも
プラグインに対してのホットリロードには難ありというのが現時点での正直な感想です"と書かれています。

私はあまり不便だと感じていませんが、それはさて置き
先に結論だけ述べます。
GameModuleの場合はHotReloadの際にビルドに含まれます。
Moduleの場合はCompileボタンを押してもHotReloadが行われません。

Moduleの場合はWindow -> Developer Tools -> Modulesウィンドウから行う必要があります。
f:id:PaperSloth:20180305221125p:plain
Recompileボタンを押下することでHotReloadが行われます。

他にも幾つか違いがあるとは思いますが、私が触ってみて分かった範囲について記述させていただきました。


PluginでもProjectの別Moduleの場合でも開発中にModuleとGameModuleを切り替えることが可能です。
ビルド時間をとりあえず短縮したい場合はModuleとして作成すれば良いと思われます。
Pluginの場合はModuleとして作成されます。

GameModuleの場合

#include "[ModuleName].h"
#include "Modules/ModuleManager.h"

class F[ModuleName]Module : public IModuleInterface
{
public:
    virtual void StartupModule() override
    {
    }
    virtual void ShutdownModule() override
    {
    }
    virtual bool IsGameModule() const override
    {
        return true;
    }
};
IMPLEMENT_GAME_MODULE(F[ModuleName]Module, "[ModuleName]");


Moduleの場合

#include "[ModuleName].h"
#include "Modules/ModuleManager.h"

class F[ModuleName]Module : public IModuleInterface
{
public:
    virtual void StartupModule() override
    {
    }
    virtual void ShutdownModule() override
    {
    }
    virtual bool IsGameModule() const override
    {
        return false;
    }
};
IMPLEMENT_MODULE(F[ModuleName]Module, "[ModuleName]");