在TPS第三人称射击游戏中,我们希望子弹从场景中的角色的枪口进行发射,而不是从摄像机或者玩家身体中,这样在视觉效果上,可以看到玩家的枪支开火
2019-04-29_140311.png
2019-04-29_140438.png
相比于第一人称,第三人称就会面临一个问题,子弹的飞行方向.子弹在场景中从枪口位置进行初设,但是我们希望子弹可以射击到我们在屏幕中的准星位置.
UIcameraAndPlayer.png
在场景中的准星实际是在UI上的图片不能作为我们实际子弹目标方向.因此我们需要使用不同坐标空间的位置转换. 1.首先从UICamera的坐标空间中,获取到准星在UICamera坐标空间中的屏幕坐标,由于UICamera和主Camera的屏幕坐标是一样的 2.我们将准星的屏幕坐标使用Camera.main.ScreenPointToRay这个方法获取一条从主摄像机发出到摄像机近裁剪面上的坐标位置的一条射线,这个射线就是实际我们在游戏中从摄像机到屏幕瞄准的位置的一条射线 3.这样我们就可以得到子弹的射击方向 即为摄像机位置 + 射线方向 * 1000f - 开火位置,我们将此方向进行标准化,就可以作为子弹的出射方向了.
if (controller.tag == "Player")
{
//玩家发射子弹
bulletRotation = Quaternion.LookRotation(controller.transform.forward);
//获得准星的屏幕坐标
Vector3 targetPixScreenPoint = uICamera.WorldToScreenPoint(targetPix.position);
Ray ray = Camera.main.ScreenPointToRay(targetPixScreenPoint);
Debug.DrawRay(transform.position, Camera.main.transform.position + ray.direction * 1000f - transform.position, Color.red);
//我们只需要方向 所以讲得到的方向进行标准化
bulletDirection = Vector3.Normalize(Camera.main.transform.position + ray.direction * 1000f - transform.position);
}
Ray.png