123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- using UnityEngine;
- using System.Collections;
- /* THIS CODE IS JUST FOR PREVIEW AND TESTING */
- // Feel free to use any code and picking on it, I cannot guaratnee it will fit into your project
- public class ExplodingProjectile : MonoBehaviour
- {
- public GameObject impactPrefab;
- public GameObject explosionPrefab;
- public float thrust;
- public Rigidbody thisRigidbody;
- public GameObject particleKillGroup;
- private Collider thisCollider;
- public bool LookRotation = true;
- public bool Missile = false;
- public Transform missileTarget;
- public float projectileSpeed;
- public float projectileSpeedMultiplier;
- public bool ignorePrevRotation = false;
- public bool explodeOnTimer = false;
- public float explosionTimer;
- float timer;
- private Vector3 previousPosition;
- // Use this for initialization
- void Start()
- {
- thisRigidbody = GetComponent<Rigidbody>();
- if (Missile)
- {
- missileTarget = GameObject.FindWithTag("Target").transform;
- }
- thisCollider = GetComponent<Collider>();
- previousPosition = transform.position;
- }
- // Update is called once per frame
- void Update()
- {
- /* if(Input.GetButtonUp("Fire2"))
- {
- Explode();
- }*/
- timer += Time.deltaTime;
- if (timer >= explosionTimer && explodeOnTimer == true)
- {
- Explode();
- }
- }
- void FixedUpdate()
- {
- if (Missile)
- {
- projectileSpeed += projectileSpeed * projectileSpeedMultiplier;
- // transform.position = Vector3.MoveTowards(transform.position, missileTarget.transform.position, 0);
- transform.LookAt(missileTarget);
- thisRigidbody.AddForce(transform.forward * projectileSpeed);
- }
- if (LookRotation && timer >= 0.05f)
- {
- transform.rotation = Quaternion.LookRotation(thisRigidbody.velocity);
- }
- CheckCollision(previousPosition);
- previousPosition = transform.position;
- }
- void CheckCollision(Vector3 prevPos)
- {
- RaycastHit hit;
- Vector3 direction = transform.position - prevPos;
- Ray ray = new Ray(prevPos, direction);
- float dist = Vector3.Distance(transform.position, prevPos);
- if (Physics.Raycast(ray, out hit, dist))
- {
- transform.position = hit.point;
- Quaternion rot = Quaternion.FromToRotation(Vector3.forward, hit.normal);
- Vector3 pos = hit.point;
- Instantiate(impactPrefab, pos, rot);
- if (!explodeOnTimer && Missile == false)
- {
- Destroy(gameObject);
- }
- else if (Missile == true)
- {
- thisCollider.enabled = false;
- particleKillGroup.SetActive(false);
- thisRigidbody.velocity = Vector3.zero;
- Destroy(gameObject, 5);
- }
- }
- }
- void OnCollisionEnter(Collision collision)
- {
- if (collision.gameObject.tag != "FX")
- {
- ContactPoint contact = collision.contacts[0];
- Quaternion rot = Quaternion.FromToRotation(Vector3.forward, contact.normal);
- if (ignorePrevRotation)
- {
- rot = Quaternion.Euler(0, 0, 0);
- }
- Vector3 pos = contact.point;
- Instantiate(impactPrefab, pos, rot);
- if (!explodeOnTimer && Missile == false)
- {
- Destroy(gameObject);
- }
- else if (Missile == true)
- {
- thisCollider.enabled = false;
- particleKillGroup.SetActive(false);
- thisRigidbody.velocity = Vector3.zero;
- Destroy(gameObject, 5);
- }
- }
- }
- void Explode()
- {
- Instantiate(explosionPrefab, gameObject.transform.position, Quaternion.Euler(0, 0, 0));
- Destroy(gameObject);
- }
- }
|