2017-05-30 38 views
1

即時通訊工作在一個小的3D遊戲的2個球員在統一。遊戲理念是太空競賽,你必須通過戒指飛行。作爲一個額外的功能,我想給玩家推動其他玩家的能力。所以當他們擊中一個特定的按鈕時,他們的飛船應該發出一個撞擊另一個球員的「衝擊波」並將他推回一點。我想用Physics.OverlapSphere和AddExplosionForce函數來實現這一點。 我在沒有網絡功能的本地額外場景中測試了它,它工作得很好。Unity AddExplosionForce通過網絡管理器同步

由於我想將該功能導入到真實遊戲中,我遇到了這樣的問題,效果只是擊中了本地玩家,而不是另一個。另一個只是落後,並沒有改變自己的位置(在另一個遊戲中也沒有改變,就像客戶沒有得到改變)。

我不得不說,我已經在使用網絡管理器,正常運動和「wasd」正在爲兩位球員工作。

繼我使用(這只是標準的例子)代碼:

Vector3 explosionPos = transform.position; 
Collider[] colliders = Physics.OverlapSphere(explosionPos, radius); 
foreach (Collider hit in colliders) 
{ 
    Rigidbody rb = hit.GetComponent<Rigidbody>(); 

    if (rb != null) 
    rb.AddExplosionForce(power, explosionPos, radius, 3.0F); 
} 

是否有人知道,如果有什麼我要補充的網絡的事情嗎?

+0

我有一種感覺,你想達到的效果將是非常困難的沒有serever權威計算物理。由於網絡延遲,玩家1(激活該能力)將看到玩家2處於與玩家2看到自己處於不同的位置。因此,將該爆炸傳遞給玩家2將導致施加不同的力量和遊戲desyncs,你會得到橡皮筋。哪個客戶是正確的?玩家2的客戶是否總是爲玩家2的位置正確?玩家1是否因爲他們使用了這個能力? – Draco18s

回答

1

嘗試創建一個將使用您提供的代碼運行[ClientRpc]函數的[Command]函數。它應該是這個樣子:

[Command] 
void CmdOnExplosion(float power, Vector3 explosionPos, float radius, float upwardsMod) 
{ 
    RpcExplode(power, explosionPos, radius, upwardsMod); 
} 

[ClientRpc] 
void RpcExplode(float power, Vector3 explosionPos, float radius, float upwardsMod) 
{ 
    Collider[] colliders = Physics.OverlapSphere(explosionPos, radius); 

    foreach (Collider hit in colliders) 
    { 
     Rigidbody rb = hit.GetComponent<Rigidbody>(); 

     if (rb != null) 
     { 
      rb.AddExplosionForce(power, explosionPos, radius, 3.0F); 
     } 
    } 
}