簡體   English   中英

Unity3D。 如何在多人射擊游戲中正確處理彈丸?

[英]Unity3D. How to properly handle projectile in a multiplayer shooter?

因此,我嘗試將具有速度和重力的物理彈丸/子彈添加到一個簡單的第一人稱射擊游戲中,而不是僅進行射線投射,如果客戶碰到東西,則使用Command。 經過一番嘗試和錯誤之后,我發現將彈丸與對撞機配合使用並不是最佳的處理方法,因為對於快速移動的物體,其物理計算速度不夠快。 所以我瘋了自己的子彈物理學,如下所示。

 private float startingVelocity = 50f;
 private float gravity = 9.81f;

 private Vector3 forwardDirection;

 private Vector3 previousPosition;
 private Vector3 nextPosition;

 private Vector3 movementDirection;

 private Vector3 velocity;

 void Start ()
 {
   previousPosition = transform.position;
   forwardDirection = transform.forward.normalized;
   velocity = forwardDirection*startingVelocity;
 }
 void Update ()
 {
   previousPosition = transform.position;
   velocity += new Vector3(0f, -1f, 0f)*gravity*Time.deltaTime;

   nextPosition = previousPosition + velocity*Time.deltaTime;

   transform.position = nextPosition;

   Debug.DrawLine(previousPosition, nextPosition, Color.white, 10f);

   movementDirection = nextPosition - previousPosition;
   if (movementDirection!=Vector3.zero) 
   { 
     transform.rotation = Quaternion.LookRotation(movementDirection); 
   }

   CheckImpact(previousPosition, nextPosition);
 }

CheckImpact函數實際上只是在兩個位置之間進行射線廣播,以檢查彈丸撞擊的方式是否存在牆壁或玩家。 當擊中某物時,將調用命令,服務器會對目標造成傷害。

子彈本身是這樣生成的:

[Command]
void CmdShootProjectile(string projectilePath, Vector3 _position, Quaternion _rotation)
{
    GameObject projectile = Instantiate(Resources.Load<GameObject>(projectilePath), _position, _rotation);
    NetworkServer.Spawn(projectile);

客戶端射擊,命令在服務器上生成項目符號,然后為每個客戶端生成項目符號,以便可以看到它。 我在使用此方法時遇到的問題是,服務器會計算子彈是否被擊中,而這並不總是與播放器的外觀保持一致。

我如何有效,可靠地處理彈丸? 我能以某種方式讓實際射擊的客戶計算子彈並檢查它是否命中,而其他客戶仍然能夠看到子彈嗎?

提前致謝。

不幸的是,幾乎不可能有100%安全可靠的方法來做到這一點。 但是,對此有相當多的研究(例如Valve公司(《反恐精英》)等游戲公司)。

當前的共識是確實在服務器端而不是在客戶端進行計算。 有利弊。

優點:

  • 更安全地防止作弊:如果客戶做出“受到我的子彈擊中”的決定,則摻假的客戶(或類似人)很容易偽造打擊。
  • 在考慮具有不同延遲的玩家時更公平:如果玩家具有較高的延遲(50ms +),則可以很容易地向敵人射擊並記錄命中率。

缺點:

  • 有時,點擊次數不匹配。 如果在電子競技領域辯論多年,尤其是在《反恐精英》中,玩家會抱怨他們的歌曲沒有被“點擊”,這就是一個話題。 這就是生活。
  • 根據邏輯的不同,服務器可能會變得很沉重,這可能會變得昂貴。

就個人而言,我喜歡您的方法,現在應該還可以。 隨着游戲的進展,以及對更好的系統的需求,您可以對其進行更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM