在自上而下的射击游戏 Unity3D 中用枪射击

Shoot from gun in top down shooter Unity3D

目前我从玩家位置进行子弹射击。问题是它从玩家的中心而不是枪射击。我改变了子弹的位置,让它从枪口射出。但问题是,当我开始旋转播放器时,子弹会复制旋转而不是枪的位置。它只是停留在同一个地方。这是我的代码:

public Transform firePoint;
public GameObject bulletPrefab;
public float bulletForce = 20f;

public void Shoot()
{
    Vector3 newPosition = new Vector3(firePoint.position.x + 1, firePoint.position.y - 0.1f, firePoint.position.z);
    GameObject bullet = Instantiate(bulletPrefab, newPosition, firePoint.rotation);
    Rigidbody2D rb = bullet.GetComponent<Rigidbody2D>();
    rb.AddForce(firePoint.right * bulletForce, ForceMode2D.Impulse);
    yield return new WaitForSeconds(0.5f);
}

您的问题是您有 hard-coded 偏移量(x = 1,y = -0.1f)更改。当您将播放器旋转 90 度时,枪端的偏移量会有所不同。

有两种解决方法:

解决方案 #1

将你的火力点 Transform 放在枪的尖端,使其成为枪的 child。这样 Transform 将始终跟随枪尾。

现在,为了实例化,您可以使用 firepoint.position,无需任何修改。

这有一些缺点,主要是具有严格的 objects 层次结构,并且动态更改枪支变得更加困难,因为您必须为每个枪支找到并重新分配火力点。

解决方案 #2

Vector3 firePointOffset;.

实例化后,通过

计算火点的位置
var firePointPosition = playerTransform.position + Vector3.Scale(playerTransform.forward, firePointOffset)`;

transform.forward returns Vector3 指向特定转换的前向。 Vector3.Scale 允许将两个向量相乘 x * xy * yz * z