クイックスタート

ここでは簡単なチュートリアルを通じて、Strixを使ったオンラインゲームを作ってみます。Strixの重要な機能や、それらの機能を実際のゲームで利用する方法についても説明します。

準備

始めるにあたって、「Strix Cloudのセットアップ」に記載の手順に従って、ご自分のStrixサーバーがクラウド上で動作しているようにしてください。

Unrealエディターを起動して、新しいプロジェクトを「サードパーソン」テンプレートを用いて(スターターコンテンツ有りで)作成します。この設定はこのチュートリアル用です。もちろんStrixは、どんな種類のゲームでも使用できます。

このチュートリアル用にプロジェクトを作成したら、Unreal エディターをいったん終了し、「SDKのインストール」に記載の手順に従ってStrix Unreal SDKのプラグインをこのUnrealプロジェクトにインストールします。

注釈

このチュートリアルはUnreal Engine 4.21を使って執筆しています。Unreal Engineにはときどき変革が起きるので、別のバージョンのUnreal Engineをお使いの場合、表示されるUIが異なるかもしれません。このチュートリアルをお試しになる場合は4.21をお使いになる方が無難でしょう。

初期セットアップ

新しいプロジェクトでは、最初にGameInstanceクラスを作成し、そこで初期接続を実行します。

  • Unrealのプロジェクトを開きます。

  • コンテンツブラウザで、[新規追加] メニューに移動し、[基本アセットを作成] の下にある[ブループリントクラス] を選択します。

    ../../_images/addgameinstance1.png
  • GameInstanceクラスを拡張するので、[親クラスを選択] ウィンドウGameInstanceを検索し選択します。

    ../../_images/addgameinstance2.png
  • これで、コンテンツブラウザに新しいGameInstanceが作成されます。StrixGameInstanceなど、分かりやすい名前を付けます。

  • [設定] > [ゲーム固有の設定] > [プロジェクト設定] で、[マップ&モード] の下にある [GameInstance] を探します。見つかるとドロップダウンボックスがあり、現在のGameInstanceが指定されています。GameInstanceを先ほど作成したStrixGameInstanceに設定します。そうすることで、StrixGameInstanceをこのゲームのGameInstanceクラスとして使用するようUnrealに指示します。より複雑なゲームでは、サーバーブラウザーの実装などを行うために、GUIウィジェットを使用して接続ロジックを実装することをお勧めしますが、この例ではGameInstanceを使用します。このロジックはゲームの起動時に実行され、Strixのブループリント関数はどこからでも呼び出すことができるためです。

  • [コンテンツブラウザ] に戻り、新しいゲームインスタンスをダブルクリックしてブループリントとして開き、次の変数を追加します。Master HostnameApplication IDの値が分からない場合は、Strix Cloudのセットアップを参照してください。

    Master Hostname

    String

    これはマスターサーバーのホスト名です。Strix Cloudのページで確認できます。

    Master Port

    int

    これはマスターサーバーのポート番号です。Strix Cloudを使用する場合は9122です。

    Application Id

    String

    アプリケーションの一意のIDです。Strix Cloudのページで確認できます。

    Member Properties

    Strix Property Map

    これはStrixの構造体型で、クライアントのプロパティを表します。

    Room Properties

    Strix Property Map

    これはルームのプロパティを表します。

  • 変数を追加したので、これらの変数を設定してからいくつかの初期設定を行います。StrixGameInstanceブループリントでは、最初にEvent Shutdownイベントノードを追加し、その出力にStop Strix Networkノードを接続します。まだ行っていなければ、次にEvent Initで、Master Hostname、Master Port、Application Idの各変数を設定します。

    ../../_images/gameinstance1.png
  • これが終わったら、Strixが使用するいくつかの情報を設定する必要があります。まず、Member PropertiesRoom Propertiesの両方のセットノードを作成します。次に、Make Strix Property Map関数を使用して、各プロパティの新しいプロパティマップを作成します。以下に示すように、これらの出力をSet String PropertySet Int Property関数に個別に設定します。これらのプロパティが適切に機能するためには、メンバーのプロパティに "name" という名前のString(これはプレイヤーの名前です)と "capacity" という名前のIntが、またルームのプロパティに "name" という名前のStringが必要です。

    ../../_images/gameinstance2.png

注釈

見つけにくいバグを避けるために、プロパティ名では大文字と小文字が区別される点に注意してください。ほとんどの場合、プロパティの表示名は使用する必要がありません。同じことが型にも当てはまります。String型のプロパティに整数を設定しようとすると、リクエストがサーバー側で失敗します。

サーバーへの接続

変数を設定したので、Strixへの接続を開始します。

  • 次に実行する関数はInitialize Strix Network関数です。この関数は、アプリケーションIDを受け取り、Strixサービスをセットアップします。次に、Connect to Master Serverノードを追加してマスターホスト名とホストポートを定義します。このノードには、成功コールバックと失敗コールバックの2つのコールバックもあります。各コールバックからドラッグして、[イベントを追加] の下にある[カスタムイベントを追加] を選択します。これらのコールバックに分かりやすい名前を付けます。例えば、成功コールバックはOnMasterConnectSuccess、失敗コールバックはOnMasterConnectFailureのようにします。

    ../../_images/gameinstance3.png ../../_images/gameinstance4.png
  • Strixはイベント駆動型なので、コールバックをよく見かけるはずです。接続要求を行った後すぐに接続ノードの出力から実行を続けますが、接続が確立された後にアクションを実行するためには、次のステップはOnSuccessイベントから実行する必要があります。OnFailureイベントから、接続が失敗した場合を処理するロジックを含めておくこともお勧めします。

  • コールバックが設定されたので、ルームサーバーに接続できるようになりました。ただし、その前に、この操作が機能するために必要な情報を取得する必要があります。そのためには、Search Node関数を呼び出す必要があります。この例では、条件は使用せず、受信した配列の最初のノードを選択します。OnSearchNodeSuccess関数から、Connect To Room Server関数を呼び出しましょう。この関数は、ホスト名、ルームのポート番号、プロトコルフィールド、チャネルIDを受け取ります。以前と同様に、2つのコールバックイベントを追加します。1つは成功、もう1つは失敗です。

    ../../_images/gameinstance5.png

ルームの作成と参加

  • Strixではマスターサーバールームサーバーという2種類のサーバーを利用します。マスターサーバーは初期接続を処理し、ルームサーバーは実際のゲームがプレイされる複数のルームを処理します。ルームに参加する前にルームを作成する必要があります。これは簡単な例に過ぎないので、単にルームに接続してみて、ルームが見つからなければ作成することにします。始める前に遅延を追加します。これは、2人目のプレイヤーのインスタンスを開始する前にルームを作成する時間を確保するためです。ランダムな遅延(この例では最大5秒)を追加してからJoinRandomRoom関数を呼び出します。この関数は、OnRoomServerConnectSuccessからのチャネルID出力とMember Propertiesを受け取ります。これらの接続を作成したら、JoinRandomRoom関数から2つのコールバックを作成しましょう。

    ../../_images/gameinstance6.png
  • 成功すればルームに接続されます。ただし、最初のクライアントの場合はルームがないため、ルームを作成する必要があります。そのために、OnRoomJoinFailureイベントからCreate Roomの呼び出しを追加します。これは、MemberRoom Propertiesに加え、OnRoomServerConnectSuccessイベントから得たチャネルIDを受け取ります。Create Roomから成功と失敗のコールバックを追加し、確認のためにいくつかの情報を印刷します。ルームの作成に成功すると、自動的にルームに参加するため、ここからこれ以上関数を呼び出す必要はありません。

    ../../_images/gameinstance7.png
  • これで、ゲームの基本的な接続と参加の機能が完成しました。クライアントが起動するとランダムなルームに接続しようとするように設定しました。ルームに参加できなかった場合は初期状態のルームを作成します。この例は、適切な実装と言うには不足している点が多数あります。例えば、全てのクライアントが同じ名前を持っています。接続を適切に実装する方法について詳しく知りたい場合は、接続およびルームとマッチメイキングを参照してください。

注釈

GameInstanceを使用して、そこにマルチプレイヤーの機能を入れるという方法は、簡単なサンプルゲームにのみ適しています。通常、このロジックはUIウィジェットなど、他の場所に配置するべきです。

複製と同期の追加

  • この時点で、Strixサーバーに接続し、ルームを作成して参加できるようになりました。しかしゲーム自体はまだネットワーク対応していないので、プレイヤーが他のプレイヤーに一切影響を与えることができません!Strixを使用してサードパーソンのブループリントの内容を修正し、この問題を解決します。

  • 開始マップを開いてみましょう。プレイボタンを見つけ、[マルチプレイヤーオプション] のところへ行きます。ここで [プレイヤー数] を1から2に変更します。

    ../../_images/multiplayeroptions.png
  • 次に、[プレイヤー数] の人数の設定のすぐ下にある[詳細設定] を開きます。[Multiplayer Options] までスクロールし、[Auto Connect To Server] がチェックされていないようにします。これによってUnrealの組み込みマルチプレイヤーを無効にします。

    ../../_images/multiplayeroptions2.png
  • ゲームを起動すると、2つのウィンドウが表示されます。一方のクライアントが初期ルームを作成し、もう一方は遅延後にそのルームに参加するはずです。ただし、初期マップが同じであるとはいえ、まだ同期や複製を設定していないため、プレイヤーが相互作用することはできません。ThirdPersonCharacterのブループリントを編集して、この点を修正しましょう。ワールド内のThirdPersonCharacterをクリックしてから、[詳細] パネルの [ブループリントを編集] をクリックします。この新しいウィンドウのコンポーネントパネルで、[コンポーネントの追加] ボタンをクリックし、StrixReplicatorを検索して追加します。同様に StrixMovementSynchronizerも追加します。

    注釈

    Strixの機能はブループリントでのみ機能します。これらのコンポーネントは、ブループリントがアタッチされていないアクターでは機能しません。常にコンポーネントを追加し、アクターのブループリント内でのみ変更するようにしてください。

    ../../_images/character1.png
  • では、ゲームワールドに戻りましょう。プレイを押して、それぞれのプレイヤーで走り回ってみましょう。接続したので、各プレイヤーが同じルーム内で動いていることが分かります。これで、Strixを使用した基本的なゲームを作成できました。

    ../../_images/game1.png

RPCを用いてゲームに独自機能を追加

  • ただし、Strixにはさらに多くの機能があります。例えば、RPCを見てみましょう。

  • RPCを使用すると、他のマシンの関数を呼び出すことができます。複製されたプレイヤーに、単純には同期できないアクションを実行するように指示したい場合は、この方法を使います。実際、Movement Synchronizerを使用してジャンプすると、RPCを送信してジャンプのアクションを実行しています。

  • RPCを使用するには、まずThird Person Characterに呼び出す関数を定義します。Third Person Characterのブループリントを開き、[マイブループリント] パネルに移動します。そこで、[関数] の右側にある [+関数] ボタンをクリックし、新しい関数にMyRPCという名前を付けます。

    ../../_images/rpc1.png
  • そうすると、関数自身が別のブループリントとして開きます。この関数を使用して、キャラクターの色を変えることにしましょう。最初に、入力を追加します。これでStrix RPCを使用して引数を渡す方法が分かるでしょう。[関数] パネルでこの関数を選択するか、ブループリントで関数の開始ノードを選択し、次に [詳細] パネルの下の [インプット] セクションで [+新規パラメータ] ボタンをクリックします。

    ../../_images/rpc2.png
  • これで新しいパラメーターが作成されます。名前をColorに、型を [Float] に設定します。

    ../../_images/rpc3.png
  • これで関数のノードにColor引数ができました。キャラクターの色を変えるには、Create Dynamic Material Instanceノードを追加し、親をキャラクターのボディのマテリアル(M_UE4_MAN_BODY)に設定します。この戻り値をSet Vector Parameter Valueノードのターゲットに設定してパラメーター名をBodyColorに設定します。LinearColor を作成の構造体を追加し、MyRPC関数ノードのColor引数をMake LinearColor構造体のどれかのカラー値(今回は青)に設定します。戻り値を取得して、Set Vector Parameter ValueノードのValue入力に接続します。Set Materialノードを作成し、Targetをアクターのメッシュに、マテリアルCreate Dynamic Material Instanceノードの戻り値に、それぞれ設定します。ブループリントは下の画像のようになります。

    ../../_images/rpc4.png
  • この操作は良くご存じかもしれません。これは単なる関数の作成です。しかし、この関数はRPCで使用できるのです。まずRPCを登録する必要があります。[コンポーネント] パネルからStrix Replicatorコンポーネントを選択します。すると、[詳細] パネルにイベントのリストが表示されます。On Sync Beginイベントをクリックすると、それがブループリントに追加されます。このイベントは、アクターの同期の準備ができるとStrixによって呼び出されます。次に、イベントの実行をRegister Strix RPC関数に接続します。最後に、ターゲットをselfに設定し、関数名を先ほど定義した関数MyRPCに設定します。

    ../../_images/rpc5.png
  • これでRPC関数を登録しましたが、これを呼び出す必要があります。私たちのキャラクターは既にJump関数を持っているので、このロジックを利用します。(ここでは、標準のキープレスのロジックを使用し、タッチ入力は無視します)。Jumpノードの実行ピンからドラッグして、MyRPCを呼び出します。そこからfloatの変数を作成し、Colorという名前にし、それを適当な値に設定します。青の最大値である1に設定することにしましょう。

    ../../_images/rpc6.png
  • これで、ジャンプするとキャラクターの色が青に変わります。しかし、レプリカのキャラクターは更新されません。それは、RPCをまだ全員に送信していないためです。これを行うには、Jumpを呼び出した後のMyRPC呼び出しからBranchを作成します。次に、Strix Replicatorコンポーネントを [コンポーネント] パネルからブループリントにドラッグして、そのリファレンス出力からGet Is Ownerノードを追加します。Get Is Ownerは、どれがローカルインスタンスでどれがレプリカなのかをStrixが教えてくれる仕組みです。この結果をBranch Conditionに設定します。条件がTrueの場合はRPCを呼び出しますが、Falseの場合はレプリカなので無駄なRPCを送信しません。実際には、これは常にTrueになります。それは、RPCを呼び出すために入力イベントを使用しているため、オーナーアクターのみがこのコードに到達することになるからです。とはいえ、これがオーナーとレプリカを区別する方法です。

  • ブランチTrue実行ピンから、Send RPC to Allノードを作成します。次に、TargetSelfに、Function NameMyRPCに設定します。ColorからドラッグしてToStrixRelayArg(float)変換を配置できるはずです。この出力をSend RPC to AllノードのArgs入力に接続します。

    ../../_images/rpc7.png
  • これで、他のプレイヤーのウィンドウでも、ジャンプするとプレイヤーが青くなる様子を見ることができます。ご覧のとおり、Strix RPCを使用する上で最も複雑な部分は、最初に使用する予定の実際の関数を作成することです。実際のRPC呼び出しは手早く簡単ですし、さまざまな種類の呼び出しとさまざまな引数変換も提供しています。

    ../../_images/rpc8.png

同期プロパティの利用

  • Strixは同期可能なプロパティも提供します。これらのプロパティは、クライアント間でさまざまな型の変数を同期できます。もう一度MyRPC関数を使って、これを試してみましょう。

  • 最初に、MyColorというfloatの変数を作成し、その [詳細] パネルで[レプリケーション]を[Replicated]に設定します。

    ../../_images/synccolor.png
  • 次に、Event Tickから、色をデルタ値に設定しキャラクターの色を更新しようと思います。Event Tickノードから、以前と同様にオーナーであるかどうかを確認しましょう。そうでない場合は、MyColorを入力としてMyRPC関数を呼び出します。これにより、レプリカの実際の色が更新されます。オーナーである場合は、MyColorが1.0以上かどうかを確認します。そうであればMyColorを0に設定します。そうでなければ、それにデルタ値を加えます。これは、色の値がだんだん増加して1秒で最大値になり、0に戻って繰り返すことを意味します。関数呼び出しを再度接続して、ローカルプレイヤーの色を更新します。

    ../../_images/colorsynccode.png
  • これで、ゲームの両方のキャラクターで色が変わっているのが分かります。変化が完全にスムーズではないことに注意してください。Strix Replicatorは1/5秒に1回しか複製を行わないからです。これは、レプリケーターの [詳細] パネルで変更できます。

    ../../_images/syncexample.png

お疲れさまでした!さらに詳しく知るには、残りのドキュメントを参照するか、サンプルプロジェクトを触ってみてください。

Strixをご利用いただきありがとうございます。