82 lines
2.1 KiB
C#
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);
|
|
}
|
|
} |