[解決済み】Unity3D. 権限のないオブジェクトに対してコマンドを送信しようとする
質問
私は多人数参加型のターン制ストラテジーゲームを持っていますが、現在のゲーム状態(誰のターンか等)をコントロールするゲームマネージャーが必要です。このマネージャーは、すべてのクライアントで共通であるべきで、その状態はサーバー上で同期されるべきです。
こんな感じでやってます。 ゲームマネージャーオブジェクトはNetworkBehaviourであり、ローカルプレイヤー権限でもサーバー権限でもないNetworkIdentityを持っています。私はカスタムNetworkManagerを作り、クライアント接続時にゲームマネージャーを生成し、それがサーバーであるかどうかもテストしています。以下はそのコードです。
public override void OnClientConnect(NetworkConnection conn)
{
ClientScene.Ready(conn);
if (NetworkServer.active)
{
var manager = Instantiate(MultiplayerManagerPrefab, Vector3.zero, Quaternion.identity) as GameObject;
var tacticsManager = manager.GetComponent<MultiplayerManagerModel>();
NetworkServer.RegisterHandler(MsgType.AddPlayer, tacticsManager.CreatePlayerOnServer);
NetworkServer.Spawn(manager);
}
ClientScene.AddPlayer(0);
}
サーバー上で実行すると、クライアント上にインスタンスが作成され、サーバーからクライアントへ変数が同期され、正常に動作します。しかし、クライアントからコマンドを実行しようとすると、このような警告が表示され、無視されます。
権限のないオブジェクトに対してコマンドを送信しようとしています。 UnityEngine.Networking.NetworkBehaviour:SendCommandInternal(NetworkWriter.NetworkWriter.NetworkWriter), Int32, String)
この Game Manager はプレイヤーの前に生成されることに注意してください。私は何を間違えているのでしょうか?
解決方法は?
あなたのコード断片の横に、警告が表示されます。
<ブロッククオートを送信しようとしています。 コマンド を、権限のないオブジェクトのために使用しています。
という意味です。 あなたが送信しているのは コマンド を持つオブジェクトから 権限 を、あなた(プレイヤー)は持っていない。
Unityのドキュメントに書かれていること。 コマンド は、クライアント上のプレイヤーオブジェクトから、サーバー上のプレイヤーオブジェクトに送信されます。セキュリティのため コマンド からしか送信できません。 あなたのプレイヤーオブジェクト そのため、他のプレイヤーのオブジェクトを操作することはできません。
しかし
Unityリリース5.2より からコマンドを送信することができます。 ノンプレイヤーオブジェクト クライアント権限を持つ これらのオブジェクトは NetworkServer.SpawnWithClientAuthorityで生成された、あるいは NetworkIdentity.AssignClientAuthorityで権限を設定します。コマンド これらのオブジェクトから送信されたメッセージは、そのオブジェクトのサーバーインスタンス上で実行されます。 クライアントに関連付けられたプレイヤー・オブジェクトではなく ( より ).
では、その解決策とは。 を送信する前に コマンド (を実行する(または コマンド 関数)を使用します。 そのオブジェクトの権限を自分のプレイヤーに割り当てる . こんな感じ
assignAuthorityObj.GetComponent<NetworkIdentity>().AssignClientAuthority(this.GetComponent<NetworkIdentity>().connectionToClient);
" これ が、あなたのプレイヤーオブジェクトに表現されます。を作成した後 コマンド を呼び出すと、次のコードで権限を削除することができます。
assignAuthorityObj.GetComponent<NetworkIdentity>().RemoveClientAuthority(this.GetComponent<NetworkIdentity>().connectionToClient);
再び、"。 これ は、プレイヤーオブジェクトに表現されます。
重要なお知らせ : 私は通常、オブジェクトの権威を(それを使用したい場合)使用します。 OnTriggerEnter で権限を削除し OnTriggerExit . どのようなイベントでオブジェクトの権限を取得または削除するかは、特定のシナリオに依存します。
関連
-
[解決済み】文字列が有効な DateTime " format dd/MM/yyyy " として認識されなかった。
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み】ASP.NET Core Dependency Injectionのエラーです。アクティブ化しようとしているときに、タイプのサービスを解決できません。
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み】値が期待した範囲に収まらない
-
[解決済み】Socket.Selectがエラー "An operation was attempted on something that is not a socket" を返す。
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。
-
[解決済み】Moqを使用してメソッド呼び出しを検証する
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み] Unity3Dのソース管理でGitを使うには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コンパイルエラー「未割り当てのローカル変数を使用しています」が発生したのはなぜですか?
-
[解決済み】C#で四捨五入する方法
-
[解決済み】トランスポート接続からデータを読み取れない:既存の接続は、リモートホストによって強制的に閉じられました。
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み】値が期待した範囲に収まらない
-
[解決済み] [Solved] アセンブリ System.Web.Extensions dll はどこにありますか?
-
[解決済み】Socket.Selectがエラー "An operation was attempted on something that is not a socket" を返す。
-
[解決済み] ...基礎となる接続は閉じられました。予期しないエラーが受信で発生しました
-
[解決済み] 関数を終了するには?