You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
3.2 KiB
C#
103 lines
3.2 KiB
C#
3 weeks ago
|
using System;
|
||
|
using System.Collections.Generic;
|
||
|
using UnityEngine;
|
||
|
|
||
|
namespace Unity.BossRoom.Gameplay.GameplayObjects
|
||
|
{
|
||
|
/// <summary>
|
||
|
/// Logic that handles an FX-based pretend-missile.
|
||
|
/// </summary>
|
||
|
public class FXProjectile : MonoBehaviour
|
||
|
{
|
||
|
[SerializeField]
|
||
|
private List<GameObject> m_ProjectileGraphics;
|
||
|
|
||
|
[SerializeField]
|
||
|
private List<GameObject> m_TargetHitGraphics;
|
||
|
|
||
|
[SerializeField]
|
||
|
private List<GameObject> m_TargetMissedGraphics;
|
||
|
|
||
|
[SerializeField]
|
||
|
[Tooltip("If this projectile plays an impact particle, how long should we stay alive for it to keep playing?")]
|
||
|
private float m_PostImpactDurationSeconds = 1;
|
||
|
|
||
|
private Vector3 m_StartPoint;
|
||
|
private Transform m_TargetDestination; // null if we're a "miss" projectile (i.e. we hit nothing)
|
||
|
private Vector3 m_MissDestination; // only used if m_TargetDestination is null
|
||
|
private float m_FlightDuration;
|
||
|
private float m_Age;
|
||
|
private bool m_HasImpacted;
|
||
|
|
||
|
public void Initialize(Vector3 startPoint, Transform target, Vector3 missPos, float flightTime)
|
||
|
{
|
||
|
m_StartPoint = startPoint;
|
||
|
m_TargetDestination = target;
|
||
|
m_MissDestination = missPos;
|
||
|
m_FlightDuration = flightTime;
|
||
|
m_HasImpacted = false;
|
||
|
|
||
|
// the projectile graphics are actually already enabled in the prefab, but just in case, turn them on
|
||
|
foreach (var projectileGO in m_ProjectileGraphics)
|
||
|
{
|
||
|
projectileGO.SetActive(true);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void Cancel()
|
||
|
{
|
||
|
// we could play a "poof" particle... but for now we just instantly disappear
|
||
|
Destroy(gameObject);
|
||
|
}
|
||
|
|
||
|
private void Update()
|
||
|
{
|
||
|
m_Age += Time.deltaTime;
|
||
|
if (!m_HasImpacted)
|
||
|
{
|
||
|
if (m_Age >= m_FlightDuration)
|
||
|
{
|
||
|
Impact();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// we're flying through the air. Reposition ourselves to be closer to the destination
|
||
|
float progress = m_Age / m_FlightDuration;
|
||
|
transform.position = Vector3.Lerp(m_StartPoint, m_TargetDestination ? m_TargetDestination.position : m_MissDestination, progress);
|
||
|
}
|
||
|
}
|
||
|
else if (m_Age >= m_FlightDuration + m_PostImpactDurationSeconds)
|
||
|
{
|
||
|
Destroy(gameObject);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
private void Impact()
|
||
|
{
|
||
|
m_HasImpacted = true;
|
||
|
|
||
|
foreach (var projectileGO in m_ProjectileGraphics)
|
||
|
{
|
||
|
projectileGO.SetActive(false);
|
||
|
}
|
||
|
|
||
|
// is it impacting an actual enemy? We allow different graphics for the "miss" case
|
||
|
if (m_TargetDestination)
|
||
|
{
|
||
|
foreach (var hitGraphicGO in m_TargetHitGraphics)
|
||
|
{
|
||
|
hitGraphicGO.SetActive(true);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
foreach (var missGraphicGO in m_TargetMissedGraphics)
|
||
|
{
|
||
|
missGraphicGO.SetActive(true);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|