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#
		
	
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);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
} |