58.7K Views
November 26, 17
スライド概要
こちらの資料も合わせてご確認ください。
https://www.slideshare.net/EpicGamesJapan/ue4-95204920
63ページ目補足:
AssetRegistryではなく、AssetManagerのロード用ノードの返り値がValidがどうかでインストールされているかどうかを確認することも可能です。
2017年11月25日に行われた「第3回UE4勉強会 in 大阪」で登壇した際に使用した資料です。
https://ue4study-osaka.connpass.com/event/70875/
Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/
第3回UE4勉強会 in 大阪 UE4のモバイル開発におけるコンテンツアップデートの話 - Chunk IDとの激闘編 Epic Games Japan 岡田和也 #UE4Osaka
自己紹介 Epic games Japan サポートエンジニア 岡田 和也 ( おかず @pafuhana1213 ) #UE4Osaka
本日のお品書き • 先日韓国で開催されたG-Star 2017の話 • モバイル開発におけるコンテンツアップデートの話 • Project Launcherの話 #UE4Osaka
G-Star2017って? 韓国最大のゲームショウ • 韓国版TGS(東京ゲームショウ)のイメージ • G-Star 2016 • 来場者数:211,398人(4日間) • TGS 2017 • 来場者数:254,311人 (4日間) #UE4Osaka
ICARUS M リネージュ2 レボリューションと同じく netmarbleが開発 PC向けのMMORPG 「ICARUS ONLINE」がベース 韓国版の事前登録受付中 #UE4Osaka
OVERHIT 昨年末に国内でリリースされた 「HIT」と同じ会社(NatGames)が開発 クオリティヤバイ!!! 日本展開決定! (韓国版は2017/11/28に配信予定) #UE4Osaka
この他にも沢山のUE4モバイルタイトルが…! 4GamerのG-Star 2017特集記事 http://www.4gamer.net/words/011/W01184/ Project EX #UE4Osaka Blade & Soul Revolution
UE4 + モバイルの 今後に乞うご期待! 宣伝タイム終わり #UE4Osaka
本日のお品書き • 先日韓国で開催されたG-Star 2017の話 • モバイル開発におけるコンテンツアップデートの話 • Project Launcherの話 #UE4Osaka
今日話すこと • キャラクタ・アイテム・マップなどの追加 今日話さないこと • 不具合修正 • 各プラットフォームを介する大幅アップデート #UE4Osaka
なぜコンテンツアップデートを取り上げるのか? 運営型ゲームにおいて コンテンツアップデートに掛かるコストは重要だから! 人 / 時間的コスト #UE4Osaka DLサイズによる負荷 アセット間の依存関係
コンテンツアップデートを • より早く • より簡単に • より安全に 行うための機能・フロー作りが重要! #UE4Osaka
CEDEC2017( 8/31 ) とある講演にて スライドへのリンク #UE4Osaka
CEDEC2017( 8/31 ) とある講演にて スライドへのリンク #UE4Osaka
2017/11/25 現在 UE4公式ブログ https://www.unrealengine.com/ja/blog #UE4Osaka
まだ記事が アップされてない!? はあああああ!? #UE4Osaka
ごめんなさい #UE4Osaka
Battle Breakersと モバイルチームに凸って 色々聞いてきました (記事の公開は4.19の頃みたいです) #UE4Osaka
色々変わっててヤバイ #UE4Osaka
なので、今日は最新情報を共有 • UE4.19で入る機能についても触れます 今回の内容はPC, モバイルで利用可能です • HTML5は未検証 • コンソールに関してはUDNでどうぞ #UE4Osaka
紹介する機能 Chunk機能 • 各アセットを管理するID Asset Manager • アセットの事前読み込み(裏読み) • Chunk単位でのロード Asset Audit Window (UE4.19で改良) • Chunkに含まれるアセットの確認 • Reference ViewerとSize Map #UE4Osaka
Chunkの日本語訳 • 大きいかたまり • 厚切れ • かなりの量 • たんまり • どっさり • (ずんぐりして)がっちりした人 https://ejje.weblio.jp/content/chunk #UE4Osaka
UE4におけるChunk 複数のアセットを管理するための単位 • Chunk ID (デフォルト:0) システム (ChunkID:0) #UE4Osaka 追加キャラクタ (ChunkID:1) 追加レベル (ChunkID:2)
初回リソースダウンロードの場合 50MB #UE4Osaka Chunk ID = 0 800MB Chunk ID = 1
追加キャラクタ (ChunkID:1) #UE4Osaka
追加キャラクタ (ChunkID:1) #UE4Osaka
追加キャラクタ (ChunkID:1) #UE4Osaka
キャラクタを一人追加するだけでも、 様々なアセット・データを用意する必要がある! • • • • • Blueprint マテリアル テクスチャ ゲーム部分に関する各パラメータ などなど #UE4Osaka
Chunk IDの設定方法 (UE4.16以前) 各アセット毎のChunk IDを手動で設定 • Editor設定の ”Allow ChunkID Assignments”を有効に #UE4Osaka
#UE4Osaka
間違いなく 事故る!!! #UE4Osaka
Chunk IDの設定方法 (UE4.17以降) UE4.17で正式リリースされた Asset Managerに含まれる、Chunk IDの設定機能を使用 公式ドキュメント: アセット管理 公式ドキュメント: クックとチャンキング UE4.17 リリースノート #UE4Osaka
できること Assetクラス単位での一括設定 • フォルダパスで制限可能 フォルダ単位での一括設定 • サブフォルダにも反映可能) コレクション単位での一括設定 Asset, BP単位での個別設定 参照アセットへの設定反映 などなど #UE4Osaka
Asset Managerって? アセットの非同期読み込み(裏読み)を 使用・管理するための機能 以前はC++でのみ提供していました(Streamable Manager) 公式ドキュメント:アセットの非同期ロード #UE4Osaka
Asset Managerがないとき STAGE 1 ロード開始 #UE4Osaka STAGE 2 ロード完了
Asset Managerがあるとき! STAGE 1 裏読み開始 裏読み終了 #UE4Osaka STAGE 2 ロード開始… あ、もうあるやん!
非同期読み込みのメリット・デメリット メリット • ユーザの体感ロード時間を大幅削減! • アセットを呼び出す際のカクつきを回避! デメリット • 非同期読み込みする為のアセット管理・処理が必要に • メモリ管理に注意(特にPC以外) #UE4Osaka
非同期読み込みを使用する前に • サブレベル • オブジェクトプール の利用も検討すること! https://www.slideshare.net/EpicGamesJapan/robo-recallvr #UE4Osaka
Project設定 → Game → Asset Manager #UE4Osaka
Primary Asset Types to Scan Asset Managerの 管理対象アセットを定義 (プライマリーアセット) • AssetのClassと フォルダパスによる抽出 • Assetを直接指定 #UE4Osaka
Primary Asset Types to Scan Asset Managerの 管理対象アセットを定義 (プライマリーアセット) • AssetのClassと フォルダパスによる抽出 • Assetを直接指定 定義に基づいて 裏読みするアセット候補が決定 #UE4Osaka
Rulesで設定可能な項目 • Priority • Apply Recursively • Chunk ID • Cook Rule #UE4Osaka
Rulesで設定可能な項目 • Priority • 複数のRules適用対象に なった場合の優先度 • Apply Recursively • Chunk ID • Cook Rule #UE4Osaka
Rulesで設定可能な項目 • Priority • Apply Recursively • プライマリーアセットが 参照しているアセットにも 設定を適用するか (セカンダリーアセット) • Chunk ID • Cook Rule #UE4Osaka
Rulesで設定可能な項目 • Priority • Apply Recursively • Chunk ID • -1の場合は何も設定しない • Cook Rule #UE4Osaka
Rulesで設定可能な項目 • Priority • Apply Recursively • Chunk ID • Cook Rule #UE4Osaka
Cook? #UE4Osaka
UE4のビルドの流れ Build Cook Stage Run Deploy Package 各種アセットを 対象プラットフォーム用に コンバート #UE4Osaka
Cook対象範囲 一般的に、cook対象になるのは 指定したレベルとそのレベルが参照しているアセット Cookしたいけどレベルに紐付けたくないケースがある • フォルダ単位で強制cookする設定もあるけど… #UE4Osaka
Cook Ruleを活用することで より柔軟にCook対象範囲を制御可能! Unknwn: • 対象アセットを 参照している別アセットが CookされるならCookする Never Cook • Cookしない 別アセットに参照されている場合は エラー発生するので注意 #UE4Osaka Development Cook • Development, Test時はCookする Shipping時は Cookしない (テスト・デバッグ用アセット向け) Always Cook • 常にCookする
Development? Test? Shipping? #UE4Osaka
ビルド設定 • Debug(ビルド版のみ) • DebugGame • Development • Shipping • Test(ビルド版のみ) 公式ドキュメント: ビルドコンフィギュレーションの リファレンズ #UE4Osaka
ビルド設定の使い分け Debug / DebugGame • エンジン / ゲーム コードのデバッグ Development • 普段の開発(コードのデバッグも浅く可能) Test • CPUプロファイル Shipping • 配布・販売時 #UE4Osaka
Cook Ruleを活用することで より柔軟にCook対象範囲を制御可能! Unknwn: • 対象アセットを 参照している別アセットが CookされるならCookする Never Cook • Cookしない 別アセットに参照されている場合は エラー発生するので注意 #UE4Osaka Development Cook • Development, Test時はCookする Shipping時は Cookしない (テスト・デバッグ用アセット向け) Always Cook • 常にCookする
Asset Managerの更にいいところ Should Acquire Missing Chunks on Load まだダウンロードしていないアセットを Asset Managerでロードしようとした場合、 自動でダウンロード・インストールしてくれる! #UE4Osaka
Asset Managerがないとき #UE4Osaka
Asset Managerがないとき 公式ドキュメント:Mobile Patch Utility ノード #UE4Osaka
補足:ManifestDir と CloudDir ダウンロードする Chunkのデータ (Chunk ID ≠ 0) #UE4Osaka 鯖 Chunkをダウンロードするには ManifestとCloudフォルダのURLが必要
この手法のデメリット ヒューマンエラーが起きやすい環境 • 各Chunk毎のURLを管理する必要がある • Chunkのデータを利用する度に Asset Registryによるチェック処理を追加する必要がある なにより面倒くさい!!! #UE4Osaka
(5スライド前) Asset Managerの更にいいところ Should Acquire Missing Chunks on Load まだダウンロードしていないアセットを Asset Managerでロードしようとした場合、 自動でダウンロード・インストールしてくれる! #UE4Osaka
現在の実装状況(2017/11/25) 社内のモバイルタイトルで試験運用中 おそらく、4.19のタイミングで実装が整うはず… 申し訳ありませんが、4.19公開までは Asset Registry + Mobile Patch Utilityノードを ご使用ください #UE4Osaka
現在のコードを見る限り、おそらくこんな形に 1. Asset ManagerのShould Acquire ~ を有効に 2. HttpChunkInstallerプラグインを有効に 3. DefaultEngine.iniに↓な感じのコードを追加 [StreamingInstall] DefaultProviderName=HTTPChunkInstaller [HTTPChunkInstall] XXXXXX = XXXXX (HttpChunkのCloudDirを設定) [HTTPOnlineTitleFile] XXXXXX = XXXXX (HttpChunkのManifestDirを設定) #UE4Osaka
ここまでのまとめ • 複数のアセットをChunk IDで管理する • Asset Managerを使うことで 非同期ロード・Chunk ID一括設定・Cook Ruleを利用可能 • ダウンロード・インストールも自動的に行ってくれる(4.19以降) #UE4Osaka
Asset Managerに関するドキュメント・記事 公式ドキュメント • アセット管理 • クックとチャンキング 解説記事 • UE4 アセットマネージメントフレームワークについて • 【UE4】AssetManagerを使用したレベルストリームの高速化 #UE4Osaka
Asset Manager最高!!! #UE4Osaka
だがしかし #UE4Osaka
Asset ManagerによるCook ID管理の問題点 大雑把な指定しかできない • Classとフォルダパスを指定するだけ 各設定の更新・管理しづらい • 大量の項目を管理するには適してない (Battle Breakersでは26個ほど) 複数人での作業ができない • DefaultGame.ini に保存されるため #UE4Osaka
#UE4Osaka
つらい #UE4Osaka
Primary Asset Label を使おう! #UE4Osaka
Primary Asset Label Primary Assetに関する設定を Asset Managerの外で行う事が可能! より柔軟にRules適用対象の アセットを選択可能! Primary Asset Labelはアセットなので 複数人作業・バージョン管理が可能! #UE4Osaka
Primary Asset Labelの作り方 #UE4Osaka
Primary Asset Labelの各設定 Asset Managerと同じ Rulesを適用する アセットの条件を設定 #UE4Osaka
Primary Asset Labelの各設定 Label Assets in My Directory • Labelが配置されているディレクトリと そのサブディレクトリに含まれる アセットに対して、Rulesを適用 #UE4Osaka
追加キャラクタ毎にフォルダ分けをしておけば LabelによるChunk ID管理が簡単に! #UE4Osaka
Primary Asset Labelの各設定 Is Runtime Label • ラベルアセット自体がcookされ、 ランタイムで利用できるようにする • これはラベルアセットの設定を適用する 各アセットには影響しません • RulesのCook Ruleに従います #UE4Osaka
Primary Asset Labelの各設定 Explicit Assets / Blueprints • Asset / Blueprint単位でRulesを適用 Asset Collection • コンテンツブラウザの コレクション単位でRulesを適用 • 追加キャラクタをコレクションで 管理することで、Chunk ID設定をラクに #UE4Osaka
Primary Asset Label 最高!!! #UE4Osaka
だがしかし #UE4Osaka
Primary Asset LabelによるChunk ID管理の問題点 LabelによるChunk IDを想定した アセット・フォルダ・コレクション構成を構築する必要がある • お手数ですが、よろしくお願いします… Labelの数が大量に増えてしまう恐れがある • Asset Managerによる大雑把な設定と併用することで解決 あるアセットに対して どのChunk ID / Rulesが適用されるかが分かりづらい • 1つのアセットに対して、複数のLabelが適用候補になる可能性 #UE4Osaka
UE4.19で改良された Asset Audit(監視)機能の 出番!!! #UE4Osaka
Asset Audit ウィンドウ (UE4.19版) #UE4Osaka
UE4.18以前 Asset Managerが管理している プライマリー / セカンダリーアセットの一覧を表示 • 各アセットのChunk IDは確認可能 #UE4Osaka
UE4.19から • Chunk ID単位で確認可能に • 各Chunkの容量を一覧表示 • 各Chunkが持つアセットを リファレンスビューワーと サイズマップで確認可能! #UE4Osaka
改良されたリファレンスビューワー Chunk ID:0が管理しているアセット #UE4Osaka
改良されたリファレンスビューワー 対象アセットを管理しているプライマリーアセット #UE4Osaka
改良されたサイズマップ Chunk ID:0が管理しているアセットのサイズを可視化 (メモリ使用量とはイコールではないので注意) #UE4Osaka
プラットフォーム毎に確認する事も可能 ローカルでCookした場合、 Cook後のデータをプラットフォーム毎に確認可能 • Cook前後でアセットのサイズは変化するため より正確なチェックが可能 • 「モバイルでは不要なアセットが入ってた!」 といった問題をチェックが可能 #UE4Osaka
Chunk間でアセットが重複していた場合 チャンク間の親子関係を定義することで 無駄なアセット重複を回避可能 • 子チャンクは親チャンクが持つアセットを含まない DefaultEngine.iniにて [/Script/UnrealEd.ChunkDependencyInfo] +DependencyArray=(ChunkID=100,ParentChunkID=11) +DependencyArray=(ChunkID=101,ParentChunkID=11) #UE4Osaka
ここまでのまとめ • Primary Asset Label と Asset Managerを 併用することで、より柔軟にChunk IDを設定可能 • 各アセットのChunk ID、Chunkが持つアセットは Asset Auditウィンドウなどから確認可能 #UE4Osaka
コンテンツアップデートの流れ 1. 各アセットへのChunk IDを設定 • Asset Manager • Primary Asset Label 2. Chunk用パッケージを作成し、サーバーに配置 • ??? 3. Chunk用パッケージをダウンロード • Asset Manager #UE4Osaka
エディタ上でのパッケージング FileメニューのPackage Project • Project設定の Packageカテゴリで各設定を行う Project Launcher • カスタムプロファイルで 各設定を行う #UE4Osaka
Package Projectの場合 #UE4Osaka
Package Projectに関するドキュメント・記事 • 公式ドキュメント • プロジェクトのパッケージ化 • 解説記事 • [UE4] 4.9におけるパッケージングまとめ ~小規模タイトル編~ #UE4Osaka
エディタ上でのパッケージング FileメニューのPackage Project • Project設定の Packageカテゴリで各設定を行う Project Launcher • カスタムプロファイルで 各設定を行う #UE4Osaka
Project Launcherって? パッケージを作成・実機への転送をしてくれるツール • 実行ファイル( .exeなど ), パッチ, DLC • 様々なプラットフォームに対応 • 処理のプリセットを作成・編集可能 (プロファイル) • Cook・Launch時に渡すコマンドを指定可能 • 公式ドキュメント:コマンドライン引数 • などなど #UE4Osaka
いつ使うの? 通常のパッケージ作成・Launch機能よりも 細かい設定・調整をしたい場合 • • • • • Project 設定のPackaging設定では足りない リリース後に修正パッチを配布したい キャラクタを追加するためのDLCを作りたい コンソール開発時にゴニョゴニョしたい などなど #UE4Osaka
これまで 「いい感じに」 してくれた部分を 手動で設定する必要も出てくるため注意! #UE4Osaka
Project Launcherの開き方 #UE4Osaka
各プラットフォームへの Launch用プロファイル カスタムプロファイル #UE4Osaka
#UE4Osaka
Config Debug / DebugGame • エンジン / ゲーム コードのデバッグ Development • 普段の開発(コードのデバッグも浅く可能) Test • CPUプロファイル Shipping • 配布・販売時 #UE4Osaka
Data Build By the book • 前もって必要なアセットを指定してCookしておく On the fly • アセットサーバをPC側に立てて、 実行アプリケーションから要求があった際に Cookを行う手法 Do not cook • アセットをcookしない #UE4Osaka
おさらい: UE4のビルドの流れ Build Cook Stage Run Deploy Package Project Launcherの構成から #UE4Osaka
おさらい: UE4のビルドの流れ Build Cook Stage Run Deploy Package 実行ファイルの作成 #UE4Osaka
おさらい: UE4のビルドの流れ Build Cook Stage Run Deploy Package 各種アセットを 対象プラットフォーム用に コンバート #UE4Osaka
おさらい: UE4のビルドの流れ Build Cook Stage Run Deploy Package 実行ファイルやアセットを ひとまとめにするために 別の場所にコピー #UE4Osaka
おさらい: UE4のビルドの流れ Build Cook Stage Deploy Stageでまとめられた一式を 指定した実機に送る #UE4Osaka Run
おさらい: UE4のビルドの流れ Build Cook Stage Deploy Run 送ったファイルを 実機上で実行 #UE4Osaka
おさらい: UE4のビルドの流れ Build Cook Stage Run Deploy Package Stageでまとめられた 実行ファイルやアセットを用いて パッケージ作成 #UE4Osaka
Cook by The Book の流れ 必要なデータを前もってPC上でCookし、 先にゲーム機に転送しておく • ゲームはローカルのデータを見て動く。 Host PC 1. アセットを先に転送 0. 先に、アセットをCook #UE4Osaka 2. ゲーム起動
Cook On The Fly の流れ PC側にアセットサーバを立てて、 ゲーム実行時に必要なアセットを逐次Cookする方法 0. Asset Sever を立てておく Host PC 2. Asset Serverにアセットを依頼 Asset Server 3. Assetが CookeされてなければCook あれば、それを転送 #UE4Osaka 4. 転送 1. ゲーム起動
Cook On The Fly の注意点 毎起動時、アセットサーバからアセットを読み込んでくるので、 毎回、非常にロードが遅い。 • ロード時間の計測は不可能 • 大規模になればなるほど、ロード時間の大きさにより イテレーションが回しにくくなる。 ロードするものが少ない軽いシーンでは有効。 #UE4Osaka
Data Build By the book • 前もって必要なアセットを指定してCookしておく On the fly • アセットサーバをPC側に立てて、 実行アプリケーションから要求があった際に Cookを行う手法 Do not cook • アセットをcookしない #UE4Osaka
各プラットフォームへの Launch用プロファイル カスタムプロファイル #UE4Osaka
#UE4Osaka
各設定・よく使うオプションについて #UE4Osaka
プロファイル名(説明)・プロジェクト指定 ここでプロジェクトを指定しないと、 Cook対象のレベル一覧(後述)が表示されないので注意 • Any Project(任意のプロジェクト)のままでもOK #UE4Osaka
ビルド設定 • チェックボックスでビルドON・OFFを切り替え • Build UAT • UAT = Unreal Automation Tool #UE4Osaka
Cook – By the book Cooked Platforms • 対象のプラットフォームを選択(複数選択可) Cooked Cultures • 対象言語を選択 • 公式ドキュメント:ローカリゼーション • Asset Localizationに関する記事 • ローカライゼーションダッシュボードに関する記事 Cooked Maps • Cook対象のレベルを選択 • Cookされないレベルはゲーム中使えないので注意 #UE4Osaka
Cook – By the book (Release/DLC/Patching Settings) Releaseパッケージ用の設定 • Create a release version~ • Releaseを作る際は必ず有効に • DLC / Patchの場合は無効に • Name of the release to create • Releaseのバージョン名(数字以外もOK) • DLC / Patchを作る際に必要になるので注意 #UE4Osaka
Cook – By the book (Release/DLC/Patching Settings) DLC / Patchパッケージ用の設定 • Release version this~ • ベースとなるReleaseのバージョン名 • Generate patch • Patchを作る際は有効に • Build DLC • DLCを作る際は有効に #UE4Osaka
#UE4Osaka
Cook – By the book (Release/DLC/Patching Settings) DLCパッケージ用の設定 • Name of the DLC to build • DLCのバージョン名 • include engine content • ベースとなるReleaseに含まれていない エンジンコンテンツを含むか否か • 無効の場合、DLC内のアセットが エンジンコンテンツを使っているとエラー発生 #UE4Osaka
Cook – By the book (Advanced Settings) Iterative cooking • 変更があったアセットだけをcook対象に • 2回目以降のcook時間を大幅短縮! Compress content • 圧縮の使用有無 • 基本的に推奨(コンソールは話が変わるので注意) #UE4Osaka
Cook – By the book (Advanced Settings) Store all content in a single file • アセットを1つのPakにまとめる • 無効にすると、パッケージに どのアセットが含まれるかを確認可能 • Chunk機能を使う場合は必ず有効に • Generate Chunks • Chunk機能を使うか否か #UE4Osaka
Cook – By the book (Advanced Settings) Don’t include editor content ~ • エディタ上でしか使わないアセットを パッケージに含めるかどうか • パッケージサイズを大幅削減! • もしあるアセットが エディタコンテンツを参照していると エラーが発生するので注意 #UE4Osaka
Cook – By the book (Advanced Settings) Create Http Chunk Install data • サーバからChunkをダウンロードする場合は この設定を有効に Http Chunk Install Data Path • どのフォルダにダウンロード用の Chunkデータを出力するか Http Chunk Install Release Name • Chunkのバージョン名 #UE4Osaka
Cook – By the book (Advanced Settings) Cocker build configuration • ビルド設定 Additional Cooker Options • エディタ上では用意されていない より細かな設定を追加 • 例: -nodebuginfo : DebugFilesの生成をOFF #UE4Osaka
Package / Archive Package • パッケージの出力先を設定 Archive • バックアップ用 • Packageとほぼ同じ内容を 別フォルダに出力 #UE4Osaka
Deploy 生成したパッケージの転送先の指定 • Launchする場合は設定必須 • 複数の端末に同時に転送できる! #UE4Osaka
Launch Deployしたパッケージの起動設定 • 言語設定や Command Line Parameterの設定 #UE4Osaka
For Jenkinsおじさん Project Launcher実行時に出力される Parsing command lineを参考に コマンドからのパッケージングを 組むことをオススメします #UE4Osaka
ここまでのまとめ • Package Projectでお手軽にパッケージング可能 • Project Launcherを使うことで より詳細な設定(プロファイル)を作成可能 #UE4Osaka
最後に Chunk IDとその他のエディタ機能を使うことで コンテンツアップデートがより簡単にできるようになりました! モバイルだけでなくPCでも利用可能なので 是非活用して、ユーザに長く愛されるコンテンツを 作って頂けますと幸いです! #UE4Osaka
ご清聴 ありがとうございました! 本講演に関する質問はこちらからどうぞ! E-mail : [email protected] Twitter : @pafuhana1213 #UE4Osaka