2021-12-15 16:29:44 +03:00

170 lines
5.1 KiB
C#

//
//NOTES:
//This script is used for DEMONSTRATION porpuses of the Projectiles. I recommend everyone to create their own code for their own projects.
//This is just a basic example.
//
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ProjectileMoveScript : MonoBehaviour {
public bool bounce = false;
public float bounceForce = 10;
public float speed;
[Tooltip("From 0% to 100%")]
public float accuracy;
public float fireRate;
public GameObject muzzlePrefab;
public GameObject hitPrefab;
public AudioClip shotSFX;
public AudioClip hitSFX;
public List<GameObject> trails;
private Vector3 startPos;
private float speedRandomness;
private Vector3 offset;
private bool collided;
private Rigidbody rb;
private RotateToMouseScript rotateToMouse;
private GameObject target;
void Start () {
startPos = transform.position;
rb = GetComponent <Rigidbody> ();
//used to create a radius for the accuracy and have a very unique randomness
if (accuracy != 100) {
accuracy = 1 - (accuracy / 100);
for (int i = 0; i < 2; i++) {
var val = 1 * Random.Range (-accuracy, accuracy);
var index = Random.Range (0, 2);
if (i == 0) {
if (index == 0)
offset = new Vector3 (0, -val, 0);
else
offset = new Vector3 (0, val, 0);
} else {
if (index == 0)
offset = new Vector3 (0, offset.y, -val);
else
offset = new Vector3 (0, offset.y, val);
}
}
}
if (muzzlePrefab != null) {
var muzzleVFX = Instantiate (muzzlePrefab, transform.position, Quaternion.identity);
muzzleVFX.transform.forward = gameObject.transform.forward + offset;
var ps = muzzleVFX.GetComponent<ParticleSystem>();
if (ps != null)
Destroy (muzzleVFX, ps.main.duration);
else {
var psChild = muzzleVFX.transform.GetChild(0).GetComponent<ParticleSystem>();
Destroy (muzzleVFX, psChild.main.duration);
}
}
if (shotSFX != null && GetComponent<AudioSource>()) {
GetComponent<AudioSource> ().PlayOneShot (shotSFX);
}
}
void FixedUpdate () {
if (target != null)
rotateToMouse.RotateToMouse (gameObject, target.transform.position);
if (speed != 0 && rb != null)
rb.position += (transform.forward + offset) * (speed * Time.deltaTime);
}
void OnCollisionEnter (Collision co) {
if (!bounce)
{
if (co.gameObject.tag != "Bullet" && !collided)
{
collided = true;
if (shotSFX != null && GetComponent<AudioSource>())
{
GetComponent<AudioSource>().PlayOneShot(hitSFX);
}
if (trails.Count > 0)
{
for (int i = 0; i < trails.Count; i++)
{
trails[i].transform.parent = null;
var ps = trails[i].GetComponent<ParticleSystem>();
if (ps != null)
{
ps.Stop();
Destroy(ps.gameObject, ps.main.duration + ps.main.startLifetime.constantMax);
}
}
}
speed = 0;
GetComponent<Rigidbody>().isKinematic = true;
ContactPoint contact = co.contacts[0];
Quaternion rot = Quaternion.FromToRotation(Vector3.up, contact.normal);
Vector3 pos = contact.point;
if (hitPrefab != null)
{
var hitVFX = Instantiate(hitPrefab, pos, rot) as GameObject;
var ps = hitVFX.GetComponent<ParticleSystem>();
if (ps == null)
{
var psChild = hitVFX.transform.GetChild(0).GetComponent<ParticleSystem>();
Destroy(hitVFX, psChild.main.duration);
}
else
Destroy(hitVFX, ps.main.duration);
}
StartCoroutine(DestroyParticle(0f));
}
}
else
{
rb.useGravity = true;
rb.drag = 0.5f;
ContactPoint contact = co.contacts[0];
rb.AddForce (Vector3.Reflect((contact.point - startPos).normalized, contact.normal) * bounceForce, ForceMode.Impulse);
Destroy ( this );
}
}
public IEnumerator DestroyParticle (float waitTime) {
if (transform.childCount > 0 && waitTime != 0) {
List<Transform> tList = new List<Transform> ();
foreach (Transform t in transform.GetChild(0).transform) {
tList.Add (t);
}
while (transform.GetChild(0).localScale.x > 0) {
yield return new WaitForSeconds (0.01f);
transform.GetChild(0).localScale -= new Vector3 (0.1f, 0.1f, 0.1f);
for (int i = 0; i < tList.Count; i++) {
tList[i].localScale -= new Vector3 (0.1f, 0.1f, 0.1f);
}
}
}
yield return new WaitForSeconds (waitTime);
Destroy (gameObject);
}
public void SetTarget (GameObject trg, RotateToMouseScript rotateTo)
{
target = trg;
rotateToMouse = rotateTo;
}
}