私は何日間もこの問題に頭を悩まされています。ユニティマルチプレイヤー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);
}
}
(Input.GetButton(「FIRE1」))場合は、このセクションでは、実際...例示目的のために、このあるべきで {CmdFire(:ここで誰もが後でこの中に実行された場合にそれを固定されたコードでありますプレーヤー); } –
おそらく、あなたは_gun_の位置を同期していますか?プレーヤーが使用している銃の先端から光線を送る方が簡単です。サーバーにはプレーヤーのカメラを表すインスタンスが存在しないため、サーバー上の「カメラ」で何かを行うと、どこにでもいられません。カメラのビューベクトルを別の方法でサーバーに渡す必要があります。 –
今のところ、私はちょうどプレーヤーの回転と位置を同期しています。銃はプレイヤーの子オブジェクトなので、その動きも同じです。もちろん、あなたが見上げたり、見下ろしたりすると、それは現時点では同期されていません。銃の先端から光線を投射する際の問題は、銃が完全に真っ直ぐでなければ、あなたのショットが画面の中央に表示されないことです。私はカメラから銃弾が中央を下っていくようにキャスティングしています。典型的には、銃がゲームで開催されているように見えるようにするために、それはショットを感じる中心のスクリーンの角度とわずかに右にあります。 –