Unity3D射击游戏的准心



      射击游戏中,很难预计子弹打到哪里,毕竟肉眼估算枪管的角度不容易,所以很难打着。因此需要制作一套准心,让它来捕捉敌方的位置。此处射击游戏以坦克开炮为例,那么射击所用的便不是枪管,而是炮管了,射出来的不是子弹,而是炮弹了。坦克开炮所制作的准心中心准心坦克准心两部分组成。

中心准心

       中心准心指向屏幕中央。中心准心的坐标是固定的,假设屏幕宽度为Screen.width、屏幕高度为Screen.Height、准心宽度为centerSight.width,准心高度为centerSight.height,那么中心的坐标为(Screen.width/2 - centerSight.width/2,Screen.height/2 - centerSight.height/2)。如下图:
在这里插入图片描述

实际射击位置

       实际射击位置指炮弹爆炸的位置。获取实际射击位置的方法如下:过炮管中心点,,以炮管方向作一条足够长的射线来模拟炮弹的飞行路线,检测射线与场景中游戏物体的碰撞点,该碰撞点为实际爆炸的位置,如下图所示:
在这里插入图片描述

目标射击位置

       目标射击位置指中心准心所对应的三维坐标,如下图。获取该值的方法如下:过屏幕中心做一条沿着相机方向的射线,检测射线与场景中游戏物体的碰撞点。该碰撞点即为目标射击位置。随着炮塔和炮管的旋转,实际射击位置会慢慢向目标射击位置靠近,直到两者重合。Unity3D中Camera.ScreenPointToRay方法能够将屏幕位置转成一条射线,后续将用该方法生成射线并检测碰撞点。
在这里插入图片描述

坦克准心

       坦克准心指向“实际射击位置”转换成的屏幕坐标,如下图。Unity3D的Camera.main.WorldToScreenPoint方法提供了三维坐标到屏幕坐标的转换,后续将使用该方法计算坦克准心的坐标。
在这里插入图片描述

       了解上述概念后,可以从3方面逐步完成准心功能:

  1. 计算“目标射击位置”。然后根据“目标射击位置”,计算炮管和炮塔的目标角度,旋转炮管和炮塔。
  2. 计算“实际射击位置”,然后根据“实际射击位置”计算“坦克准心”的坐标。
  3. 在OnGUI方法中绘制准心。
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的Unity3D射击游戏教程,包括玩家射击和敌人受伤的效果: 1.创建一个空场景,并添加一个玩家角色和一个敌人角色。 2.为玩家角色添加一个摄像机,并将其设置为第一人称视角。 3.为玩家角色添加一个武器模型,并将其设置为玩家手中的位置。 4.为武器模型添加一个枪口位置,并将其设置为武器的前端。 5.为玩家角色添加一个脚本,以便在按下射击按钮时发射子弹。 ```csharp public class PlayerController : MonoBehaviour { public Transform shooterPoint; public GameObject bulletPrefab; public float bulletSpeed = 100f; void Update() { if (Input.GetButtonDown("Fire1")) { Shoot(); } } void Shoot() { GameObject bullet = Instantiate(bulletPrefab, shooterPoint.position, shooterPoint.rotation); Rigidbody rb = bullet.GetComponent<Rigidbody>(); rb.velocity = shooterPoint.forward * bulletSpeed; } } ``` 6.为敌人角色添加一个脚本,以便在被子弹击中时受伤。 ```csharp public class EnemyController : MonoBehaviour { public int health = 100; void OnCollisionEnter(Collision collision) { if (collision.gameObject.tag == "Bullet") { health -= 10; if (health <= 0) { Die(); } } } void Die() { Destroy(gameObject); } } ``` 7.为子弹添加一个脚本,以便在击中敌人时产生弹孔特效。 ```csharp public class BulletController : MonoBehaviour { public GameObject bulletHole; public float lifeTime = 5f; void Start() { Destroy(gameObject, lifeTime); } void OnCollisionEnter(Collision collision) { if (collision.gameObject.tag == "Enemy") { collision.gameObject.GetComponent<EnemyController>().health -= 10; } Instantiate(bulletHole, collision.contacts[0].point, Quaternion.FromToRotation(Vector3.up, collision.contacts[0].normal)); Destroy(gameObject); } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值