Files
WhiteMan_Unity2D/Assets/Hovl Studio/HSFiles/Scripts/HS_TargetProjectile.cs

138 lines
4.3 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class HS_TargetProjectile : MonoBehaviour
{
public float speed = 15f;
public GameObject hit;
public GameObject flash;
public GameObject[] Detached;
public bool LocalRotation = false;
private Transform target;
private Vector3 targetOffset;
private float startDistanceToTarget;
[Space]
[Header("PROJECTILE PATH")]
private float randomUpAngle;
private float randomSideAngle;
public float sideAngle = 25;
public float upAngle = 20;
void Start()
{
FlashEffect();
newRandom();
}
void newRandom()
{
randomUpAngle = Random.Range(0, upAngle);
randomSideAngle = Random.Range(-sideAngle, sideAngle);
}
//Link from another script
//TARGET POSITION + TARGET OFFSET
public void UpdateTarget(Transform targetPosition , Vector3 Offset)
{
target = targetPosition;
targetOffset = Offset;
startDistanceToTarget = Vector3.Distance((target.position + targetOffset), transform.position);
}
void Update()
{
if (target == null)
{
foreach (var detachedPrefab in Detached)
{
if (detachedPrefab != null)
{
detachedPrefab.transform.parent = null;
}
}
Destroy(gameObject);
return;
}
float distanceToTarget = Vector3.Distance((target.position + targetOffset), transform.position);
float angleRange = (distanceToTarget - 10) / 60;
if (angleRange < 0) angleRange = 0;
float saturatedDistanceToTarget = (distanceToTarget / startDistanceToTarget);
if (saturatedDistanceToTarget < 0.5)
saturatedDistanceToTarget -= (0.5f - saturatedDistanceToTarget);
saturatedDistanceToTarget -= angleRange;
if (saturatedDistanceToTarget <= 0)
saturatedDistanceToTarget = 0;
Vector3 forward = ((target.position + targetOffset) - transform.position);
Vector3 crossDirection = Vector3.Cross(forward, Vector3.up);
Quaternion randomDeltaRotation = Quaternion.Euler(0, randomSideAngle*saturatedDistanceToTarget, 0) * Quaternion.AngleAxis(randomUpAngle * saturatedDistanceToTarget, crossDirection);
Vector3 direction = randomDeltaRotation * forward;
float distanceThisFrame = Time.deltaTime * speed;
if (direction.magnitude <= distanceThisFrame)
{
HitTarget();
return;
}
transform.Translate(direction.normalized * distanceThisFrame, Space.World);
transform.rotation = Quaternion.LookRotation(direction);
}
void FlashEffect()
{
if (flash != null)
{
var flashInstance = Instantiate(flash, transform.position, Quaternion.identity);
flashInstance.transform.forward = gameObject.transform.forward;
var flashPs = flashInstance.GetComponent<ParticleSystem>();
if (flashPs != null)
{
Destroy(flashInstance, flashPs.main.duration);
}
else
{
var flashPsParts = flashInstance.transform.GetChild(0).GetComponent<ParticleSystem>();
Destroy(flashInstance, flashPsParts.main.duration);
}
}
}
void HitTarget()
{
if (hit != null)
{
var hitRotation = transform.rotation;
if (LocalRotation == true)
{
hitRotation = Quaternion.Euler(0, 0, 0);
}
var hitInstance = Instantiate(hit, target.position + targetOffset, hitRotation);
var hitPs = hitInstance.GetComponent<ParticleSystem>();
if (hitPs != null)
{
Destroy(hitInstance, hitPs.main.duration);
}
else
{
var hitPsParts = hitInstance.transform.GetChild(0).GetComponent<ParticleSystem>();
Destroy(hitInstance, hitPsParts.main.duration);
}
}
foreach (var detachedPrefab in Detached)
{
if (detachedPrefab != null)
{
detachedPrefab.transform.parent = null;
Destroy(detachedPrefab, 1);
}
}
Destroy(gameObject);
}
}