论FPS游戏的准星工作原理及其Projectile发射位置的摆放

译者注

该文章出自stackexchange上的问答,答主比较详尽地解释了拟真、ESports竞技类、单机类射击游戏有关准星和Projectile发射位置的设计思路。由我给大家进行本地化翻译。

文中的超链接将会重定向到对应游戏的示意截图。

正文

设计师/程序员希望将十字准线绘制在屏幕的正中心或稍低一点的位置有很多原因。甚至可以实现混合系统,在包含不同武器、车辆、交互点等的游戏中利用这两个系统的特性。

将十字线绘制居中或降低可能取决于一些设计选择:

  • 居中十字准线:典型风格,几乎所有老式 FPS 游戏和大多数现代游戏都有居中十字准线。这样视觉范围在水平和垂直方向上都是平衡的。这样,当射击时,我们知道子弹正在移动到我们所看到的位置,因为它的起始位置与相机(3D 世界中我们的“眼睛”)相同。这是一个典型的选择,因为一般用户在与计算机交互时很自然地将注意力集中在屏幕的中心,视频游戏玩家也不例外。此外,如果您的游戏在屏幕的不同侧面或角落都有 HUD 元素,则拥有居中的十字准线将使玩家能够控制它们,而无需额外花费眼睛精力。
  • 降低十字准线:将十字准线绘制到屏幕中心稍下方需要程序员注意发射的子弹不再相对于相机方向直线向前移动,而是它们的轨迹向下倾斜一定角度。十字准线位于屏幕中心下方,这意味着玩家必须向上看一点才能仍然瞄准前方。此外,视觉范围也会发生变化,因为地平线以上的东西实际上比地平线以下的东西优先,比如武器、物体,甚至你自己的腿。在用户界面方面,如果您将游戏设计为仅在底部具有 HUD 元素,那么它们将更易于阅读,而不会失去对十字准线的关注。
  • 混合十字准线:一些武器将具有居中的十字准线,其他武器将具有较低的十字准线。一个例子是用步枪瞄准与用机枪瞄准。

在光环系列中,光环 PC/CE始终具有居中的十字准线,而其他游戏的武器十字准线较低,在与车辆安装的炮塔交互时,它会平滑地移动到屏幕中心。你可以在其他游戏中看到类似的差异,例如《毁灭战士 3》 《军团要塞 2》 《孤岛危机 3》 、《战地》系列、《使命召唤》系列等。

这里, (1)中有经典的居中十字准线:当向前看时,玩家的俯仰角(无论他向上/向下看)等于 0度,正如人们所期望的那样。然后,在(2)中我们有一个降低的十字准线。现在,如果玩家想要再次瞄准他的前方,他必须稍微向上看,如图(3)所示

但这个十字准线的东西之所以存在还有另一个更重要的原因,它与您链接的问题有关。有人可能会问:

如何将子弹从相机中射出,同时视觉上假装它们来自枪管?

玩家向他所看到的东西射击。这就是为什么大多数武器在摄像机位置而不是枪尖产生子弹的原因。然而,我们必须假装子弹仍在从武器中发射。

我们可以通过使用降低的十字准线并结合良好的角色动画来实现这一点。通用 FPS Biped 由角色和武器组成。看下图(士官长又来帮忙了~):

红色是相机,蓝色是武器。在图(1)中,我们有一个居中的十字准线和一支水平的步枪,因此我们应该调整武器和手臂的方向以反映子弹发射的方向。或者,我们可以将武器移近头部,模拟瞄准动作,以减少子弹起始位置与枪管之间的距离。

另一方面,在图(2)中,摄像机的十字准线较低。由此产生的效果是,发射的子弹会移动到离枪管如此之近,以至于它们看起来像是从那里发出的!我们可以做得更好:仅在子弹移过枪管后才绘制子弹,因为从枪中喷出的火焰将完成整个效果。执行此操作时,最好根据相机当前观察的方向对手臂和头部进行动画处理。此外,减少模型上子弹方向和武器方向之间的角度差,将为您提供更好的结果,因为子弹实际上是沿直线轨迹移动的。相机(模型头部)距离所持武器越近,最终结果就越好

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是在Unity Pico中从手柄发射一个抛物线跟随手柄移动的代码: 首先,在场景中创建一个空对象,例如“Projectile”,然后将其放置在场景中手柄的位置。然后将以下脚本添加到“Projectile”对象上: ```csharp using UnityEngine; using System.Collections; public class ProjectileController : MonoBehaviour { public float speed = 10.0f; public float gravity = 9.8f; public Transform hand; // 手柄的Transform组件 private Vector3 direction; // 发射方向 private float angle; // 发射角度 private float time; // 运动时间 private Vector3 startPoint; // 发射起点 void Start () { startPoint = transform.position; } void Update () { // 计算发射方向 direction = (hand.position - startPoint).normalized; // 计算发射角度 angle = Mathf.Atan2(direction.y, direction.x); // 计算运动时间 time += Time.deltaTime; // 计算抛物线轨迹 float x = startPoint.x + speed * Mathf.Cos(angle) * time; float y = startPoint.y + speed * Mathf.Sin(angle) * time - 0.5f * gravity * time * time; float z = startPoint.z + speed * Mathf.Cos(angle) * time; // 更新位置 transform.position = new Vector3(x, y, z); } } ``` 在脚本中,我们首先定义了速度和重力变量,以及手柄的Transform组件和发射方向、角度、时间和起点等变量。在Start()方法中,我们将发射起点设置为“Projectile”对象的初始位置。在Update()方法中,我们计算发射方向、角度、时间和抛物线轨迹,并根据计算结果更新“Projectile”对象的位置,使其跟随手柄移动并发射出抛物线。 最后,在Unity Pico中将该脚本添加到“Projectile”对象上,并将手柄的Transform组件赋值给该脚本中的“hand”变量即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值