TurnBasedStrategyCourse/Assets/Scripts/GrenadeProjectile.cs

59 lines
2.3 KiB
C#

using System;
using Grid;
using UnityEngine;
using UnityEngine.Serialization;
public class GrenadeProjectile : MonoBehaviour {
private const float moveSpeed = 15f;
private const float reachedTargetDistance = 2f;
private const float damageRadius = 4f;
private const float damage = 200f;
[SerializeField] private Transform grenadeExplodeVfxPrefab;
[SerializeField] private TrailRenderer trailRenderer;
[FormerlySerializedAs("ArcYAnimationCurve")] [SerializeField]
private AnimationCurve arcYAnimationCurve;
private Action onGrenadeBehaviourComplete;
private Vector3 positionXZ;
private Vector3 targetPosition;
private float totalDistance;
private void Update() {
Vector3 moveDir = (targetPosition - transform.position).normalized;
positionXZ += moveSpeed * Time.deltaTime * moveDir;
float distance = Vector3.Distance(positionXZ, targetPosition);
float distanceNormalized = 1 - distance / totalDistance;
float maxHeight = totalDistance / 4f;
float positionY = arcYAnimationCurve.Evaluate(distanceNormalized) * maxHeight;
transform.position = new(positionXZ.x, positionY, positionXZ.z);
if (!(Vector3.Distance(positionXZ, targetPosition) < reachedTargetDistance * maxHeight)) return;
Collider[] hitColliderArray = Physics.OverlapSphere(targetPosition, damageRadius);
foreach (Collider hitCollider in hitColliderArray) {
if (hitCollider.TryGetComponent(out Unit targetUnit)) targetUnit.Damage(30);
if (hitCollider.TryGetComponent(out IDestructable destructable)) destructable.Damage(damage);
}
OnAnyGrenadeExploded?.Invoke(this, EventArgs.Empty);
trailRenderer.transform.parent = null;
Instantiate(grenadeExplodeVfxPrefab, targetPosition + Vector3.up * 1f, Quaternion.identity);
Destroy(gameObject);
onGrenadeBehaviourComplete();
}
public static event EventHandler OnAnyGrenadeExploded;
public void Setup(GridPosition targetGridPosition, Action newGrenadeBehaviourComplete) {
onGrenadeBehaviourComplete = newGrenadeBehaviourComplete;
targetPosition = LevelGrid.Instance.GetWorldPosition(targetGridPosition);
positionXZ = transform.position;
positionXZ.y = 0;
totalDistance = Vector3.Distance(positionXZ, targetPosition);
}
}