FieldWalker
FieldWalker の確認手順
目次
サンプル概要
本プロジェクトは、UnrealEngine の
Diarkis UnrealEngine Plugin
を使用したサンプルプロジェクト(FieldWalker
) です。Diarkis
のField
機能を確認することができます。FieldWalker
を複数立ち上げることで、他のクラアント端末で動かしているキャラクター位置の同期を確認することが確認できるサンプルです。UDP
プロトコル を使用して、キャラクター位置の同期する所を確認できます。対応する動作確認環境は
Windows10/11, Mac, iOS, Android, Nintendo Swtich, PS4, PS5, Xbox Series X|S
です。UE4.27.2, UE5.0.3 で動作確認済みです。
確認手順
Windows の確認手順
FieldWalker.uproject をマウス右コンテキストメニューから 「Generate Visual Studio project files」 を選択します。
Visual Sutdio で FiedlWaker.sln を開きます。
Diarkis サーバー接続先を、接続情報に合わせて以下のように指定してください。
(FieldWalker/Source/FieldWalker/Diarkis/DiarkisPluginBase.cpp)
クラアントキーが不要な際は、
clientKey = ""
で指定してください。ユーザー ID は、
uid = 0
とすると起動時にランダムで ID が指定されます。
ビルド&実行
Windows: VisualStudioで
DebugGame_Editor
Win64
を選択してビルドして実行
Mac の確認手順
FieldWalker.uproject をマウスコンテキストメニューから 「Generate XCode Project」 を選択します。
処理に失敗する場合は、以下のようにシェルコマンドを実行して、 FieldWalker.xcworkspace を作成します。
UE4.27 の場合
UE5.0 の場合
XCode 12.5.1 ( UE4.27 の場合 )
/XCode 13.3 ( UE5.0 の場合 )
で FieldWalker.xcworkspace を開きます。Diarkis サーバー接続先を、接続情報に合わせて以下のように指定してください。
(FieldWalker/Source/FieldWalker/Diarkis/DiarkisPluginBase.cpp)
クラアント・キーが不要な際は、
clientKey = ""
で指定してください。ユーザー ID は、
uid = 0
とすると起動時にランダムで ID が指定されます。
ビルド&実行
選択ビューポート
UE4Editor 起動後、ツールバーの
プレイ
ボタンを押下。選択ビューポート
/マルチプレーオプション
のプレイヤー数:1
を選択。
各画面の説明
MainMenu 画面
Diarkis サーバの指定
HostName : Diarkis HTTP サーバの URL を指定します。
ClientKey : もしDiarkis サーバが ClientKey を設定している場合はその Key を指定します。もし設定していない場合は、空で結構です。
UID : 他のクライアントとは異なる一意の UID を指定します。 注意! 他のクライアントと同じID を指定すると同期することができません。
同期方法の指定
SyncMethod : 同期方法(1分以内で参加する必要あり)
Field : Field 機能を使った同期。使用する Pod 数( UDP / TCP サーバの数)によって、Field が Grid で分割されます。
標準では UDP サーバは 1 Pod 起動されているので、1 Map が 4 Grid で分割されています。
Grid を跨ぐ移動を行うと、異なる Grid のキャラクター間では位置情報が送られないため、表示されなくなります。
Show Stat : フレームレートなどを表示します。
Fix FPS : FPS を固定にします。
FPS : 固定 FPS を 30 FPS / 60 FPS に切り替えます。
InGame 画面
Grid Size スライダー : Grid の大きさを変更するスライダー
Server Count スライダー : 接続されている UDP サーバーの数(これは Grid の数に影響します。)
アプリケーションの操作
動作確認(マルチプレーオプション)
UE4Editor 起動後、ツールバーの
プレイ
ボタンを押下。スタンドアローンゲーム
を選択。マルチプレーオプション
のプレイヤー数:2~4
を選択。
複数の Window が表示されて、ゲームの「 Start 」ボタンを押下
UID は同じものにならないように注意。UID が同じの場合、意図しない挙動になります。
Player を 複数にすると、PC のスペックによってはキャラクターの同期に遅延が発生する場合があります。
ログ出力
ログ出力
ログファイルは、以下フォルダに出力されます。
FieldWalker/logs/○○○○/ 以下フォルダ( OOOOはユーザーID )
ログは、デバック・ビルド時のみ出力されます。
Developmet ビルドでもログを出力する際は、DiarkisInterfaceBase コンストラクタで
bOutputLog = true
に調整します。DiarkisInterfaceBase のコンストラクタで、LogOutType でファイル出力、デバック出力に切り替えることができます。
ログレベルの変更
LoggerFactory コンストラクタで、ログの出力レベルを変更することができます。
クライアントライブラリのログを機能( UDP, TCP, Socket, Room, P2P, MatchMaker, Runtime など )ごとに出力レベルを設定できます。
Base クラスで設定しているログは、Runtime で出力レベルを指定できます。
例えば、DiarkisLoggerSeverity::Warning に設定したら、以下の順番で Warning 以下が出力されるようになります。
コードについて
FieldWalker 側の主なコード(Diarkis Plugin を利用したサンプル)
FieldWalker/Source/FieldWalker
FieldWalkerGameMode.h / FieldWalkerGameMode.cpp
: Game を管理している主クラス ( AGameModeBase )FieldWalkerCharacter.h / FieldWalkerCharacter.cpp
: 自分のキャラクー用のクラス ( ADiakisCharacter )
FieldWalker/Source/FieldWalker\Diarkis
DiarkisPluginBase.h / DiarkisPluginBase.cpp
: Diarkis Plugin を利用する基礎クラスDiarkisPluginIntterface.h / DiarkisPluginIntterface.cpp
: Diarkis Plugin を利用するインターフェースクラスDiarkisPluginSample.h / DiarkisPluginBase.cpp
: Diarkis Plugin を利用するサンプルクラス
Diarkis Pluginの主なコード
Client のコードについて
役割概要
Diarkis ライブラリをコントロールするインターフェースの親クラス
コードの場所
FieldWalker/Plugins/Diarkis/Source/Diarkis/Client
各クラス
DiarkisInterfaceBase.h / DiarkisInterfaceBase.cpp
: UE4 から Diarkis をコントロールするインターフェースクラス( libDiarkis をコントロール)DiarkisRoomBase.h / DiarkisRoomBase.cpp
: Room 機能の親クラス( libDiarkis をコントロール)DiarkisGroupBase.h / DiarkisGroupBase.cpp
: Group 機能の親クラス( libDiarkis をコントロール)DiarkisFieldBase.h / DiarkisFieldBase.cpp
: Field 機能の親クラス( libDiarkis をコントロール)DiarkisTcpBase.h / DiarkisTcpBase.cpp
: TCP 機能の親クラス( libDiarkis をコントロール)DiarkisUdpBase.h / DiarkisUdpBase.cpp
: UDP 機能の親クラス( libDiarkis をコントロール)DiarkisP2PBase.h / DiarkisP2PBase.cpp
: P2P 機能の親クラス( libDiarkis をコントロール)DiarkisMatchMakerBase.h / DiarkisMatchMakerBase.cpp
: MatchMaker 機能の親クラス( libDiarkis をコントロール)DiarkisRPCBase.h / DiarkisRPCBase.cpp
: RPC 機能の親クラス( libDiarkis をコントロール)
Extension のコードについて
役割概要
Diarkis ライブラリをコントロールするインターフェースの子クラス群
コードの場所
FieldWalker/Plugins/Diarkis/Source/Diarkis/Extension
各クラス
Character
( キャラクターのデータ同期クラス )DiarkisCharacter.h / DiarkisCharacter.cpp
: Diarkis の キャラクー同期用のクラスCharacterSyncData.h / CharacterSyncData.cpp
: キャラクター位置情報データをシリアライズ・デシリアライズするクラスCharacterMoveData.h / CharacterMoveData.cpp
: キャラクターの位置情報クラス。同期する際の初期位置CharacterStateData.h / CharacterStateData.cpp
: キャラクターの位置情報クラス。毎フレームの差分情報
Component
( Diarkis の 位置同期用の Component クラス)DiarkisSyncComponent.h / DiarkisSyncComponent.cpp
: Diarkis の 位置同期用の Component クラスDiarkisCharacterSyncComponent.h / DiarkisCharacterSyncComponent.cpp
: アクター作成時のカスタムデータ送受信のサンプル実装コンポーネント クラス
Movement
( Diarkis の 位置同期用のクラス )DiarkisMovementController.h
: 位置同期 Component のインターフェースクラスDiarkisLocalMovementSync.h / DiarkisLocalMovementSync.cpp
: ローカル用の位置同期 Component クラスDiarkisRemoteMovementSync.h / DiarkisRemoteMovementSync.cpp
: リモート用の位置同期 Component クラス
Diarkis/Utils
( ユーティリティクラス )DiarkisUtils.h / DiarkisUtils.cpp
ライブラリをコントロールするインターフェースのクラス(XXXBase の派生クラス)
DiarkisInterface.h / DiarkisInterface.cpp
DiarkisRoom.h / DiarkisRoom.cpp
: Room 機能をコントロールするクラスDiarkisGroup.h / DiarkisGroup.cpp
: Group 機能をコントロールするクラスDiarkisField.h / DiarkisField.cpp
: Field 機能をコントロールするクラスDiarkisTcp.h / DiarkisTcp.cpp
: TCP 機能をコントロールするクラスDiarkisUdp.h / DiarkisUdp.cpp
: UDP 機能をコントロールするクラスDiarkisP2P.h / DiarkisP2P.cpp
: P2P 機能をコントロールするクラスDiarkisMatchMaker.h / DiarkisMatchMaker.cpp
: MatchMaker 機能をコントロールするクラスDiarkisRPC.h / DiarkisRPC.cpp
: RPC 機能をコントロールするクラスDiarkisSyncData.h / DiarkisSyncData.cpp
: Diarkis 位置同期を処理するクラスDiarkisReplication.h / DiarkisReplication.cpp
: Room の Property を使用した変数の Replication 用クラスDiarkisActorManagement.h / DiarkisActorManagement.cpp
: Diarkis で管理する Actor を識別する ID
DiarkisNetwork のコードについて
役割概要
Diarkis Plugin のインターフェースクラス群
コードの場所
FieldWalker/Plugins/Diarkis/Source/Diarkis/DiarkisNetwork
各クラス
Event/Interfaces
( Diarkis Plugin の Room 機能のコールバックを受け取るインターフェースクラス )DiarkisNetworkCoreEvent.h
: Diarkis Plugin の Core イベントを表すインターフェイスDiarkisNetworkRoomEvent.h
: Diarkis Plugin の Room イベントを表すインターフェイスDiarkisNetworkGroupEvent.h
: Diarkis Plugin の Group イベントを表すインターフェイスDiarkisNetworkFieldEvent.h
: Diarkis Plugin の Field 機能のコールバックを受け取るクラスDiarkisNetworkP2PEvent.h
: Diarkis Plugin の P2P イベントを表すインターフェイスDiarkisNetworkMatchMakerEvent.h
: Diarkis Plugin の MatchMaker イベントを表すインターフェイス
Event/Emitters
( Diarkis の Room イベントをキューに溜めるクラス )DiarkisNetworkCoreEventEmitter.h / DiarkisNetworkCoreEventEmitter.cpp
: Diarkis の Core イベントをキューに溜めるクラスDiarkisNetworkEventEmitterBase.h / DiarkisNetworkEventEmitterBase.cpp
: 各種イベントを発生させる基底クラスDiarkisNetworkRoomEventEmitter.h / DiarkisNetworkRoomEventEmitter.cpp
: Diarkis の Room イベントをキューに溜めるクラスDiarkisNetworkGroupEventEmitter.h / DiarkisNetworkGroupEventEmitter.cpp
: Diarkis の Group イベントをキューに溜めるクラスDiarkisNetworkFieldEventEmitter.h / DiarkisNetworkFieldEventEmitter.cpp
: Diarkis の Field イベントをキューに溜めるクラスDiarkisNetworkP2PEventEmitter.h / DiarkisNetworkP2PEventEmitter.cpp
: Diarkis の P2P イベントをキューに溜めるクラスDiarkisNetworkMatchMakerEventEmitter.h / DiarkisNetworkMatchMakerEventEmitter.cpp
: Diarkis の MatchMaker イベントをキューに溜めるクラス
Modules
( Diarkis の Room 機能の状態をチェックしてコールバック・イベントをキューに溜めるクラス )DiarkisNetworkModuleBase.h / DiarkisNetworkModuleBase.cpp
DiarkisNetworkRoom.h / DiarkisNetworkRoom.cpp
: Diarkis の Room 機能の状態をチェックしてコールバック・イベントをキューに溜めるクラスDiarkisNetworkGroup.h / DiarkisNetworkGroup.cpp
: Diarkis の Group 機能の状態をチェックしてコールバック・イベントをキューに溜めるクラスDiarkisNetworkField.h / DiarkisNetworkField.cpp
: Diarkis の Field 機能の状態をチェックしてコールバック・イベントをキューに溜めるクラスDiarkisNetworkP2P.h / DiarkisNetworkP2P.cpp
: Diarkis の P2P 機能の状態をチェックしてコールバック・イベントをキューに溜めるクラスDiarkisNetworkMatchMaker.h / DiarkisNetworkMatchMaker.cpp
: Diarkis の MatchMaker 機能の状態をチェックしてコールバック・イベントをキューに溜めるクラス
DiarkisNetworkBlueprintLibrary.h / DiarkisNetworkBlueprintLibrary.cpp
: Diarkis Plugin の コールバック・イベントを Blueprint 関数として登録するクラスDiarkisNetworkManager.h / DiarkisNetworkManager.cpp
: Diarkis Plugin を管理するクラスDiarkisNetworkSubsystem.h / DiarkisNetworkSubsystem.cpp
: UDiarkisNetworkManagerインスタンスを保持するクラス
libDiarkis のコードについて
役割概要
Diarkis の C++ ライブラリ
コードの場所
FieldWalker/Plugins/Diarkis/Source/ThirdParty/libDiarkis/prebuilt
各ライブラリのファイル
win-x64 で使用しているライブラリ
(win-x64\bin\diarkis.dll)
macos-x64 で使用しているライブラリ
(macos-x64\lib\diarkis.dylib)
android で使用しているライブラリ
(android\libs\arm64-v8a\diarkis.so)
iOS で使用しているライブラリ
(iOS\lib_static\libdiarkis.lib)
switch で使用しているライブラリ
(nx64\Libraries\NX-NXFP2-a64\Release\libdiarkis.a)
ps4 で使用しているライブラリ
(ps4\lib_staic\libdiarkis.a)
ps5 で使用しているライブラリ
(ps5\lib_staic\libdiarkis.a)
xbox で使用しているライブラリ
(xbox-series\lib_staic\diarkis.a)
クラス図
Diarkis Plugin クラス図
Diarkis Plugin をカスタマイズするには
Diarkis ライブラリをコントロールするインターフェースのクラス(図の下赤枠)の派生クラスを用意して、処理をカスタマイズする。
ADiarkisPluginSample
を参考に処理をカスタマイズする。
キャラクター同期関連のクラス図
同期方法をカスタマイズするには
DiarkisLocalMovementSync
,DiarkisRemoteMovementSync
の派生クラスを用意して処理をカスタマイズするか、ADiarkisCharcter
の派生クラスを用意して、処理をカスタマイズする
同期機能について
Diarkis Plugin で同期できる機能について
Field Walker サンプルでは、Diarkis Plugin を使用した以下の機能の同期するサンプルが含まれています。
アクターのインスタンス管理
アクターの位置同期
変数のレプリケーション
RPC
これらの機能は UE の標準機能の通信処理とは異なる実装となっているため、通常の通信処理とは別途設定・実装を行う必要があります。また同期は、Diarkis Room の機能を使用して実装されているため、Room を使用して通信が可能な状態である必要があります。
アクターのインスタンス管理
DiarkisySyncComponent
を持つアクターがローカルで生成・削除されると、アクター・インスタンス管理のための情報がリモートへ送信され各ホストで同一のアクター・インスタンスが存在する状態に同期されます。マップに初期配置されているアクターは生成済みのインスタンスが再利用され、動的に作成されたアクターはリモートでも動的に新規 Spawn します。DiarkisySyncComponent
は Diarkis ネットワーク上でアクターを識別するためのDiarkis Actor ID
を持っており、この ID を使用してアクターを識別します。また、DiarkisySyncComponent
のオーナーかどうかを判断することが可能となっており、この情報を利用してローカルとリモート、それぞれの場合の挙動を切り替えられます。例えばThirdPerson_AnimSyncBP
ではこのフラグの設定によって、ローカルのCharacterMovement
から情報を取得するか、通信で取得した情報を使用するか切り替えています。この
Actor ID
やオーナーかどうかのフラグは Diarkis ネットワークに接続後、必要な情報がそろった後に利用可能となります。DiarkisSyncComponent
にはDiarkisActorIDDecided
イベントがあり、このタイミングを知ることができます。例えばThirdPersonCharacter
のBegin Play
でこのイベントを利用して、オーナーが確定後にレプリケーションや RPC の登録処理を実行しています。また、リモートのアクターを作成する際にカスタムデータを追加することが可能です。
UDiarkisCharacterSyncComponent::SerializeSpawnActorCustomPayload()
にてリモート・アクター作成データへカスタムデータを追加し、UDiarkisCharacterSyncComponent::DeserializeSpawnActorCustomPayload()
にて受信したデータから必要な情報を取得しています。
アクターの位置同期
Actor に
DiarkisSyncComponent
を 追加することで、これらの機能が有効になります。同一 Room に接続している他のホストに同一のアクターが自動的に作成されます。リモート側のTherdPersonCharacter
は自動的に位置と姿勢、ジャンプ状態などが同期され、リモートのホストが Room から退出するとローカルに存在するリモート・アクターも自動的に削除されます。
変数のレプリケーション
Actor が持つ変数をネットワーク経由で同期する機能です。対象の変数は
UPROPERTY()
が指定されている必要があります。対象の Actor と変数名を指定してRegister Replicated Variable
で登録し、Send Replicated Variable
を使用して必要なタイミングでデータを送信します。ただし送信間隔はDiarkisReplication::replicationMinimumInterval
が最短のタイミングとなります。サンプルではThirdPersonCharacter
の Blueprint のRegister Replicated Variables
やSend Replicated Variable
に実装が存在します。
RPC
Actor が持つ関数をネットワーク経由で呼び出す機能です。対象の関数は
UFUNCTION()
が指定されている必要があります。対象の Actor と変数名を指定してRegister Rpc UEFunc
で登録し、Send Rpc UEFunc All
等で送信します。リモート側で RPC を受信すると、同一 Actor ID を持つアクターの指定された名前のメソッドを呼び出します。サンプルではThirdPersonCharacter
の Blueprint のRegister RPCs
で登録し、AFieldWalkerCharacter::HandleFire()
でRPC
を送信しています。
動作確認環境
対応プラットフォーム
Windows10
Mac
Android
iOS
Nindtendo Switch
PS4 / PS5
Xbox Series X|S
UnrealEngine バージョン
4.27.2
5.0.3
UE 4.27.2
VisualStudio2019 Version142(16.10.4)
WindowsSDK Version 10.0.19041.0
Android 環境
android-studio-2020.3.1.22-windows.exe
Android NDK 22.1.7171670
Andriod 4.4 (APIレベル 19)
Mac/iOS 環境
XCode 12.5.1
Nitendo Switch 環境
UE4 のベースコード
「git@github.com:Diarkis/UnrealEngine.git」 レポジトリ
4.27.2 release タグ
コミット: d94b38ae3446da52224bedd2568c078f828b4039
UE4 Switch Platform 用パッケージ
別途 EpicGames 社から提供されているポータル・サイトより Console Switch よりコードを取得。
Switch_4.27.2-release.zip パッケージを使用
Switch NintendoSDK 12.3.2
PS4 環境
UE4 のベースコード
「git@github.com:Diarkis/UnrealEngine.git」 レポジトリ
4.27.2 release タグ
コミット: d94b38ae3446da52224bedd2568c078f828b4039
UE4 PS4 Platform 用パッケージ
別途 EpicGames 社から提供されているポータルサイトより Console PS4 よりコードを取得。
PS4_4.27.2-release.zip パッケージを使用
SDKバージョン 9.0008.000
PS5 環境
UE4 のベースコード
「git@github.com:Diarkis/UnrealEngine.git」 レポジトリ
4.27.2 release タグ
コミット: d94b38ae3446da52224bedd2568c078f828b4039
UE4 PS5 Platform 用パッケージ
別途 EpicGames 社から提供されているポータル・サイトより Console PS5 よりコードを取得。
PS5_4.27.2-release.zip パッケージを使用
SDK バージョン 4.51.00.01
Xbox Series X|S 環境
UE4 のベースコード
「git@github.com:Diarkis/UnrealEngine.git」 レポジトリ
4.27.2 release タグ
コミット: d94b38ae3446da52224bedd2568c078f828b4039
UE4 Xbox Series X|S Platform 用パッケージ
別途 EpicGames 社から提供されているポータルサイトより Console Xbox [GDK] / Xbox [XDX] よりコードを取得。
GDK_4.27.2-release.zip / XDK_4.27.2-release.zip パッケージを使用
GDK version 210402
UE 5.0.3
VisualStudio2019 Version142(16.10.4)
WindowsSDK Version 10.0.19041.0
Android 環境
android-studio-2020.3.1.22-windows.exe
Android NDK 22.1.7171670
Andriod 6.0 (APIレベル 23)
Mac/iOS 環境
XCode 13.3
UE 5.0.2
PS4 環境
UE5 のベースコード
「git@github.com:Diarkis/UnrealEngine.git」 レポジトリ
5.0.2 release タグ
コミット: d11782b9046e9d0b130309591e4efc57f4b8b037
UE4 PS4 Platform用パッケージ
別途EpicGames 社から提供されているポータルサイトより Console Playstation 4 よりコードを取得。
PS4_5.0.2-release.zip パッケージを使用
PS4 SDK Version 9.508.001
PS4 System Software 9.600.011
PS5 環境
UE5 のベースコード
「git@github.com:Diarkis/UnrealEngine.git」 レポジトリ
5.0.2 release タグ
コミット: d11782b9046e9d0b130309591e4efc57f4b8b037
UE4 PS5 Platform用パッケージ
別途 EpicGames 社から提供されているポータル・サイトより Console Playstation 5 よりコードを取得。
PS5_5.0.2-release.zip パッケージを使用
PS5 SDK Version 5.000.00.41
PS5 System Software 5.50.00.08
Xbox Series X|S 環境
UE5 のベース・コード
「git@github.com:Diarkis/UnrealEngine.git」 レポジトリ
5.0.2 release タグ
コミット: d11782b9046e9d0b130309591e4efc57f4b8b037
UE4 Xbox Series X|S Platform 用パッケージ
別途 EpicGames 社から提供されているポータルサイトより Console Xbox [GDK] よりコードを取得。
GDK_5.0.2-release.zip パッケージを使用
GDK: 211001 October 2021 Update 1
動作確認手順
Windows10 のパッケージ作成手順
「ファイル」メニュー⇒「プロジェクトをパッケージ化」⇒「Windows10(64bit)」を選択します。
パッケージの出力先のフォルダを指定します。
ビルドが成功したら、出力先に指定したフォルダの FieldWalker.exe から起動します。
Android 端末で動作確認手順(別途 AndroidStudio 環境のセットアップが必要)
UrealEditor のタスクバーの「設定」⇒「プロジェクト設定」を押下
APK のパッケージ化
Android パッケージ
最低限の SDK バージョン
ターゲット SDK バージョン
ビルド - arumv7 をサポートのチェックを外す( armv7 は順次対応予定)
arm64 をサポートにチェック
上記のそれぞれの項目を環境に合わせて設定します。
Android 端末を接続し、ツールバー「起動」の右▽からAndroidデバイスを選択します。
「起動」でパッケージビルド後アプリにパッケージが転送されます。
iOS 端末での動作確認手順
UrealEditor のタスクバーの「設定」⇒「プロジェクト設定」を押下します。
プラットフォーム項目の 「iOS」
「プロビジョニングプロファイル」の設定
「証明書」の設定
「 Bundle Display Name 」 の設定
「 Bundle Name」 の設定
「 Bundle Indentifier 」 の設定
iPhone 端末を接続し、ツールバー「起動」の右▽から iPhone デバイスを選択します。
「起動」でパッケージビルド後アプリにパッケージが転送されます。
Switch 端末での動作確認手順
EpicGames 社と 「 Epic Games Console NDA 」 を締結して、Switch 用の Platform コードを入手します。
UE4 4.27.2 のプロジェクトコードを取得します。
NintendoSDK 12.3.2 をインストール
UE4 4.27.2 の最新の対応が NintendoSDK 12.3.2 のため。
VisualStudio2019 ビルド:「 Development 」端末:「 Switch 」プロジェクト:「 FieldWalker 」 を選択してビルドします。
ビルドには数時間掛かる。ビルドできたら実行します。
最終更新