82 lines
2.1 KiB
C#

using UnityEngine;
public class Missile : AbstractProjectile
{
[Header("Water Defense")]
[SerializeField] private bool checkWaterCollision = true;
[SerializeField] private float WaterYPosition = 17f;
private float currentSpeed;
private float acceleration;
private Vector3 intermediatePoint;
private Transform target;
private MissileState state;
private bool isLaunched = false;
private enum MissileState
{
Rise,
Pursue
}
public void Setup(GameObject owner, Transform target, Vector3 intermediatePoint, float damage, float riseSpeed, float acceleration)
{
base.Launch(owner, damage);
this.target = target;
this.intermediatePoint = intermediatePoint;
this.acceleration = acceleration;
currentSpeed = riseSpeed;
state = MissileState.Rise;
isLaunched = true;
}
private void FixedUpdate()
{
if (!isLaunched) return;
if (checkWaterCollision && IsInWater())
{
DestroyProjectile();
return;
}
switch (state)
{
case MissileState.Rise:
RisePhase();
break;
case MissileState.Pursue:
PursuePhase();
break;
}
rb.linearVelocity = transform.forward * currentSpeed;
}
private bool IsInWater() => transform.position.y < WaterYPosition;
private void RisePhase()
{
Vector3 directionToIntermediate = (intermediatePoint - transform.position).normalized;
transform.rotation = Quaternion.LookRotation(directionToIntermediate);
if (Vector3.Distance(transform.position, intermediatePoint) < 1f)
SwitchToPursuePhase();
}
private void SwitchToPursuePhase()
{
state = MissileState.Pursue;
currentSpeed = 0;
}
private void PursuePhase()
{
Vector3 directionToTarget = (target.position - transform.position).normalized;
currentSpeed += acceleration * Time.deltaTime;
transform.rotation = Quaternion.LookRotation(directionToTarget);
}
}