2026-05-21 스킬예측(진행중)
This commit is contained in:
137
Assets/Hovl Studio/HSFiles/Scripts/HS_TargetProjectile.cs
Normal file
137
Assets/Hovl Studio/HSFiles/Scripts/HS_TargetProjectile.cs
Normal file
@@ -0,0 +1,137 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user