想要向鼠标点击方向发射子弹,我们需要确定两个值:子弹的发射方向和子弹自身的角度。
发射方向:我们先通过Input.mousePosition方法获得鼠标点击的位置,再通过Camera.main.ScreenToWorldPoint方法将其转换为世界坐标。再将转换得到的结果和人物本身的世界坐标相减,得到的向量的方向向量便是子弹的发射方向。
子弹自身的角度:我们将发射方向得到的结果使用Vector.Angle方法的到该方向向量和Vector2.up的夹角(Vector2.up是竖直向上的单位向量)。
代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class player1 : MonoBehaviour {
private float m_nextFire;
/// <summary>
/// 开火速率
/// </summary>
public float FireRate = 2.0f;
/// <summary>
/// 子弹对象
/// </summary>
public GameObject Bullet;
/// <summary>
/// 子弹速度
/// </summary>
public float BulletSpeed;
void FixedUpdate()
{
m_nextFire = m_nextFire + Time.fixedDeltaTime;
if(Input.GetMouseButton(0) && m_nextFire>FireRate)
{
// 获取鼠标坐标并转换成世界坐标
Vector3 m_mousePosition = Input.mousePosition;
m_mousePosition = Camera.main.ScreenToWorldPoint(m_mousePosition);
// 因为是2D,用不到z轴。使将z轴的值为0,这样鼠标的坐标就在(x,y)平面上了
m_mousePosition.z = 0;
// 子弹角度
float m_fireAngle = Vector2.Angle(m_mousePosition - this.transform.position, Vector2.up);
if(m_mousePosition.x>this.transform.position.x)
{
m_fireAngle = -m_fireAngle;
}
// 计时器归零
m_nextFire = 0;
// 生成子弹
GameObject m_bullet = Instantiate(Bullet, transform.position, Quaternion.identity) as GameObject;
// 速度
m_bullet.GetComponent<Rigidbody2D>().velocity = ((m_mousePosition-transform.position).normalized * BulletSpeed);
// 角度
m_bullet.transform.eulerAngles = new Vector3(0, 0, m_fireAngle);
}
}
}