2017-02-03 1 views
2

私は何日間もこの問題に頭を悩まされています。ユニティマルチプレイヤーFPSクライアント/サーバーの相互作用の問題

ゴール: 私は、プレイヤーが銃を発射できる学習目的のための簡単なFPSを持っています。私は顧客に弾丸の穴を見せたい。私はクライアントが銃を発射しようとするときにサーバー側のメソッドを呼び出すことでこれを達成しようとしています。サーバー側のメソッドはプレーヤーのカメラからレイキャストし、全員が見ることができるように弾丸の穴を生成する必要があります。

問題: プレーヤーをパラメータとしてサーバーメソッドに渡すことで、これを部分的に機能させることができます。しかし、プレーヤーのカメラに基づいてレイキャスティングを行う必要があるため、弾丸の穴が文字の高さで表示されます(カメラではなくプレーヤーを使用しているため)

カメラを通過できませんスルー。私もbullet spawnと呼ばれる空のゲームオブジェクトを作成しようとしましたが、それを通過させましたが、「オブジェクトのインスタンスに設定されていないオブジェクト参照」を取得していました。この同じエラーは、サーバーサイドのメソッドに渡そうとしているプレーヤのChild要素の表面に現れているようです。

私はこれを達成する正しい方法がわかりません。私のコードには奇妙な書式設定があります。私はここでそれを貼り付けることができず、スニペットを取っていたので、事前に謝ります。

私は重要なコードを掲載します:

void Update() 
     { 
       if (isLocalPlayer) 
       { 
     if (Input.GetButton("Fire1")) 
        { 
         CmdFire(BulletSpawn); 
        } 
     } 
[Command] 
    void CmdFire(GameObject Player) 
    { 
     Ray shooterRay = new Ray(Player.transform.position, Player.transform.forward); 
     if (Physics.Raycast(shooterRay, out Hit, 10000)) 
     { 
      Debug.Log("player hit"); 
      GameObject Bullet_Hole = (GameObject)Instantiate(BulletHole_Prefab, Hit.point, Quaternion.FromToRotation(Vector3.up, Hit.point)); 
      NetworkServer.Spawn(Bullet_Hole); 
     } 
    } 
+0

(Input.GetButton(「FIRE1」))場合は、このセクションでは、実際...例示目的のために、このあるべきで {CmdFire(:ここで誰もが後でこの中に実行された場合にそれを固定されたコードでありますプレーヤー); } –

+0

おそらく、あなたは_gun_の位置を同期していますか?プレーヤーが使用している銃の先端から光線を送る方が簡単です。サーバーにはプレーヤーのカメラを表すインスタンスが存在しないため、サーバー上の「カメラ」で何かを行うと、どこにでもいられません。カメラのビューベクトルを別の方法でサーバーに渡す必要があります。 –

+0

今のところ、私はちょうどプレーヤーの回転と位置を同期しています。銃はプレイヤーの子オブジェクトなので、その動きも同じです。もちろん、あなたが見上げたり、見下ろしたりすると、それは現時点では同期されていません。銃の先端から光線を投射する際の問題は、銃が完全に真っ直ぐでなければ、あなたのショットが画面の中央に表示されないことです。私はカメラから銃弾が中央を下っていくようにキャスティングしています。典型的には、銃がゲームで開催されているように見えるようにするために、それはショットを感じる中心のスクリーンの角度とわずかに右にあります。 –

答えて

0

はそれについてこのように考えてみてください。あなたの武器を発射する必要があるのは何ですか?発射点と発射方向が必要です(単純な場合)。だからその情報だけを伝えよう。あなたのCmdFireは、void CmdFire(Vector3 firingPoint、Vector3 firingDirection)のようになります。ゲームオブジェクトを渡すと、シリアル化されてサーバーに送られ、不必要なネットワークトラフィックが多く発生することに注意してください。値の型とコマンドの単純なオブジェクトに固執する。

これが最終的に解決に至りました。アドバイスありがとう。レイキャストの位置と方向を表す2つのVector3パラメータを渡しました。私はクライアントとサーバーの両方から撃つことができ、両方で弾丸の穴を見ることができます。

void Update() 
    { 
     if (isLocalPlayer) 
     { 
      if (Input.GetButton("Fire1")) 
      { 
       Vector3 FiringSpot = new Vector3(PlayerCam.transform.position.x, PlayerCam.transform.position.y, PlayerCam.transform.position.z); 
       Vector3 FireDirection = PlayerCam.transform.forward; 
       CmdFire(FiringSpot, FireDirection); 
      } 

    [Command] 
    void CmdFire(Vector3 firingPoint, Vector3 FiringDirection) 
    { 
     Ray shooterRay = new Ray(firingPoint, FiringDirection); 
     if (Physics.Raycast(shooterRay, out Hit, 10000)) 
     { 
      GameObject Bullet_Hole = (GameObject)Instantiate(bullet_Hole_Prefab, Hit.point, Quaternion.FromToRotation(Vector3.up, Hit.point)); 
      NetworkServer.Spawn(Bullet_Hole); 
      Destroy(Bullet_Hole, 10); 
     } 
    } 
+0

これを使用したいと思う人のためのFYI ...更新されたメソッドには閉じ括弧がありません。これは単なるコピー/ペーストエラーです。 –

関連する問題