Unity3D。如何在多人射击游戏中正确处理射弹?

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

因此,我尝试将具有速度和重力的物理 projectiles/bullets 添加到简单的第一人称射击游戏中,而不仅仅是光线投射,并在客户端击中某些东西时使用命令。经过一些试验和错误后,我发现使用带有对撞机的射弹并不是最好的做事方式,因为物理计算速度不够快,无法处理快速移动的物体。所以我疯狂了自己的子弹物理学,如下所示。

 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 - 反恐精英 - 和其他公司)。

目前的共识是确实在服务器端进行计算,而不是在客户端进行计算。有利有弊。

优点:

  • 更安全地防止作弊:如果客户做出决定 "has my bullet hit",掺假的客户(或类似客户)很容易伪造成功。
  • 考虑具有不同延迟的玩家时更公平:如果玩家具有高延迟(50 毫秒以上),则可以很容易地射击敌人并记录命中。

缺点:

  • 有时,点击不匹配。这一直是电子竞技中争论多年的话题,特别是反恐精英,玩家抱怨他们的命中没有 "hit"。生活就是这样。
  • 根据逻辑,服务器可能会变得相当沉重,这可能会变得昂贵。

就我个人而言,我喜欢您的方法,目前应该没问题。随着游戏的进行,需要更好的系统,您可以对其进行更改。