Unity2D子弹朝向鼠标位置发射

废话不多说,先说明一下我使用的变量

float attack_time 用于表示每次攻击的间隙时间

float current_time 攻击时间的冷却

Rigidbody2D body 2D刚体组件

Object bomb 需要发射的物体对象

创建一枚子弹,unity的Instantiate()函数就可以实现,这里需要的三个参数是物体对象(Object),生成位置(Vector3)和旋转方向(四元数Quaternion),第一个参数就是bomb,我们需要发射的子弹类。

想要子弹沿着鼠标方向运动,还需要另外两个参数,一个是子弹生成时的初始位置,也就是玩家的位置,如果发射这个子弹的脚本是挂载在玩家上的,就用transform.position即脚本挂载的物体对象的位置。

获取鼠标位置用Input.mousePosition,然而这个返回的是鼠标在屏幕上的位置,不是我们游戏场景中的位置,需要用到Camera.main.ScreenToWorldPoint(Input.mousePosition),即返回鼠标屏幕位置对应的游戏世界坐标位置。

代码如下图:

我将其整理成了一个静态方法便于在2d场景其它也需要鼠标在游戏场景中位置是,能够方便获取。

求解2D场景中两个物体间的角度,我们需要先获得者两个物体间的向量。

由于transform.position是三维,而我需要的向量是一个二维,因此需要body.position获取物体在2D场景中的位置,当然用transform.position.x和transform.position.y来new一个Vector2类型也是可以的。不过由于我在这个脚本实现玩家移动的时候使用了刚体组件实现移动方式,所以就用的是body.position......

通过将目标点的位置减去自身的位置就得到了一个二维向量Vector2 direction,unity中有很多计算夹角的方法,这里我使用的是Vector3.SignedAngle(),该方法需要三个参数,Vector3.up, direction, Vector3.forward,Vector3.up和Vector3.forward的作用相当于建立一个x-y轴坐标系,以direction做从原点开始的向量,计算出夹角float angle。

要通过夹角设置子弹的旋转,我们不能直接修改transform.rotation,这是个四元数不是直观意义上的旋转,需要用到四元数Quaternion,该类提供了一个静态方法,Euler计算欧拉角,通过给的x,y,z计算出一个四元数,也就是我们想要的物体朝向的方向,其中在二维方向上的选择是z来控制的,因此只需要把angle放到z轴,x,y默认0。

代码实现图如下,这段代码放在Update()内实现。

由于我使用的控制子弹移动的脚本是使用了translate控制x轴移动,使得子弹会以y轴指向鼠标位置,因此我在角度设置里angle加了90度旋转.(虽然我在注释里说了)

Input.GetMouseButton(0)是如果鼠标按下了左键,就返回true,也就是设置左键攻击。

如果你忽略了attack_time的话,就会发现你点一下鼠标就会突然创建一大堆子弹,这是因为Update()是每帧执行,你一次按下鼠表就是执行很多次,所以需要设置一个attack_time然后初始化设置它的数值也就是攻击时间。current_time作为攻击间隙,初始化数值等于attack_time,然后在每次对current_time是否大于等于attack_time,如果是那么按下鼠标后在执行发射制子弹同时将current_time置0,不是则每次执行进行current_time += Time.deltaTime

这是最终的实现效果

PS:本人还是在学习中萌新,所以可能方法上略有不足......实现这种效果也是有很多其它方法的,以上仅为我的个人理解。

  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值