122 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C#
		
	
	
	
| using UnityEngine;
 | |
| using System.Collections;
 | |
| 
 | |
| namespace PolygonArsenal
 | |
| {
 | |
|     public class PolygonProjectileScript : MonoBehaviour
 | |
|     {
 | |
|         public GameObject impactParticle;
 | |
|         public GameObject projectileParticle;
 | |
|         public GameObject muzzleParticle;
 | |
|         public GameObject[] trailParticles;
 | |
|         [Header("Adjust if not using Sphere Collider")]
 | |
|         public float colliderRadius = 1f;
 | |
|         [Range(0f, 1f)]
 | |
|         public float collideOffset = 0.15f;
 | |
| 
 | |
|         void Start()
 | |
|         {
 | |
|             projectileParticle = Instantiate(projectileParticle, transform.position, transform.rotation) as GameObject;
 | |
|             projectileParticle.transform.parent = transform;
 | |
|             if (muzzleParticle)
 | |
|             {
 | |
|                 muzzleParticle = Instantiate(muzzleParticle, transform.position, transform.rotation) as GameObject;
 | |
|                 Destroy(muzzleParticle, 1.5f); // Lifetime of muzzle effect.
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         void FixedUpdate()
 | |
|         {
 | |
|             RaycastHit hit;
 | |
| 
 | |
|             float rad;
 | |
|             if (transform.GetComponent<SphereCollider>())
 | |
|                 rad = transform.GetComponent<SphereCollider>().radius;
 | |
|             else
 | |
|                 rad = colliderRadius;
 | |
| 
 | |
|             Vector3 dir = transform.GetComponent<Rigidbody>().velocity;
 | |
|             if (transform.GetComponent<Rigidbody>().useGravity)
 | |
|                 dir += Physics.gravity * Time.deltaTime;
 | |
|             dir = dir.normalized;
 | |
| 
 | |
|             float dist = transform.GetComponent<Rigidbody>().velocity.magnitude * Time.deltaTime;
 | |
| 
 | |
|             if (Physics.SphereCast(transform.position, rad, dir, out hit, dist))
 | |
|             {
 | |
|                 transform.position = hit.point + (hit.normal * collideOffset);
 | |
| 
 | |
|                 GameObject impactP = Instantiate(impactParticle, transform.position, Quaternion.FromToRotation(Vector3.up, hit.normal)) as GameObject;
 | |
| 
 | |
|                 if (hit.transform.tag == "Destructible") // Projectile will destroy objects tagged as Destructible
 | |
|                 {
 | |
|                     Destroy(hit.transform.gameObject);
 | |
|                 }
 | |
| 
 | |
|                 foreach (GameObject trail in trailParticles)
 | |
|                 {
 | |
|                     GameObject curTrail = transform.Find(projectileParticle.name + "/" + trail.name).gameObject;
 | |
|                     curTrail.transform.parent = null;
 | |
|                     Destroy(curTrail, 3f);
 | |
|                 }
 | |
|                 Destroy(projectileParticle, 3f);
 | |
|                 Destroy(impactP, 5.0f);
 | |
|                 Destroy(gameObject);
 | |
| 
 | |
|                 ParticleSystem[] trails = GetComponentsInChildren<ParticleSystem>();
 | |
|                 //Component at [0] is that of the parent i.e. this object (if there is any)
 | |
|                 for (int i = 1; i < trails.Length; i++)
 | |
|                 {
 | |
| 
 | |
|                     ParticleSystem trail = trails[i];
 | |
| 
 | |
|                     if (trail.gameObject.name.Contains("Trail"))
 | |
|                     {
 | |
|                         trail.transform.SetParent(null);
 | |
|                         Destroy(trail.gameObject, 2f);
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         //private bool hasCollided = false;
 | |
| 
 | |
|         /*void OnCollisionEnter(Collision hit)
 | |
|         {
 | |
|             if (!hasCollided)
 | |
|             {
 | |
|                 hasCollided = true;
 | |
|                 impactParticle = Instantiate(impactParticle, transform.position, Quaternion.FromToRotation(Vector3.up, impactNormal)) as GameObject;
 | |
| 
 | |
|                 if (hit.gameObject.tag == "Destructible") // Projectile will destroy objects tagged as Destructible
 | |
|                 {
 | |
|                     Destroy(hit.gameObject);
 | |
|                 }
 | |
| 
 | |
|                 foreach (GameObject trail in trailParticles)
 | |
|                 {
 | |
|                     GameObject curTrail = transform.Find(projectileParticle.name + "/" + trail.name).gameObject;
 | |
|                     curTrail.transform.parent = null;
 | |
|                     Destroy(curTrail, 3f);
 | |
|                 }
 | |
|                 Destroy(projectileParticle, 3f);
 | |
|                 Destroy(impactParticle, 5f);
 | |
|                 Destroy(gameObject);
 | |
| 
 | |
|                 ParticleSystem[] trails = GetComponentsInChildren<ParticleSystem>();
 | |
|                 //Component at [0] is that of the parent i.e. this object (if there is any)
 | |
|                 for (int i = 1; i < trails.Length; i++)
 | |
|                 {
 | |
| 
 | |
|                     ParticleSystem trail = trails[i];
 | |
| 
 | |
|                     if (trail.gameObject.name.Contains("Trail"))
 | |
|                     {
 | |
|                     trail.transform.SetParent(null);
 | |
|                     Destroy(trail.gameObject, 2f);
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         }*/
 | |
|     }
 | |
| } |