fc2ブログ

凛(kagring)のUE5/UE4とゲーム制作と雑記ブログ

2016 年から UE4 / 2021年から UE5 を触り始めました。勉強したもののメモ用ブログです。ゲーム制作に関するメモや雑記とか色々あります。C++ での Qt、Unity もほんの少しあります。

2018年04月 | ARCHIVE-SELECT | 2018年06月

| PAGE-SELECT | NEXT

≫ EDIT

UE4 フローノードを関数の中で呼び出したときの罠(Multi Gate、Flip Flop、Do Once)

「Multi Gate」「Flip Flop」「Do Once」ノードを使ったノード郡を
関数化したときにハマったのでメモです。

詳しくはこちらの記事でも書かれています。

・A と B を交互に切り替える処理でハマった話
http://limesode.hatenablog.com/entry/2016/11/20/014817

簡単に言うと
「Multi Gate」「Flip Flop」「Do Once」などの次回に処理を持ち越すノードを関数の中で使うと機能しなくなる。
といったもののようです。

自分はノードをべた書きした後、見やすいように関数化したりまとめたりしていたので
関数化したら動かなかった!という風にハマったので自戒としてのメモです。

みつまめ杏仁さんが書かれている

あくまでも推測ですが、
切り替えるには、状態を保持しておく値が必要で、関数内からはその値が参照できなくなるんじゃないかと思ってみたり。

こういう内部処理が原因なんじゃないかなーと。

というわけでどんな事が起きるかというのと解決方法です。

まずはこんな処理を組みます。
フローノードの関数化バグ000
ランダムな順番でHello1とHello2が表示されるような処理です。

これを「Event Tick」移行を関数化してみます。
フローノードの関数化バグ001
こんな感じですね。

その関数を呼んでみます。
フローノードの関数化バグ002
何故かこの関数を呼ぶたびに「Hello1」が表示され続けます(Hello2表示され続ける場合もあり)
※本来は交互に表示されてほしい
なんでやねん…!ということではまりました。

解決方法としてはまとめるだけなら「マクロ」を使ってまとめる(関数にはしない)
マクロならレイテントノードも使えるのでよさそうです。

もしも関数のように複数の箇所から呼びたい場合は
カスタムイベントを作るのがよさそうです。

こんな感じにカスタムイベントを作って呼んであげると良さそうです。
フローノードの関数化バグ003

「関数」「マクロ」「カスタムイベント」はかなり気を使って使い分けないとまずそうですね。

よくよく考えてみると確かにそうなりますよねって感じなのですが
公式ドキュメントにはそんなことさっぱり書いてないので小一時間悩みました(´;ω;`)ウッ…

・MultiGate
http://api.unrealengine.com/JPN/Engine/Blueprints/UserGuide/FlowControl/#multigate

というバッドノウハウでした!

| UE4 | 12:39 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

UE4 固定値を使う(Constant)

マテリアルノードについて勉強中ですメモ。
固定値を使う方法です。

固定値を使うには「Constant」系ノードを使います。
Constant000.png
「Constant」系ノードはfloatだったりVectorだったり様々あります。

公式ドキュメントはこちら。

・Constant 表現式
http://api.unrealengine.com/JPN/Engine/Rendering/Materials/ExpressionReference/Constant/index.html

使うとこんな感じに表示されます。
Constant001.png
これもまたノード名がでない…!
「Value」なのか「Literal」なのかとかすごい悩みました…なのでメモです!

実際にノードを組むとこんな感じです。
SphereMask002.png
これはフォグみたいなことをやっている処理なのですが
ワールド座標をカメラからの距離で計算して色を変更しています。

結果はこんな感じになっています。
SphereMask001.png

| UE4 | 12:24 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

UE4 Unreal Engine 4 ポストプロセス セルシェーダー「PPCelShader」を使ってセルシェーディングを実装する

alwei さんがポストプロセスによるセルシェーディング(PPCelShader)を公開されたので実装してみました。
セルシェーディングバンザイ!(^Q^)

UE4では標準で自分が作っているようなアニメ調のモデルに適用するセルシェーディング系が
用意されていないのでとても助かります!(公式で用意されるといいな!)

ポストプロセス セルシェーダー(PPCelShader)はツイートにもある通り
こちらで公開されています。

・Unreal Engine 4 ポストプロセス セルシェーダー
https://github.com/alwei/PPCelShader

まずは一式ダウンロードしましょう。

※GitHub にも書かれている通り 4.19 で作成されているので注意しましょう。

対応Ver UE 4.19.2


自分のプロジェクトに適用する場合、
Contents 内の PPCelShader にあるアセットを移行しましょう。
UE420180528_03.png
エクスプローラーだとこのフォルダの中にあるものですね。

移行方法はこちら。

・開いているプロジェクトで使っているアセットをほかのプロジェクトに持っていく
http://kagring.blog.fc2.com/blog-entry-311.html

無事自分のプロジェクトにアセットを移動できたら早速適用してみましょう。
まずはポストプロセスボリュームを配置してポストプロセスマテリアルに設定しましょう。
UE420180528_04.png
こんな感じですね。
「PPI_CelShader」と「PPI_Deffusion」をポストプロセスマテリアルに設定します。

ポストプロセスボリュームとポストプロセスマテリアルについてはこちらに。

・ポストプロセスエフェクト(Post Process Effects)を実装する(Post Process Volume)
http://kagring.blog.fc2.com/blog-entry-402.html

・ポストプロセスエフェクト(Post Process Effects)にマテリアルを作成して適用する(ポストプロセスマテリアル(Post Process Material))
http://kagring.blog.fc2.com/blog-entry-404.html

このポストエフェクトを適用してみるとすぐにこんな感じに!
UE420180528_00.png
なんて簡単なのでしょう…すばら!

Gray ちゃんでテストしてみるとこんな感じです。
UE420180528_01.png
適用前はこんな感じに普通のシェーディングなのですが
UE420180528_02.png
PPCelShader を適用するとこんな感じのセルシェーディングに!

UE4では標準で自分が作っているようなアニメ系のモデルに適用するセルシェーディング系が
用意されていないのでとても助かりますね!(大事なことなので二回)

適用自体はこんな感じで簡単にできるので、UE4でもアニメ系のゲームだったりが増えるといいなーと。
アニメ調の見た目が好きなので!

それと、補足として alwei さんがこんなことを書かれているのでぺたり。


公開直後にダウンロードした人は最新版をもう一度とったほうがよいかもです。

| UE4 | 12:57 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

UE4 ピクセルのワールド座標を入力として取得する(World Position)

マテリアルノードについて勉強中ですメモ。
ピクセルのワールド座標を入力として受け取る方法です。

ピクセルのワールド座標を入力として受け取るには
「World Position」ノードを使います。
絶対ワールド座標000
その名の通りピクセルのワールド座標を入力として受け取ることができます。

公式ドキュメントはこちら。

・WorldPosition
http://api.unrealengine.com/JPN/Engine/Rendering/Materials/ExpressionReference/Coordinates/#worldposition

これ単体ではあまり使い道はなさそうなのですが
カメラからの距離だったりの何かとの対比として使うことになりそうです。

実際にノードを組むとこんな感じです。
SphereMask002.png
これはフォグみたいなことをやっている処理なのですが
ワールド座標をカメラからの距離で計算して色を変更しています。

結果はこんな感じになっています。
SphereMask001.png

| UE4 | 11:39 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

UE4 カメラ位置を入力として取得する(Camera Position)

マテリアルノードについて勉強中ですメモ。
今回はカメラ位置を入力として受け取る方法です。

カメラ位置を入力として受け取るには
「Camera Position」ノードを使います。
カメラ座標000
その名の通りカメラの位置を入力として受け取ることができます。

公式ドキュメントはこちら。

・Camera PositionWS
http://api.unrealengine.com/JPN/Engine/Rendering/Materials/ExpressionReference/Coordinates/#camerapositionws

これを使うとカメラの透過だったり、
カメラからの距離でうんぬんみたいなことを結構できそうです。

実際にノードを組むとこんな感じです。
SphereMask002.png
これはフォグみたいなことをやっている処理なのですが
カメラからの距離で計算した色を変更する処理になっています。

結果はこんな感じになっています。
SphereMask001.png

| UE4 | 11:30 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

UE4 2つの値をブレンドする(Linear Interpolate)

マテリアルノードについて勉強中ですメモ。
今回は入力で受け取った2つの値をブレンドして出力する方法です。

2つの値をブレンドするには「Linear Interpolate」ノードを使います。
Lerp001.png
Aには値1を指定します。
Bには値2を指定します。
Alphaにはブレンド率を指定します。
0.0でAが100%。1.0でBが100%反映されます。

「Linear Interpolate」の公式ドキュメントはこちら。

・Linear Interpolate
http://api.unrealengine.com/JPN/Engine/Rendering/Materials/ExpressionReference/Math/#linearinterpolate
LinearInterpolate 表現式はマスクに使用された第 3 の入力値に基づいて 2 つの入力値をブレンドします。これは Photoshop のレ

レイヤーマスクのように、2 つのテクスチャ間のトランジションを定義するマスクのようなものです。
マスク アルファの輝度は、二つの入力値から受け取るカラーの割合を決定します。
アルファ値が 0.0/black (黒) の場合は最初の入力値が使用されます。
アルファ値が 1.0/white (白) の場合は 2 番目の入力値が使用されます。
アルファ値がグレー (0.0 と 1.0 の間にある値) の場合、出力値は 2 つの入力値のブレンドになります。
ブレンドはチャンネル毎に処理されることにご注意ください。
アルファ値が RGB カラーの時、アルファの赤のチャンネル値によって A と B の赤のチャンネル間のブレンドが定義されます。
これは、 A と B の緑のチャンネルの間のブレンドを定義する、アルファの緑のチャンネルとは 別になります 。


ちなみにこのノード表示状だと「Lerp」と表示されているのに
「Lerp」というノードではないので注意してください(うちはこれで悩んだ)
Lerp000.png
Linear Interpolate の略称が Lerp なので間違ってはいないのですが
こう他にはLerp○○みたいなノードがあるのでややこしいというか…。

実際にノードを組むとこんな感じです。
SphereMask002.png
これはフォグみたいなことをやっている処理なのですが
距離で計算した色と現在の画面をブレンドしています。

結果はこんな感じになっています。
SphereMask001.png

| UE4 | 12:26 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

ゲーム内での言語切り替えメモ(多言語対応)

「舞華蒼魔鏡」というゲームを作っている時に多言語切り替え対応が必要になり、
ゲーム内での言語切替処理を実装してみたのでメモです。

・舞華蒼魔鏡
http://lost-identity.jp/souvenir/html/MaihanaPS4/html/Top.html
MaihanaIcon.png

同じ処理をクロワルールというゲームでも実装しています(宣伝)

・クロワルール・シグマ
http://lost-identity.jp/souvenir/html/croixleurps4/html/top.html
CroixleurIcon.png

とりあえずの発端はむらさめさんのこの記事を読んでやってみようと。

・言語選択
インディーゲームイベントはなんか海外の人も割と見かけるので、多言語対応しているならインゲームで選択できるようにしておくと良い。
極端な話、グーグル翻訳程度の雑な英文でも、ないより遥かに良い。海外インディー勢もちょっとそれどうなの的な翻訳で堂々と展示してるしきっと大丈夫。
今回はイベント特別仕様でタイトル画面直後ダイレクトに言語選択入れました。(本来は本体のシステム言語を識別して起動時に設定が変わる)
余計な手間だったかな?と思っていたんですが、英語でプレイしてる人は割といましたね…(^p^)


◇いろいろな多言語対応方法

日本語以外の言語対応をする場合以下の対応があったりします。
(他にもっとあるかもしれませんが思いつくところでこんな感じということで)

・その言語だけのリソースでパッケージを作成する
 その言語に対応したものだけ入ったもの。
 海外版だと英語だけ、日本版だと日本語だけの対応といったもの。
 なので本体のリージョンを変更したとしても文字列が変わることはありません。
 対応が一番簡単。日本版が感性していれば、
 使っているリソースをその言語のものに置き換えるだけでプログラムの処理はいらない。
 クロワルールの方は現在こうなってしまっています(絶賛言語切替対応中)
 海外版をだすだけならよさそうですが、多言語切り替えの対応にはなっていない。無念。

・起動時の本体設定を見てリソースを切り替える
 起動時にユーザーがどの言語で遊んでいるかをみて、読み込むファイルを変更するもの。
 リソースは言語ごとに用意しないといけないですが、
 読み込むフォルダやファイル名を変えたりすればいいだけなので簡単。
 ゲーム起動前に言語が確定できるので、リソースが用意できれば案外楽に実装できる。
 多言語切り替えをいれるなら、これが遊ぶ側の要件も満たて一番コスパが良さそう。
 ※日本語で遊ぶ人は本体設定日本語で遊んでるよね!という想定。

・ゲーム中にリソースを切り替える
 ゲームが起動してリソースが読まれている状態で、言語切替の時にリソースを読み替えるもの。
 すでにテクスチャだったりが読まれているのでなにげに開放とか考えるとめんどくさい!
 でもこれを実装するとよさそうなので頑張ってみました。
 ゲームの展示版とかだと、これがあると誰でも遊べるので良さそうです。

◇切り替えるリソース

言語が変わると切り替えなければいけないリソースを挙げてみました。

・文字列
 会話などの文字列データですね。
 基本はこれを変えていくことになると思います。
 文字列データなのでサイズも小さく、データの数も多くないのでこれを切り替えるのは簡単ですね。
 実装ではラベル名を指定しておき、そのラベルの中身を言語によって変えています。

・文字列が埋め込まれたテクスチャ
 これはUIなどに使われているテクスチャですね。
 ほんとこれだけは極力無くす方向でゲームを作っていくのがいいのかなと。
 画像を言語ごとに作成するだけでも大変なので…(´;ω;`)

・フォントデータ
 最後にフォント(画像)データですね。
 文字列を表示するために使っているフォントデータです。
 これは日本語と英語だけならあまり問題ないのですが、
 繁体字や簡体字になってくると日本語のフォントセットには含まれていない文字があるので
 それごと読み替える必要があります。
 (全部乗っかるなら全部最初に読み込んでしまってもいい気はしますが…)

これらを切り替えたらこんな感じで画面が変わります。
XAL02100057878-20180524-0132.jpg
日本語。
XAL02100057878-20180524-0133.jpg
英語。
XAL02100057878-20180524-0134.jpg
繁体字。
XAL02100057878-20180524-0135.jpg
簡体字。

中身のテキスト、テクスチャデータ、フォントが変わっているのがわかると思います。

◇ゲーム内で言語切替処理を実装してみた

というわけで、展示用にタイトル画面で言語を切り替えられるようにしてみました。
タイトルのメニューに項目を追加し、選択肢を表示するようにしました。
XAL02100057878-20180521-0128.jpg
まずはこんな感じに。

これだけでも機能を満たしていると思うのですが
言語を切り替えるための選択肢の文字が読めない
という問題が発生しました。確かにそのとおりですね。

というわけで、選択肢の中身を各言語の文字にしてみました。
XAL02100057878-20180522-0129.jpg
他の国の文字がフォント画像の中にない!(そりゃそうです)
これは盲点でした…。
言語を切り替えたらフォントデータを読み替えて表示しているので
読み替える前にはその言語の文字はないですよね…。

というわけで最終的にはこんな感じにしました。
XAL02100057878-20180524-0131.jpg
選択肢に使う言語項目を画像にしました。
最初からこうするべきでしたね…。

と、書いていて他の人はどうしているのかなーと思ったので
どこかイベントや会った時に聞いてみたいと思います!

独学でやっているので、このやり方はあまり上手い方法ではないかもしれませんが
自分用のメモとして、あとは少しでも誰かの役に立てたら嬉しいなと思います。

| リリース | 16:21 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

UE4 UNREAL FEST WEST 2018 記事まとめ

UNREAL FEST WEST 2018 の資料が公開されたのでメモ。


・動画アーカイブ
https://www.youtube.com/user/unrealenginejapan

・スライドアーカイブ
https://www.slideshare.net/EpicGamesJapan

スライドの中から興味あるものをピックアップしてみました。






こういった資料が公開されることに感謝です!

| UE4 | 12:38 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

UE4 距離に応じて値を変化させる(Sphere Mask)

マテリアルノードについて勉強中ですメモ。
距離に応じて色を変化させる方法です。

こちらを参考にさせていただきました!

・UE4 SphereMaskで距離に応じて色を変える
http://effect.hatenablog.com/entry/2018/05/16/025859

距離に応じて色を変化させるには「Sphere Mask」ノードを使います。
SphereMask003.png
「A」にはチェックするポイントの位置を指定します。
「B」には球の真ん中を表す位置を指定します。
「Radius」には距離の計算に使用する半径を指定します。
「Hardness」にはトランジションのエリアのサイズを指定します。
徐々に変化させる場合の距離といったものですね。
moko さんの記事に詳しく画像付きで書いてあります。

Hardnessは 0 から 1 に遷移する長さという感じで、1 にすると即値が変わりますが 0 にするとカメラの位置までかけて緩やかなグラデーションが付きます。

書いてあるとおり、0.0でいい感じにグラデーションして、1.0だと即値が変化するようです。
感覚的には逆なので厄介ですね…。
0.0から1.0の値が出力されるようdす。

公式ドキュメントはこちら。

・SphereMask
http://api.unrealengine.com/JPN/Engine/Rendering/Materials/ExpressionReference/Utility/index.html#q-z

ノードを組んでみるとこんな感じに。
SphereMask002.png
上記はポストプロセスマテリアルを組んだもので
カメラからの距離を取得して、距離に応じて黒くしていくといったものですね。

結果はこんな感じに。
SphereMask001.png
簡単にいうとフォグですね。

エフェクトでの使用例で言えば、パーティクルがカメラに近付いた際に突き刺さらないよう消えるようにしたりは定番と思いますが、World position OffsetとParticleSizeノードを併用してカメラに近付いたパーティクルのサイズを小さくしたりとかもできそうです。

この時、ピクセル単位ではなくパーティクル全体に影響するので良ければSphereMaskのAに入力するのはParticlePositionノードが良いかと思います。

といった感じの使い方もできそうなので便利そうですね。

| UE4 | 13:04 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

UE4 マテリアルノードのドキュメントなど参考いろいろ

マテリアルノードに関する参考になるものいろいろメモ。

公式ドキュメントはこちら。

・マテリアル
http://api.unrealengine.com/JPN/Engine/Rendering/Materials/index.html

・Material 入力
http://api.unrealengine.com/JPN/Engine/Rendering/Materials/MaterialInputs/index.html

・マテリアル式リファレンス
http://api.unrealengine.com/JPN/Engine/Rendering/Materials/ExpressionReference/index.html

・Math 表現式
http://api.unrealengine.com/JPN/Engine/Rendering/Materials/ExpressionReference/Math/

・マテリアル関数
http://api.unrealengine.com/JPN/Engine/Rendering/Materials/Functions/

随時更新中。

| UE4 | 14:50 | comments:0 | trackbacks:0 | TOP↑

| PAGE-SELECT | NEXT