2017-04-17 4 views
0

タンクを再現したい!ユニティチュートリアルシリーズのマルチプレイヤーゲーム。私はすでにネットワークシリーズを見てきました。しかし、私は射撃権を実装することに問題があります。タンクは弾薬の発射力を高めるために充電することができます。それはホストのために働いていますが、クライアントは発射に立ち往生します。Unity3Dネットワークシューティングループ(クライアント用)

コード:

[ClientCallback] 
private void Update() 
{ 
    if (!isLocalPlayer) 
     return; 

    if (m_CurrentLaunchForce >= MaxLaunchForce && !m_Fired) 
    { 
     m_CurrentLaunchForce = MaxLaunchForce; 
     Debug.Log("Max force achieved! Firing!"); 
     CmdFire(); 
    } 
    else if (Input.GetButtonDown("Fire1")) 
    { 
     m_Fired = false; 
     m_CurrentLaunchForce = MinLaunchForce; 
     Debug.Log("Start charging up!"); 
    } 
    else if (Input.GetButton("Fire1") && !m_Fired) 
    { 
     m_CurrentLaunchForce += m_ChargeSpeed * Time.deltaTime; 
     Debug.Log("Charging up!"); 
    } 
    else if (Input.GetButtonUp("Fire1") && !m_Fired) 
    { 
     Debug.Log("Firing with low force!"); 
     CmdFire(); 
    } 
} 


[Command] 
private void CmdFire() 
{ 
    m_Fired = true; 
    Rigidbody shellInstance = Instantiate(ShellPrefab, FireTransform.position, FireTransform.rotation); 
    shellInstance.velocity = m_CurrentLaunchForce * transform.forward; 
    m_CurrentLaunchForce = MinLaunchForce; 
    NetworkServer.Spawn(shellInstance.gameObject); 
    m_Fired = false; 
} 

場合ならば、ホストが秒で立ち往生されていないクライアント:

if (m_CurrentLaunchForce >= MaxLaunchForce && !m_Fired) 

私はデバッガで変数をチェックし、currentLaunchForceがresetted決してます〜minLaunchForce。

答えて

0

自分で解決策を見つけました。私は別の関数 "fire()"を実装しました。この関数はUpdate関数から最初に呼び出され、再び "cmdfire()"というコマンドを呼び出します。私は変数をリセットし、コマンドでは、パラメータとしての力を持つクライアントのために投射物を生成するようサーバーに指示します。

private void fire() 
{ 
    m_Fired = true; 
    CmdFire(m_CurrentLaunchForce); 
    m_CurrentLaunchForce = MinLaunchForce; 
    m_Fired = false; 
    startReloadTime(); 
} 


private void CmdFire(float launchForce) 
    { 
     Rigidbody bulletInstance = Instantiate(BulletPrefab, FireTransform.position, FireTransform.rotation); 
     bulletInstance.velocity = launchForce * transform.forward; 
     NetworkServer.Spawn(bulletInstance.gameObject); 
    } 

あなたがクライアント上で特定の条件をチェックするために特定の変数を使用している場合、あなたも私の場合のように、クライアント上で自分自身をそれらをリセットする必要がありますようだ:

private float m_CurrentLaunchForce;            
private bool m_Fired; 

そしてちょうど伝えますあなたがあなたの不正行為をどのように懸念しているかに応じて、それらを検証するための関数パラメータとして、force、position、rotationのようなオプションを使ってオブジェクトを生成するサーバー。