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); | |||
|  |                     } | |||
|  |                 } | |||
|  |             } | |||
|  |         }*/ | |||
|  |     } | |||
|  | } |