1

設定: 初めてマルチプレイヤー ゲームを作成したところ、奇妙な問題が発生しました。プレイヤーが弾丸を撃って殺し合う戦車ゲームです

問題: クライアントが移動中に発砲すると、弾丸が少し遅れてスポーンするように見え、プレイヤーが弾丸と衝突します。

問題は、プレイヤー自体がローカルであり、弾丸がネットワーク上で生成されていることです (遅延の原因となっています)。

: ホスト プレーヤーにはこの問題はありません。したがって、これは何らかの形でネットワークに関連しています。

弾丸をクライアント プレーヤーと同期するにはどうすればよいですか?

private void Fire(){
    // Set the fired flag so only Fire is only called once.
    m_Fired = true;
    CmdCreateBullets ();
    // Change the clip to the firing clip and play it.
    m_ShootingAudio.clip = m_FireClip;
    m_ShootingAudio.Play ();
    // Reset the launch force.  This is a precaution in case of missing button events.
    m_CurrentLaunchForce = m_MinLaunchForce;
}

[Command]
private void CmdCreateBullets()
{

    GameObject shellInstance = (GameObject)
        Instantiate (m_Shell, m_FireTransform.position, m_FireTransform.rotation) ;
    // Set the shell's velocity to the launch force in the fire position's forward direction.
    shellInstance.GetComponent<Rigidbody>().velocity = m_CurrentLaunchForce * m_FireTransform.forward; 

    NetworkServer.Spawn (shellInstance);

}
4

2 に答える 2

3

あなたのゲーム ルールは、プレイヤーの戦車が自分自身を撃つことができるようにする必要がありますか?

そうでない場合、簡単な解決策は、発射体のコライダーがアクティブ化されているときに所有者のコライダーを無視することです。

    Transform bullet = Instantiate(bulletPrefab) as Transform;
    Physics.IgnoreCollision(bullet.GetComponent<Collider>(), GetComponent<Collider>());
于 2016-03-10T00:52:13.317 に答える
0

以下の方法で解決しました。誰かが私の答えを確認するために目を向けることができれば、それは素晴らしいことです.

private void Fire(){
    // Set the fired flag so only Fire is only called once.
    m_Fired = true;
    CmdCreateBullets ();
    // Change the clip to the firing clip and play it.
    m_ShootingAudio.clip = m_FireClip;
    m_ShootingAudio.Play ();
    // Reset the launch force.  This is a precaution in case of missing button events.
    m_CurrentLaunchForce = m_MinLaunchForce;
}

[Command]
private void CmdCreateBullets()
{
    RpclocalBullet ();
}

[ClientRpc]
private void RpclocalBullet(){
    GameObject shellInstance = (GameObject)
        Instantiate (m_Shell, m_FireTransform.position, m_FireTransform.rotation) ;
    // Set the shell's velocity to the launch force in the fire position's forward direction.
    shellInstance.GetComponent<Rigidbody>().velocity = 25f * m_FireTransform.forward; 
}
于 2016-03-10T01:49:13.697 に答える