ぼっちプログラマのメモ

UE4とかUE5とかについて書いたり書かなかったり。

【UE4】フェイシャルキャプチャ時における、Live Link Remap アセットを使ったカーブ名の再マッピングについて

前回の記事

pafuhana1213.hatenablog.com

はじめに

前回の記事で説明した通り、Live Link Faceアプリを使ったフェイシャルキャプチャにおいて
対応するカーブを用意することは非常に重要なのですが、地味に作業が面倒です。

面倒です!!!

と思っていたら、Live Link Faceアプリの公式ドキュメントにこうあります。

使用するキャラクターのブレンド シェイプの名前は ARKit ブレンド シェイプとまったく同じである必要はありません。LiveLinkRemap アセット内にカスタムのブループリント関数を作成して、ARKit ブレンド シェイプ名を自分のキャラクターで使用する名前に変換することができます。手順については「Face AR サンプル ドキュメント ]」を参照してください。ただし、最良の結果を得るために、使用するキャラクターのフェイシャル ブレンド シェイプが覆う顔領域は ARKit ブレンド シェイプと同じになるようにしてください。
iPhone X からフェイシャル アニメーションを記録する | Unreal Engine Documentation

コレを見てなるほど!と思い、Face ARサンプルのドキュメントを見に行くと…

LiveLinkRemap アセット内でのカーブ名の再マッピング
[My Blueprint] パネルの [Function] グループで、[Override] そして [Get Remapped Curve Names] を選択します。
入力と出力と合わせて、関数のグラフが開きます。目標は、このグラフを使用して、AppleSDK で想定される名前リストから受け取った名前を、キャラクターのブレンド シェイプ名に対応する名前に変更することです。たとえば、キャラクターのブレンド シェイプが適切な名前であるものの、「Character_」が追加されている場合、使用するグラフは次のようになります。

Apple SDK から受け取った名前に「Character_」を追加し、結果を出力している点に注意してください。
Face AR Sample | Unreal Engine Documentation

?????????????

となって、どう使うのか分かるのに少し苦労したので記事にします。

…と記事を書いてる途中で公式ドキュメントの別のページで解説があるのを知りましたが、
今回は Live Link Face を使ったフェイシャルキャプチャに特化した話ということでご容赦ください!
Live Link プラグイン | Unreal Engine Documentation ( Live Link ターゲットの項より )

続きを読む

【UE4】Live Link Face for Unreal Engineを使って、あなたのキャラクタの表情を動かす方法

はじめに

少し前に、Epic Gamesよりリアルタイムフェイシャルキャプチャ用のiOSアプリ「Live Link Face」がリリースされました。
このアプリとUE4を連携させることで、
TrueDepthカメラ( ≒ Face ID機能 )を持つiPhoneiPadがあれば個人でもフェイシャルキャプチャを実現することができます!

www.unrealengine.com

こんなことや…

あんなことも!



実は2018年から実現可能だったのですが、当時は Face AR Sample を iOS向けにパッケージングする必要がありました。
そのため、iOS開発環境(MacApple Developer Programへの登録など)を整える必要があり、導入のハードルが高い状況でした…

pafuhana1213.hatenablog.com

しかし、「Live Link Face」があればそんなことは必要ありません!
対応デバイスさえあれば誰でも気軽に試すことができます!公式ドキュメントもあります!やったね!

Androidユーザの方は…す、すみません…僕は自腹でiPhone XRを購入しました…)

iPhone X からフェイシャル アニメーションを記録する | Unreal Engine Documentation
Face AR Sample | Unreal Engine Documentation


ただし…サンプルキャラ(KiteBoy)以外のキャラクタに応用する方法についてはあまり詳しく書かれていません。
マケプレなどのストアからDLしたキャラ や 自作のキャラではどう使うの!?」と悩んでしまっている方もいるかと思います。

ということで自分メモも兼ねて書いていこうと思います。
なお、「既にサンプルキャラ(KiteBoy)のフェイシャルキャプチャに成功している」という前提のもとで説明します。
上記の公式ドキュメントにある手順に従えば…大丈夫…なはずです!

また、Anim BPを少しでも触ったことがあることも前提とします。
といっても、「アセットの作り方」と「どんな機能なのかをふんわり知ってる」レベルで大丈夫です。
Animation ブループリントの作成 | Unreal Engine Documentation

そして、解説にはマケプレのこの娘を使います。猫耳いい…かわ…(*´∀`*)
KemomimiFighter:AutumnRiceField:Characters - UE4 マーケットプレイス


微妙に話が長くなってしまったので、急ぎの方は 「まとめ」を先にご確認くださいまし。
UE4のアニメーション機能をそれなりに触ってる方はそれで概ね把握できると思います。

続きを読む

UE4のRetarget Manager にて独自のリグを追加・設定する方法について

アニメーションのリターゲット機能について

UE4 には ボーン構造が異なっているモデル間でも アニメーション を使い回すための仕組みとして、アニメーションリターゲット機能を提供しています。アニメーションリターゲット機能の使い方・注意点に関しては 公式ドキュメント や こちらのYoutube配信 を見ていただくと分かりやすいかと思います。
docs.unrealengine.com
youtu.be

独自のリグを追加・設定するには

リターゲット機能を使う過程でRetarget Manager上でリグの設定をする必要があるのですが、デフォルトですとエンジン標準のHumanoid Rig しか選択できません。

f:id:pafuhana1213:20200703153917g:plain

しかし、プロジェクトによっては 独自のリグを設定して使いまわしたいケースもあるかと思います。ということで、独自のリグ設定を作成・設定する方法について説明します。といっても、簡単です!!!

続きを読む

特定のBlueprint , UMG にて Tickノードが使われているかをチェックする方法について

はじめに

Tick ノードは便利ではありますが、多くのActor, UMG が Tick ノードを使用するとパフォーマンス面で問題が発生する可能性が出てきます。
(特にモバイル や コンソールタイトルにて)

Unreal Engine 4を使って地球を衛る方法 ( p109 より Tickの話 )
UE4におけるレベル制作事例 ( p14 より Tickの話 )
[CEDEC2018] UE4で多数のキャラクターを生かすためのテクニック ( p193 より Tickの話 )

そして、プロジェクト終盤で Tick 負荷が問題になると大変なことになりがちです。なぜなら、Tickを使わないように実装を大きく変更することになるためです。そのため、日々 Tickをなるべく使わないように心がけたり、Tick警察の方が目を光らせることが重要になります。

Tick警察のお供として有名なのが、 dumpticks コマンドです。これで ゲーム中に動いている Tick を洗い出すことができます。

f:id:pafuhana1213:20200626184626p:plain
[CEDEC2018] UE4で多数のキャラクターを生かすためのテクニック p195より

しかし、ゲームを実際に動かす必要があるため、プロジェクトの規模が大きくなるほどチェックが大変になります。また、ログに出力されるだけなので、例えばCSVなどにまとめたい場合は抽出・整形する必要があります。

また、「Find In Blueprints」機能を使って 文字列検索から Tick ノードを抽出することもできますが、全BPが対象になるので時間がかかったり、結果をまとめづらいなどの問題があります。

f:id:pafuhana1213:20200626191716p:plain

そこで今回紹介したいのが、特定のBP・UMG アセットのEvent Graph にて Tick ノード が存在するか否かを自動的にチェックする方法です。こちらであればゲームを実際にプレイする必要はありませんし、その結果をCSV などに自動的にまとめることができます。

続きを読む

Anim Nodeに不正な値が設定された際に、ノードを Warning / Error 表示にしたり AnimBPをコンパイルエラーにする方法について

ログにErrorやWarning出しても気づかない可能性があるので、NodeをError, Warning状態にしたりエラーを発生させようというお話です。なお、AnimNode, AnimGraphNode という単語が出てきますが本記事ではそれについて解説しません。以下の記事が参考になるかと思います
UE4 アニメ―ションノードの作成(ボーンのトランスフォーム)を試してみる - Qiita

はじめに

自作の疑似物理プラグインKawaii Physics」にて、Anim Nodeをとある設定にするとクラッシュするという報告を受けました。

f:id:pafuhana1213:20200516165718p:plain
Rootと同じボーンをExcludeBoneに指定するとクラッシュするバグを修正 by kyi · Pull Request #12 · pafuhana1213/KawaiiPhysics · GitHub


クラッシュを回避すること自体は簡単だったのですが、事実上ノードが機能しなくなるので「不正な値がノードに設定されているよ!修正してね!」ということを作業者に伝えたい所です。また、ログに出力する対応が実装楽ですが…ログを確認してくれないことは稀によくあるので効果としては薄くなることが多いです。
[UE4] UE_LOGについてあれこれ|株式会社ヒストリア


ということで、Anm Nodeに不正な値が設定された際に「問題が発生していることがひと目で分かる」 & 「修正を促す」方法を探して見つけたのが、ValidateAnimNodePostCompile 関数です。下図のように、ERROR! や WARNING! 表示にできる上にAnimBPのコンパイルエラーも起こすことができます!
f:id:pafuhana1213:20200516170926p:plain

コンパイルエラーを起こせるのがとても素敵です。エラーを修正しないとAnimBPを動作させることができないので作業者に修正を強いることができます。また、パッケージ作成時にも同様にError / Warning出力 & パッケージ作成が発生するため、不正な値が入っている状態でパッケージが作られてしまうことを回避できます!

それではValidateAnimNodePostCompile 関数をどのようにして使うのかについて説明します。といっても超簡単です。

続きを読む

【UE4 Android】アプリのバージョン情報(VersionCode, VersionName)を設定・取得する方法について

記事作成のリハビリを兼ねて、先日調べた内容をサクッと書いてみる
検証バージョンは UE4.25.0

はじめに

Androidアプリのバージョン情報には整数のVersionCode と 文字列の VersionNameの2つがあります。
VersionCodeはストア上での管理で用いられるものです。そして、過去にストアにアップロードしたVersionCodeとの重複が許されないため、ストアにアップするたびに値を追加する必要があります。
VersionNameはユーザへの表示のみを目的としたもので自由に設定することが可能です(例:1.2.3-beta)

参考:
アプリのバージョニング  |  Android デベロッパー  |  Android Developers
versionCodeとversionNameの 違い | アプリ開発のお勉強! アプリリ

バージョン情報の設定方法について

一般的なAndroid開発の場合は build.gradle という名前のファイルにVersionCode, VersionNameを記述するのですが、UE4を使ったAndroid開発の場合はプロジェクト設定で記述することになります。
f:id:pafuhana1213:20200509161407p:plain

上の赤枠のStore Version が Version Code、下の赤枠のVersion Displayが Version Name にあたります。
(名前合わせたほうが混乱しなかったのでは…)

Store Version Offsetで設定した値は、横にある( )内のCPUをサポートするアプリのStore Version に加算されます。そのため、例えばプロジェクト設定のPlatform - Android にあるBuildカテゴリの設定を以下のようにすると、作成したパッケージ( APK )のVersionCodeは10+1=11になります。
f:id:pafuhana1213:20200509162156p:plain

ここでカンの良い人は ↑↑図のStore Version Offsetの設定は破綻する可能性があることに気づきます!いったい何が問題なのでしょうか…?






はじめに設定した通り、Version Codeは重複が許されません。そのため、armv7 対応版と arm64対応版をそれぞれストアにアップするプロジェクトの場合、 Store Versionを「11」に設定してアップしようとすると armv7 版は VersionCodeの重複が原因で失敗するはずです。

そのため、実際にStore Version Offsetを運用する際は以下のように重複を回避することを考慮する必要があります。ちなみに、 パッケージが1種類だけプロジェクトの場合は Store Version Offsetを 初期値の0から変更する必要はありません。
f:id:pafuhana1213:20200509163248p:plain

バージョン情報の取得方法について

アプリを更新するかしないかの判定など、 アプリ起動中にStoreVersionを知りたいケースが時々あるかと思います。ということで取得方法についてもご紹介。

プロジェクト設定で設定したStoreVersion や VersionNameなどは UAndroidRuntimeSettings で保持されています。そのため、

.h ファイル

#pragma once

#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "AndroidRuntimeSettings.h"
#include "MyBlueprintFunctionLibrary.generated.h"

/**
 * 
 */
UCLASS()
class BUILD0425_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
	GENERATED_BODY()

	UFUNCTION(BlueprintCallable)
	static int GetStoreVersion();

};

.cpp ファイル

#include "MyBlueprintFunctionLibrary.h"

int UMyBlueprintFunctionLibrary::GetStoreVersion()
{
	return GetMutableDefault<UAndroidRuntimeSettings>()->StoreVersion;
}

.build.cs 以下の内容を追加

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

とすることで、StoreVersionを取得することが可能です。
f:id:pafuhana1213:20200509164548p:plain


VersionCode ではなく、StoreVersionであることに注意です! 繰り返しになりますが、VersionCode は StoreVersion とStore Version Offset を足したものです。そのため、VersionCodeの値が欲しい場合は UAndroidRuntimeSettingsが持つ以下のプロパティの値も取得する必要があります。

// Offset to add to store version for APKs generated for armv7
UPROPERTY(GlobalConfig, EditAnywhere, Category = "APK Packaging", meta = (DisplayName = "Store Version offset (armv7)"))
int32 StoreVersionOffsetArmV7;

// Offset to add to store version for APKs generated for arm64
UPROPERTY(GlobalConfig, EditAnywhere, Category = "APK Packaging", meta = (DisplayName = "Store Version offset (arm64)"))
int32 StoreVersionOffsetArm64;

// Offset to add to store version for APKs generated for x86_64
UPROPERTY(GlobalConfig, EditAnywhere, Category = "APK Packaging", meta = (DisplayName = "Store Version offset (x86_64)"))
int32 StoreVersionOffsetX8664;

おしまい

余談:
In-app updates for games のベータが最近公開されたけども今後はこれが主流になっていくのかしら…?
developers-jp.googleblog.com