You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			76 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C#
		
	
		
		
			
		
	
	
			76 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C#
		
	
| 
								 
											1 year ago
										 
									 | 
							
								using System.Collections;
							 | 
						||
| 
								 | 
							
								using System.Collections.Generic;
							 | 
						||
| 
								 | 
							
								using UnityEngine;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace Autohand {
							 | 
						||
| 
								 | 
							
								    public class AutoGunTarget : MonoBehaviour {
							 | 
						||
| 
								 | 
							
								        public GameObject hitDecal;
							 | 
						||
| 
								 | 
							
								        public ParticleSystem hitParticle;
							 | 
						||
| 
								 | 
							
								        public float hitDecalLifetime;
							 | 
						||
| 
								 | 
							
								        public UnityGunHitEvent OnShotEvent;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        Dictionary<GameObject, float> decalLifetimeTracker = new Dictionary<GameObject, float>();
							 | 
						||
| 
								 | 
							
								        List<GameObject> decalPool = new List<GameObject>();
							 | 
						||
| 
								 | 
							
								        List<ParticleSystem> inactiveParticlePool = new List<ParticleSystem>();
							 | 
						||
| 
								 | 
							
								        List<ParticleSystem> activeParticlePool = new List<ParticleSystem>();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public virtual void OnShot(AutoGun gun, RaycastHit hit){
							 | 
						||
| 
								 | 
							
								            OnShotEvent?.Invoke(gun, hit);
							 | 
						||
| 
								 | 
							
								             CreateHitParticle(hit);
							 | 
						||
| 
								 | 
							
								            CreateHitDecal(hit);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        private void FixedUpdate() {
							 | 
						||
| 
								 | 
							
								            CheckDecalLifetime();
							 | 
						||
| 
								 | 
							
								            CheckParticlPlaying();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        void CreateHitParticle(RaycastHit hit) {
							 | 
						||
| 
								 | 
							
								            if(hitParticle != null) { 
							 | 
						||
| 
								 | 
							
								                var newHitParticle = GameObject.Instantiate(hitParticle);
							 | 
						||
| 
								 | 
							
								                newHitParticle.transform.position = hit.point;
							 | 
						||
| 
								 | 
							
								                newHitParticle.transform.forward = hit.normal;
							 | 
						||
| 
								 | 
							
								                activeParticlePool.Add(newHitParticle);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        void CreateHitDecal(RaycastHit hit) {
							 | 
						||
| 
								 | 
							
								            if(hitDecal != null) {
							 | 
						||
| 
								 | 
							
								                var newHitDecal = GameObject.Instantiate(hitDecal);
							 | 
						||
| 
								 | 
							
								                newHitDecal.transform.position = hit.point;
							 | 
						||
| 
								 | 
							
								                newHitDecal.transform.forward = hit.normal;
							 | 
						||
| 
								 | 
							
								                decalLifetimeTracker.Add(hitDecal, hitDecalLifetime);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        void CheckDecalLifetime() {
							 | 
						||
| 
								 | 
							
								            if(decalLifetimeTracker.Count > 0) {
							 | 
						||
| 
								 | 
							
								                var decalKeys = new GameObject[decalLifetimeTracker.Count];
							 | 
						||
| 
								 | 
							
								                decalLifetimeTracker.Keys.CopyTo(decalKeys, 0);
							 | 
						||
| 
								 | 
							
								                foreach(var decal in decalKeys) {
							 | 
						||
| 
								 | 
							
								                    decalLifetimeTracker[decal] -= Time.deltaTime;
							 | 
						||
| 
								 | 
							
								                    if(decalLifetimeTracker[decal] <= 0) {
							 | 
						||
| 
								 | 
							
								                        decal.SetActive(false);
							 | 
						||
| 
								 | 
							
								                        decalPool.Add(decal);
							 | 
						||
| 
								 | 
							
								                        decalLifetimeTracker.Remove(decal);
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        void CheckParticlPlaying() {
							 | 
						||
| 
								 | 
							
								            if(inactiveParticlePool.Count > 0) {
							 | 
						||
| 
								 | 
							
								                var playingKeys = new ParticleSystem[activeParticlePool.Count];
							 | 
						||
| 
								 | 
							
								                activeParticlePool.CopyTo(playingKeys, 0);
							 | 
						||
| 
								 | 
							
								                foreach(var particle in playingKeys) {
							 | 
						||
| 
								 | 
							
								                    if(!particle.isPlaying)
							 | 
						||
| 
								 | 
							
								                        particle.gameObject.SetActive(false);
							 | 
						||
| 
								 | 
							
								                    inactiveParticlePool.Add(particle);
							 | 
						||
| 
								 | 
							
								                    activeParticlePool.Remove(particle);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |