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