CapersProject/Assets/Hovl Studio/HSFiles/Scripts/HS_ProjectileMover.cs

122 lines
4.0 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class HS_ProjectileMover : MonoBehaviour
{
[SerializeField] protected float speed = 15f;
[SerializeField] protected float hitOffset = 0f;
[SerializeField] protected bool UseFirePointRotation;
[SerializeField] protected Vector3 rotationOffset = new Vector3(0, 0, 0);
[SerializeField] protected GameObject hit;
[SerializeField] protected ParticleSystem hitPS;
[SerializeField] protected GameObject flash;
[SerializeField] protected Rigidbody rb;
[SerializeField] protected Collider col;
[SerializeField] protected Light lightSourse;
[SerializeField] protected GameObject[] Detached;
[SerializeField] protected ParticleSystem projectilePS;
private bool startChecker = false;
[SerializeField]protected bool notDestroy = false;
protected virtual void Start()
{
if (!startChecker)
{
/*lightSourse = GetComponent<Light>();
rb = GetComponent<Rigidbody>();
col = GetComponent<Collider>();
if (hit != null)
hitPS = hit.GetComponent<ParticleSystem>();*/
if (flash != null)
{
flash.transform.parent = null;
}
}
if (notDestroy)
StartCoroutine(DisableTimer(5));
else
Destroy(gameObject, 5);
startChecker = true;
}
protected virtual IEnumerator DisableTimer(float time)
{
yield return new WaitForSeconds(time);
if(gameObject.activeSelf)
gameObject.SetActive(false);
yield break;
}
protected virtual void OnEnable()
{
if (startChecker)
{
if (flash != null)
{
flash.transform.parent = null;
}
if (lightSourse != null)
lightSourse.enabled = true;
col.enabled = true;
rb.constraints = RigidbodyConstraints.None;
}
}
protected virtual void FixedUpdate()
{
if (speed != 0)
{
rb.linearVelocity = transform.forward * speed;
}
}
//https ://docs.unity3d.com/ScriptReference/Rigidbody.OnCollisionEnter.html
protected virtual void OnCollisionEnter(Collision collision)
{
//Lock all axes movement and rotation
rb.constraints = RigidbodyConstraints.FreezeAll;
//speed = 0;
if (lightSourse != null)
lightSourse.enabled = false;
col.enabled = false;
projectilePS.Stop();
projectilePS.Stop(true, ParticleSystemStopBehavior.StopEmittingAndClear);
ContactPoint contact = collision.contacts[0];
Quaternion rot = Quaternion.FromToRotation(Vector3.up, contact.normal);
Vector3 pos = contact.point + contact.normal * hitOffset;
//Spawn hit effect on collision
if (hit != null)
{
hit.transform.rotation = rot;
hit.transform.position = pos;
if (UseFirePointRotation) { hit.transform.rotation = gameObject.transform.rotation * Quaternion.Euler(0, 180f, 0); }
else if (rotationOffset != Vector3.zero) { hit.transform.rotation = Quaternion.Euler(rotationOffset); }
else { hit.transform.LookAt(contact.point + contact.normal); }
hitPS.Play();
}
//Removing trail from the projectile on cillision enter or smooth removing. Detached elements must have "AutoDestroying script"
foreach (var detachedPrefab in Detached)
{
if (detachedPrefab != null)
{
ParticleSystem detachedPS = detachedPrefab.GetComponent<ParticleSystem>();
detachedPS.Stop();
}
}
if (notDestroy)
StartCoroutine(DisableTimer(hitPS.main.duration));
else
{
if (hitPS != null)
{
Destroy(gameObject, hitPS.main.duration);
}
else
Destroy(gameObject, 1);
}
}
}