在自上而下的射击游戏 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 * x
、y * y
、z * z
;
目前我从玩家位置进行子弹射击。问题是它从玩家的中心而不是枪射击。我改变了子弹的位置,让它从枪口射出。但问题是,当我开始旋转播放器时,子弹会复制旋转而不是枪的位置。它只是停留在同一个地方。这是我的代码:
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 * x
、y * y
、z * z
;