PUN Classic (v1)、Boltはメンテナンスモードとなっております。Unity2022についてはPUN 2でサポートいたしますが、新機能が追加されることはありません。お客様のPUNプロジェクトおよびBoltプロジェクトが停止することはなく、将来にわたってパフォーマンス性能が落ちることはありません。 今後の新しいプロジェクトについては、Photon FusionまたはQuantumへ切り替えていただくようよろしくお願いいたします。

よくある質問

どのPhoton製品を使用するべきでしょうか?

対象となるゲームやプロジェクトの特性によって異なります。

通常、弊社はFusion または
Quantumの使用を推奨しています。これらは、弊社のもっとも高度なクライアントソリューションです。

概要について、どちらの製品シートにも製品選びのための「Quadrant」が記載されています:

また、Photon CloudとPhoton Serverのどちらを選択すべきかは、こちらを参照ください。

ご不明点はお気軽にお問合せください。

Photon Cloud

Photon Cloudのステータスを確認する方法は?

Photon Cloudのステータスを確認するには、こちらを参照するか、Twitterで@photon_statusをフォローしてください。
最新のステータスについてお知らせします。

デフォルトのPhotonリージョンは?

少なくとも1つのリージョンが利用できる場合、クライアントはPhoton Cloudに接続可能となるべきです。
この点を保証するため、ディベロッパーが明示的に設定しない場合や「ベストリージョン」オプションを選択しない場合には、デフォルト値を設定するか、
またはデフォルト値を使用する必要があります。
デフォルト値はクライアントSDKによって異なります。
ネイティブSDKでは、OpGetRegionsでサーバーによって返されるリージョンリストのインデックス0の値です。
UnityおよびDotNet SDKでは、デフォルトのリージョンは「EU」とする必要があります。

一部のリージョンを無効にすることは可能ですか?

はい。
許可されたリージョンのリストを定義することにより、別の方法で機能します。
詳細は、Dashboardリージョンのフィルタリングを参照してください。

切断後すぐにルームに再び参加する方法は?

ルームへの参加中に発生した予期しない切断から回復するために、クライアントはルームへの再接続と再参加を試みることができます。
これを「クイック再入室」と呼びます。
クイック再入室は、次の場合にのみ成功します:

  • ルームは同じサーバー上にまだ存在するか、読み込めます:
    プレイヤーが退室しても、他のプレイヤーがまだ参加している場合、後者はPhotonサーバー上で生き続けることができます。
    プレイヤーが最後に退出し、ルームが空になった場合、EmptyRoomTTLは、プレイヤーが参加または再参加するのを待機している時間です。
    EmptyRoomTTLの後、ルームがまだ空で、誰も参加していない場合、Photonサーバーから削除されます。
    永続化条件が満たされ、Webhookがセットアップされている場合、ルームの状態を構成済みのWebサービスに保存して、後で読み込むことができます。
  • アクターは内部でインアクティブとしてマークされます。同じUserIdを持つアクターがアクターのリスト内に存在しますが、現在ルームに参加していません。
    これには、PlayerTTLが0と異なる必要があります。
  • インアクティブなアクターのPlayerTTLが期限切れになりませんでした。アクターが戻ってくるオプションを選択してルームを出ると、インアクティブ化タイムスタンプを保存します。
    ルームが稼働している限り、インアクティブ化時間からPlayerTTLミリ秒が経過すると、それぞれのアクターがアクターのリストから削除されます。
    それ以外の場合、アクターが再入室を試みるときに、再入室の試行時間とインアクティブ化時間のミリ秒単位の差がPlayerTTLを超えると、アクターはアクターのリストから削除され、再入室は失敗します。
    そのため、インアクティブなアクターは、インアクティブ化時間の後、PlayerTTLミリ秒だけルームに再入室できます。

レース状態やその他のマルチスレッドの問題を回避する方法は?

Photonでは、可能な限りシンプルにすることを心がけました:

  1. 任意のスレッドからPhotonPeerメソッドを使用できます。
  2. PhotonPeerからのすべての通知は、1つのファイバーで実行されます(ファイバーについては、以下を参照してください)。
  3. ルーム内のすべてのタスクは1つのファイバーで実行されます。
  4. ピアは、マルチスレッドの問題からデータを保護するために、ルームのファイバーにメッセージを送信します。

ファイバーは、FIFO方式で1つずつ順番に実行されるタスクのリストです。
これは、それらが1つのスレッドで実行されることを意味しません。
実際には、多くのスレッドで実行されますが、1つずつ実行されます。
したがって、最初のタスクはスレッドAで実行され、終了すると、2番目のタスクはスレッドBで実行されます。
ただし、特定の瞬間に1つのスレッドだけがルームデータにアクセスします。
多くのファイバーが同じデータにアクセスする場合、ロックを使用します。
たとえば、ルームのキャッシュ内の場合です。

次のようにファイバーを使用できます:

C#

// rooms contructor
someFiber = new PoolFiber(); // create new fiber
someFiber.Start();
someFiber.ScheduleForInterval(someRepetitiveRoutine, 0, 100); // start immediately and repeat every 100 ms, ie 10 times per second. this params may vary as you need
// at some other point, where you need to add more logic to the fiber
someFiber.Enqueue(newTask);
someFiber.Enqueue(()=>{ anotherTask(parameters);});
// from the tasks you can send messages to the room e.g. to notify the room of a result of a task
room.EnqueueMessage(new YourCustomMessage(somethingToSend));

同じコードまたは同じデータを共有する複数のカスタムファイバーを使用する場合、異なるファイバーのアクションが同時に実行されるため、アクセスを同期する必要があることに注意してください。

ログの記録

クライアントが接続または切断する度にログエントリーを書く方法は?

アプリケーションのlog4net.configに以下を追加してください:

XML


<logger name="Photon.SocketServer.ApplicationBase">
	<level value="DEBUG"/>
</logger>

「{MyApplication}.log」からの出力:

正常な接続:

2013-05-02 11:19:02,506 [23] DEBUG Photon.SocketServer.ApplicationBase [(null)] - OnInit - ConnID=17, IP 127.0.0.1 on port 4530
2013-05-02 11:19:02,506 [23] DEBUG Photon.SocketServer.ApplicationBase [(null)] - OnInit - response sent to ConnId 17 with SendResult Ok

切断:

2013-05-02 11:19:07,608 [24] DEBUG Photon.SocketServer.ApplicationBase [(null)] - OnDisconnect - ConnID=17

Photonがクライアントに作業レスポンスを送信する際にログエントリーを書く方法は?

アプリケーションの「log4net.config」に以下を追加してください:

XML


<logger name="Photon.SocketServer.PeerBase">
	<level value="DEBUG"/>
</logger>

「{MyApplication}.log」からの出力:

2013-05-02 11:19:02,569 [21] DEBUG Photon.SocketServer.PeerBase [(null)] - SentOpResponse: ConnID=17, opCode=255, return=0, ChannelId=0 result=Ok size=14 bytes

Photonがクライアントから作業リクエストを受信した際にログエントリーを書く方法は?

この様なログは、アプリケーションのPeerクラス(HivePeerから継承します)でおこなうのが最適です。

XML


<logger name="Photon.Hive.HivePeer">
	<level value="DEBUG"/>
</logger>

「{MyApplication}.log」からの出力:

2013-05-02 11:19:02,553 [21] DEBUG Photon.Hive.HivePeer [(null)] - OnOperationRequest. Code=255

OnOperationRequestメソッドで、ログエントリーの内容を修正可能です。

C#

protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters)
{
	if (log.IsDebugEnabled)
    {
		log.DebugFormat("OnOperationRequest. Code={0}", operationRequest.OperationCode);
	}
	// snip
}

クライアントが切断する理由は?タイムアウトのデバッグ方法は?

クライアントが切断する理由を確認するには、ピアでOnDisconnectが呼び出された場合のデバッグログエントリーを書くようにしてください。

XML


<logger name="Photon.Hive.HivePeer">
	<level value="DEBUG"/>
</logger>

ピアクラス(HivePeerから継承します)では、OnDisconnect()メソッドは以下のようになります:

C#

protected override void OnDisconnect(DisconnectReason reasonCode, string reasonDetail)
{
	if (log.IsDebugEnabled)
    {
		log.DebugFormat("OnDisconnect: conId={0}, reason={1}, reasonDetail={2}", this.ConnectionId, reasonCode, reasonDetail);
	}
	// 	
}

「{MyApplication}.log」からの出力:

2013-05-02 11:19:07,639 [12] DEBUG Photon.Hive.HivePeer [(null)] - OnDisconnect: conId=17, reason=ClientDisconnect, reasonDetail=

UDPを使用している場合:「TimeoutDisconnect」の際は、以下のように「reasonDetail」にRoundTripTime履歴が含まれます。

index - sequence - rtt - variance - sentTime - recvTime - cmd_rtt

0 - 326 - 0 - 0 - 830717056 - 830728351 - 11295
1 - 325 - 89 - 19 - 830715918 - 830716042 - 124
2 - 324 - 85 - 14 - 830714826 - 830714904 - 78
3 - 323 - 86 - 17 - 830712751 - 830712813 - 62
4 - 322 - 89 - 14 - 830711659 - 830711737 - 78
5 - 321 - 90 - 16 - 830710551 - 830710645 - 94
6 - 320 - 90 - 19 - 830709428 - 830709537 - 109
7 - 319 - 88 - 19 - 830708320 - 830708414 - 94
8 - 318 - 88 - 23 - 830707197 - 830707306 - 109
9 - 317 - 86 - 24 - 830706105 - 830706183 - 78
10 - 316 - 87 - 29 - 830704701 - 830704763 - 62
... etc ...

各行は以下の値から成ります:

  • Index -(0から49の範囲の値をとり、0は最新で49は最も古いです。直近の50個のエントリーのみが表示されます。)
  • Sequence - 増加するシーケンス番号
  • rtt (RoundTripTime - 最新のRTT、ミリ秒単位 - ACKの処理後、またはタイムアウトの発生後から利用可能です)
  • variance (最新の偏差、ミリ秒単位)
  • sentTime (コマンドが送信された時刻)
  • recvTime (ACKが受信された時刻)
  • cmd_rtt ( コマンドが送信されてからACKを受信するまでのタイムスパン、ミリ秒単位)

上記の例では、クライアントのcmd_rttは62ミリ秒から124ミリ秒でした。最後のコマンドに対してACKを受信しなかった後、11秒間にわたって切断しました。

Photon Bolt

厳密な比較とは?

厳密な比較は、ベクトルに対しておおよその比較を行う組み込みのa != bを使用する代わりに(a.x != b.x) || (a.y != b.y) || (a.z != b.z)を行います。複製が必要な非常に小さな変更がある場合に役立ちます。

再配布可能なBolt Serverビルドを作成する方法はありますか?

はい、Boltはヘッドレスサーバーの作成に対応しているため、任意のコンピューターで実行できます。
Photon Cloudを使用するBolt Freeを使用している場合、他のプレイヤーが参加できるようにルームを公開するだけです。Bolt Proを使用している場合でも、ローカルまたは任意のクラウドサービスで実行できます。IPが接続する他のプレイヤーに送信する方法が必要です。

また、こちらに単純なヘッドレスサーバーのサンプルも用意されています。

ロケットのような発射物のラグを補償する必要がありますか?

発射体を発射する武器の場合、遅れ補償は問題になる可能性が高くなります。
たとえば、発射物がサーバー上で自律的に存在する場合、発射物はどの時間空間に存在する必要がありますか?
発射物をサーバーでシミュレートして移動する準備ができるたびに、他のすべてのプレイヤーを「後退」させる必要がありますか?
必要な場合、他のプレイヤーをどれだけ時間的に後方に移動させるべきですか?これらは考慮すべき興味深い質問です。
単に発射物オブジェクトを遅らせることはありません(つまり、クライアントで発射物を発射する音を予測しないということではなく、実際の発射物が遅れ補償されないというだけです)。
詳細はこちら

プロジェクトのすべてのボルトアセットをクリアする方法は?

すべてのBoltアセットは project.jsonファイルにシリアル化されているため、以下をクリアします:

  1. Unityを閉じる。
  2. <Project Folder>/Assets/Photon/PhotonBolt/project.jsonファイルを削除する。
  3. Unityを開く。
  4. Boltのコンパイル。Bolt/Compile Assemblyメニュー。

EC2のヘッドレスサーバーにBolt Freeを使用する場合の推奨構成は何ですか?

>Firewall Configuration
Firewall Configuration.

スニペット

ゲームの開発に役立つ小さなコードのリストを次に示します。

テレポートする方法は?

デフォルトでは、Boltは、移動する距離がエンティティで指定されたTeleport Thresholdよりも短い場合、エンティティを自動的に補間/補外します。
これを超えると、スムージングをスキップするテレポートが強制され、これは自動的に行われます。
Bolt.IState.SetTeleport(NetworkTransform transform)を使用してテレポートを強制することができます。これは、クライアントに送信される次の位置更新のリクエストを本質的にキューに入れ、設定に関係なくテレポートを強制します(1つの送信ティックに対して-フラグは送信後にfalseに戻ります)。

C#

void Teleport(Vector3 newPosition)
{
    state.SetTeleport(state.transform);
    player.transform.position = newPosition
}

その場合、SessionListUpdatedが呼び出されないときに検索時にセッションが存在しないことをどのように確認しますか?

たとえば、1.2.9より前に、ルームリストの更新を5秒に設定した場合、コールバックを受信するには5秒待つ必要があります。
その後、使用可能なセッションがないことがわかります。
これで、Photon Bolt 1.2.9以降では、同じ5秒間待機するように接続したときにコルーチンプロセスを開始できます。

Getting Startedサンプルに付属する基本メニュースクリプトに実装例を含めました。
主な部分は次のとおりです。

C#

public class Menu : Bolt.GlobalEventListener
{
    private Coroutine _timerRoutine;

    // ...

    public override void BoltStartDone()
    {
        // ...

        if (BoltNetwork.IsClient)
        {
            // This will start a server after 10secs of wait if no server was found
            _timerRoutine = StartCoroutine(ShutdownAndStartServer());
        }
    }

    public override void BoltShutdownBegin(AddCallback registerDoneCallback)
    {
        registerDoneCallback(() =>
        {
            BoltLauncher.StartServer();
        });
    }

    public override void SessionListUpdated(Map<Guid, UdpSession> sessionList)
    {
        // Stop background routine if a server was found
        if (_timerRoutine != null)
        {
            StopCoroutine(_timerRoutine);
            _timerRoutine = null;
        }
    }
}

ゲームサーバーの起動時に特定のポートを設定する方法は?

Photon Boltインスタンスをゲームサーバーとして実行する場合、ピアがバインドを試行するIP/ポートを構成できます。
これは、たとえばクラウドサービスでゲームをホストしていて、使用するポートの範囲が限られている場合に便利です。

デフォルトでは、Boltはオペレーティングシステムに内部ソケットをバインドするポートを選択させますが、以下に示すように、 BoltLauncher.StartServerの適切なオーバーロードを呼び出すことで上書きできます。

C#

public static class BoltLauncher
{
// ...
    public static void StartServer(int port = -1);
    public static void StartServer(UdpEndPoint endpoint, string scene = null);
    public static void StartServer(UdpEndPoint endpoint, BoltConfig config, string scene = null);
// ...
}

したがって、この方法でサーバーを起動できます:

C#

void StartBoltServer()
{
    // Custom Port number
    BoltLauncher.StartServer(<custom port>);

    // OR

    // Custom IP and Port number
    BoltLauncher.StartServer(new UdpEndPoint(UdpIPv4Address.Parse("<custom IP>"), <custom port>))
}

Boltのデフォルトの設定をコードを使用して変更する方法は?

サーバーまたはクライアントを起動する前にコードでBoltの設定をカスタマイズしたい場合には、
BoltRuntimeSettings.GetConfigCopyを呼んでください。これによって、返されたオブジェクトが修正され、StartClientまたはStartServerへの最後の引数として渡されます。

コードを使用すれば、Bolt Settings ウィンドウに表示されていない詳細設定にもアクセスできます。

C#

    BoltConfig config = BoltRuntimeSettings.instance.GetConfigCopy();

    // change any settings you want on the config object here,
    // be aware that bolt will not verify/limit any settings when you do
    // it directly in code, so you can break things completely by supplying
    // incorrect/invalid config values.

    BoltLauncher.StartServer(new UdpEndPoint(UdpIPv4Address.Any, 27000), config);

Boltでインターネット接続が失われたことを検出するにはどうしたらいいですか?

デフォルトで、インターネットの接続が失われるとBoltがPhoton Cloudサービスやリモートサーバー、またはクライアントとの接続不良を検出します。すべての場合において、タイムアウトが発生した後にローカルのインスタンスがシャットダウンされます。これは主に接続サイド(サーバなのかクライアントなのか)および接続タイプによります。

シャットダウンにあたり、現在シーンで実行されている次のコールバックをいずれかのBolt.GlobalEventListenerで受信します。:

C#

public override void BoltShutdownBegin(AddCallback registerDoneCallback, UdpConnectionDisconnectReason disconnectReason)
{
    registerDoneCallback(() =>
    {
        // Will show disconnect reason.
        Debug.LogFormat("Shutdown Done with Reason: {0}", disconnectReason);

        // Show the current connectivity of the peer
        ConnectivityCheck();

        // Lods the Scene at index 0
        SceneManager.LoadScene(0);
    });
}

void ConnectivityCheck()
{
    if (Application.internetReachability == NetworkReachability.NotReachable)
    {
        Debug.Log("NotReachable");
    }
    else if (Application.internetReachability == NetworkReachability.ReachableViaCarrierDataNetwork)
    {
        Debug.Log("ReachableViaCarrierDataNetwork");
    }
    else if (Application.internetReachability == NetworkReachability.ReachableViaLocalAreaNetwork)
    {
        Debug.Log("ReachableViaLocalAreaNetwork");
    }
}

インターネット接続不良により切断されたかどうかを確認するには、Unity APIから閲覧可能なApplication.internetReachabilityプロパティを確認します。

請求

学生、趣味でおこなっているディベロッパー、インディー向けの割引はありますか?

弊社の製品にはすべて、無料プランとワンショットのプランがあります。
また弊社は通常、Unityアセットストアのセールに参加し、また当選者にはクーポンを提供しています。

1つのPhotonアプリケーションに、複数の100CCUプランを組み合わせることはできますか?

いいえ。
The 100 CCUプランは、
AppID1つにつき適用できる100CCUプランは1つです。
有償サブスクリプションと組み合わせ、100CCUプランの期間中全体CCUに加算することは可能です。
自動更新はされません。

1つのアプリに対してより多くのCCUが必要でしたら、その次の段階のプランは500 CCUプランとなります。
月間プランまたは年間プランをご利用中の場合、その月間・年間プランのCCUに加えて100CCU分が追加されます。

QuantumおよびFusionのFree 100CCUプランのみ例外で、Unityアセットストアの100 CCUクーポン(Quantum PlusおよびFusion Plus)と組み合わせることができます。

Photonのプランに付随するトラフィック数はどれくらいですか?また、付随トラフィックの上限を超えたトラフィック数をアプリで生成した場合どうなりますか?

Photon Public CloudおよびPremium CloudプランではCCUごとに3GB含まれています。

たとえば、1,000 CCUの月間プランの場合、月々の付随トラフィック数は3TBとなります。

アプリでこれ以上のトラフィック数が生成されると、当社から自動的にメール通知が送信されます。月末になると、お客様のPhotonアカウントにご登録のメールアドレスに、自動生成された超過請求書が送信されます。請求金額は以下の計算に基づいて決定されています。

合計トラフィック数 - 付随トラフィック数 = 超過トラフィック (単位:GB)

トラフィック料金は、ご使用になるPhoton Cloudリージョンに応じて計算し請求いたします。

ピークCCUがPhoton Cloudプランで予約しているCCUを超過した場合どうなりますか?

ご登録されているプランが、500 CCU / 1,000 CCU / 2,000 CCUプランのいずれかであれば、お客様のアプリケーションに対して「CCUバースト」が自動で有効化されています。お客様のユーザーにできる限り最善の体験をお届けするため、Photon Cloudが予約分以上のCCUも使用を許可します。

バーストが発動すると、ご契約中の利用規約に応じて、48時間以内に必要なCCU数をまかなうサブスクリプションレベルにアップグレードしていただく必要があります。

アップグレードが行われない場合は、Photonアカウントにご登録のメールアドレスにご登録中のプランのCCU数を超過した分について、1CCU単位で計算された超過利用金額をご請求します。

Photonでは「ピークCCU」で請求額を決定しています。これは、当月使用されたリージョンごとのピークCCUの合計です。超過料金請求を防ぐため、ピークの後に使用量が下がったとしても、アップグレードを必ず行ってください。

Back to top