public Transform target;
//发射速度
public float speed = 30f;
//最小接近距离
private float min_distance = 0f;
//是否需要追踪
private bool IsTrace = false;
//炮弹与目标点距离
private float distanceToTarget;
//是否移动
private bool move_flag = true;
//目标点坐标
private Vector3 TargetPosition = Vector3.zero;
//击中目标点时与目标点的角度
public float HitAngle = 90f;
//击中特效
private GameObject HitEffect;
private void Awake()
{
// HitEffect = Resources.Load("Prefabs/ShellHitEffect/FX_ZiMuDan_ChildHit") as GameObject;
}
/// <summary>
/// 参数: 攻击目标点、发射速度、最小停止运动距离
/// </summary>
public void SetShellData(Transform target, float speed, float distance, float hitAngle, bool isTrace)
{
this.target = target;
TargetPosition = this.target.position;
this.speed = speed;
min_distance = distance;
HitAngle = hitAngle;
IsTrace = isTrace;
distanceToTarget = Vector3.Distance(transform.position, this.target.position);
}
/// <summary>
/// 发射炮弹
/// </summary>
public void Shoot()
{
StartCoroutine(Parabola2());
}
/// <summary>
/// 炮弹主要实现
/// </summary>
/// <returns></returns>
IEnumerator Parabola2()
{
while (move_flag)
{
if (IsTrace)
{
TargetPosition = target.position;
}
transform.LookAt(TargetPosition);
float angle = Mathf.Min(1, Vector3.Distance(transform.position, TargetPosition) / distanceToTarget) * HitAngle;
transform.rotation = transform.rotation * Quaternion.Euler(Mathf.Clamp(-angle, -42, 42), 0, 0);
float currentDist = Vector3.Distance(transform.position, TargetPosition);
if (currentDist < min_distance)
{
move_flag = false;
}
transform.Translate(Vector3.forward * Mathf.Min(speed * Time.deltaTime, currentDist));
yield return null;
}
if (move_flag == false)
{
transform.position = TargetPosition;
StopCoroutine(Parabola2());
//GameObject vfx = Instantiate(HitEffect);
//vfx.transform.position = transform.position;
//Destroy(gameObject);
}
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
SetShellData(target, speed, min_distance, HitAngle, true);
Shoot();
}
}