Engine続行するにはJavascriptを有効化してください。Realtimeインディーかプロのディベロッパーかを問わず、誰でもリアルタイムマルチプレイヤーゲームを開発してグローバルに配信可能です。PUNインディーかプロのディベロッパーかを問わず、誰でもリアルタイムマルチプレイヤーゲームを開発してグローバルに配信可能です。Quantumマルチプレイヤーゲーム開発の革新に参加しよう!MOBA、ブローラー、RTS、戦闘ゲーム、スポーツゲームを迅速な予測ネットワーキングエンジンで開発できます。Chat同時接続数をスケールできるクロスプラットフォームのチャットシステムをあなたのアプリに簡単に統合できます。Voice大規模かつインターナショナルな最先端のライブボイスチャット。すべてのマルチプレイヤーエンジンと併用可能。Classic(PUN1とも呼ばれます)はPUNのはじめの主要バージョンです。現在は、リファクタリングおよび機能拡張されたPUN2に切り替わっています。新しいプロジェクトはPUN2をご利用いただき、また可能であれば既存のプロジェクトについてもPUN1からPUN2へ移行していただくよう強く推奨しています。Cloassicは今後数か月メンテナンスされます。重要なバグの修正や新しいUnityバージョンのサポートは行いますが、新機能の追加はPUN2のみとなります。UIシステムを作成する方法を説明します。プレイヤーの名前と現在の体力を表示する必要があります。プレイヤーを追従するためにUIの位置を管理する必要があります。このセクションはネットワーキングとは関係がありませんが、ネットワーキングに関するいくつかの高度な機能を提供し、また開発時の制約について説明するため重要な設計パターンをいくつか記載しています。必要がないのでUIはネットワーク化されません。トラフィックを使用せずに進める方法は、他にたくさんあります。これは常に追及すべきことです。機能をネットワーク化せずにすむのは良いことです。次に考えるべきことは、ネットワーク化された各プレイヤーにどのようにUIを用意するかです。専用のPlayerUIスクリプトを使用したUIプレハブがあります。PlayerManagerスクリプトはこのUIプレハブの参照を保持し、PlayerManagerが開始されるとこのUIプレハブをインスタンス化し、そのプレイヤーを追従するようプレハブに伝えます。Canvasを持つ任意のシーンを開きます。Transformの垂直アンカーをMiddleに、水平アンカーをCenterに設定します。RectTransformの幅を80、高さを15に設定します。Backgroundの子を選択し、Imageコンポーネントの色をRedに設定します。Area/Fill」の子を選択し、Image色をGreenに設定します。Textと名付けます。UIをドラッグします。これでプレハブができました。今後は不要なため、シーン内のインスタンスを削除します。新しいC#スクリプトを作成し、それをPlayerUIと名付けます。基本的なスクリプトの構造は以下の通りです。}}PlayerUIスクリプトを保存します。それでは、プレハブ自体を作成しましょう。1.プレハブPlayerUIにPlayerUIスクリプトを追加します。Text」をドラッグアンドドロップします。Componentをドラッグアンドドロップします。Topインスタンス化とプレイヤーとの結合PlayerUIをプレイヤーと結合'PlayerUI'スクリプトは、それがどのプレイヤーを代表しているかを認識する必要があります。その理由の1つは、その体力と名前を表示できるようにするためです。この結合を可能にするためにパブリックメソッドを作成してみましょう。スクリプトPlayerUIを開きます。Properties」リージョンにプライベートプロパティを追加します。_target;定期的に体力を調べるため、計画的に考える必要があります。効率を良くするためにPlayerManagerの参照をキャッシュすると有効です。Methods」リージョンに追加します。Regionに追加してください。}}PlayerUIスクリプトを保存します。これにより、対象プレイヤーの名前と体力を示すUIを設定できました。Topインスタンス化プレイヤープレハブをインスタンス化するたびに、このプレハブをインスタンス化する必要があると分かりました。初期化中にPlayerManagerの中からインスタンス化をおこなうのが最良の方法です。PlayerManagerを開きます。PlayerUiPrefab;Start()メソッド内に以下のコードを追加します。this);}PlayerManagerスクリプトを保存します。これらはすべてUnityの標準的なコーディング​​です。先ほど作成したインスタンスにメッセージを送信している点に留意してください。反応するコンポーネントをSetTargetが見つけらなかった場合に通知されます。一つの方法は、インスタンスからPlayerUIコンポーネントを取得し、SetTargetを直接呼び出す方法です。コンポーネントを直接使用することは一般的に推奨されますが、様々な方法で同じ目的を達成できることを知っておくと便利です。これでは不十分でプレイヤーを削除する必要があります。シーン上にorphelinのUIインスタンスが分散するのを避けるため、割り当てられた対象が無くなったことを確認し次第、UIインスタンスを破棄する必要があります。PlayerUIスクリプトを開きます。Update()機能を追加します。return;}PlayerUIスクリプトを保存します。このコードは簡単ながら非常に便利です。Photonがネットワーク化されたインスタンスを削除する方法を理由として、ターゲット参照がnullで発見された場合にUIインスタンスが自身を破棄した方が簡単です。することにより潜在的な問題の多くを回避し、非常に安全です。どんな理由でターゲットが欠損している場合でも、関連するUIは自動的に自身を破棄するので非常に便利で迅速です。ここで注意が必要です。新しいレベルが読み込まれると、UIは破棄されますがプレイヤーはとどまります。このためレベルが読み込まれたとわかったら、プレイヤーをインスタンス化する必要があります。以下をおこなってみましょう。PlayerManagerを開きます。CalledOnLevelWasLoaded()メソッド内に以下のコードを追加します。SendMessageOptions.RequireReceiver);PlayerManagerスクリプトを保存します。この処理をおこなうにはより複雑かつ強力な方法が存在し、UIはシングルトンから作成することも可能です。ルームに参加したり、ルームから退出したりする他のプレイヤーも同様にUIを処理する必要があるため、処理がすぐに複雑化してしまいます。私達がおこなう実装では、UIプレハブのインスタンス化による重複で、明快な処理になっています。簡潔に実行するため、インスタンス化をおこなうプライベートメソッドを作成して、"SetTarget"メッセージを様々な場所から送信し、コードを複製することなくメソッドを呼ぶことが可能です。GameObject内に配置しなければならないことです。そのため、PlayerUIプレハブがインスタンス化される時に処理をする必要があります。これは、PlayerUIのインスタンス化の際に行います。PlayerUIスクリプトを開きます。Messages」リージョン内に追加します。(GameObject.Find("Canvas").GetComponent<Transform>());}PlayerUIスクリプトを保存します。このように力ずくの方法でキャンバスを見つけるのでしょうか?それは、シーンが読み込まれたりアンロードされる際はプレハブも同様に読み込まれたりアンロードされ、キャンバスは毎回異なるものになるためです。複雑なコード構造を避けるため、最も簡単な方法を使用します。「Find」は遅いので、使用は推奨されません。複雑な処理を実装するのはこのチュートリアルの範囲外ですが、Unityやスクリプトに慣れたら試してみてください。読み込みやアンロードを考慮に入れた、キャンバス要素参照のより良い管理方法をコーディングできます。Top対象プレイヤーの追従これは非常に興味深い点です。UIにPlayerターゲットを追従させる必要があります。これを実現するには、いくつかの小さな問題を解決する必要があります。UIは2D要素で、プレイヤーは3D要素です。*UIがプレイヤーよりわずかに上に位置することは好ましくありません。Properties」リージョン内にこのパブリックプロパティを追加します。Messages」内にこれらの3つのプライベートプロパティを追加します。_characterController.height;}プレイヤーはHeightプロパティを持つCharacterControllerにもとづいています。これは、プレイヤーの上のUI要素のオフセットを適切におこなうために必要です。}}PlayerUIスクリプトを保存します。2Dの位置と3Dの位置を合わせる際のポイントは、カメラのWorldToScreenPoint機能を使用することです。ゲーム内には1つしかないので、Unityシーンのデフォルト設定であるメインカメラにアクセスします。オフセットをいくつかのステップで設定しました。最初に対象の実際の位置を取得して_characterControllerHeightを追加し、プレイヤーのトップの画面位置を推定した後、最後に画面オフセットを追加します。