射击时的腰射计算,计算十字准线内的随机光线投射方向

问题描述 投票:0回答:1

我正在使用 Unity 开发一个 FPS 项目,我尝试寻找一种方法 使用随机矢量使枪在十字准线内射击,但我没有找到任何相关信息。

尝试生成随机向量以添加到光线投射时的问题是它与十字线的大小不匹配。

注意:如果我消除随机性,子弹将按预期击中十字准线的中心

特别是当静止不动时,子弹会飞到十字准线之外

30kb image showing the standing still hipfire shooting issue

移动子弹时与十字线一致

30kb image showing the walking hipfire shooting issue

运行子弹时与十字线不匹配

30kb image showing the running hipfire shooting issue

这是腰射散布计算的代码

        //I did set hipfireSpreadMultiplier to 0.05
        float hipfireSpread = 1 / GetGunHipfireAccuracy() * hipfireSpreadMultiplier;
        randomDirection = Vector2.right * hipfireSpread;

        Transform virtualCamera = PlayerController.SINGLETON.playerVirtualCamera;
        if (Physics.Raycast(virtualCamera.position, virtualCamera.forward + randomDirection.x * virtualCamera.
            right + randomDirection.y * virtualCamera.up, out RaycastHit raycastHit, 900, enemyLayerMask))
            Debug.Log("I did hit " + raycastHit.transform.name);

这是计算十字线尺寸的代码

        //I did set crosshairSizeMultiplier to 100
        float size = 1 / PlayerController.SINGLETON.GetGunManager().GetEquippedGunHipfireAccuracy();
        crosshair.sizeDelta = Vector2.one * size * crosshairSizeMultiplier;

我认为

crosshairSizeMultiplier
hipfireSpreadMultiplier
变量可能是导致不同步的原因,因为我确实输入了我认为没问题的值。 我真的不知道如何解决这个问题,因为互联网上没有信息。

我尝试了什么

  • 更改

    crosshairSizeMultiplier
    hipfireSpreadMultiplier
    的值以尝试找到正确的组合以使其匹配,但我没有成功。

  • 将十字线尺寸映射到动画曲线,它确实有点工作,但它根本不通用,而且非常耗时而且不精确。

  • 使用

    Camera.main.ScreenPointToRay
    的方法,还是没有匹配准星的大小。

unity-game-engine game-development
1个回答
0
投票

我可以想出两种方法来准确地做到这一点。

我想你可以根据视角来确定: 从中心到十字准线边缘的距离(以像素为单位)占屏幕宽度的百分比,乘以玩家视野,应该会给出扩展旋转(以度为单位)。 float pixelDelta = crosshairEdge.x - crosshairCenter.x; float spreadAngle = (pixelDelta/(float)Screen.width) * Camera.main.fieldOfView; 然后你必须做一些时髦的四元数数学,使用 Quaterion.AngleAxis 围绕任意 Random.InsideUnitSphere 角度以随机方向旋转 virtualCamera.forward 向量的角度。像这样的东西,虽然我还没有测试过:

Quaterion lookDir = Quaternion.Euler(virtualCamera.forward);
Quaternion randomDir = Quaterinion.Euler(Random.insideUnitSphere);
Vector3 shotDir = Quaternion.RotateTowards(lookDir, randomDir, spreadAngle).eulerAngles;

请注意,这也可以向后工作,您可以通过使用当前方法计算子弹偏离 LookDir 的最大视角来生成 UI 元素需要距中心的距离。

或者,您可以坚持相机优先的方法。
Camera.main.ScreenPointToRay 绝对适合此用例。确保您输入了正确的参数。如果这不起作用,您可以使用 Camera.main.ScreenToWorldPoint,尽管该实现对于此用例来说不太干净,因为您需要指定相机的一些任意 z 深度。

© www.soinside.com 2019 - 2024. All rights reserved.