FirearmFxExample.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Assets.HeroEditor4D.Common.Scripts.CharacterScripts;
  5. using Assets.HeroEditor4D.Common.Scripts.Collections;
  6. using UnityEngine;
  7. namespace Assets.HeroEditor4D.Common.Scripts.ExampleScripts
  8. {
  9. public class FirearmFxExample : MonoBehaviour
  10. {
  11. public Character4D Character4D;
  12. public AudioSource AudioSource;
  13. public FirearmCollection FirearmCollection;
  14. private readonly List<ParticleSystem> _instances = new List<ParticleSystem>();
  15. private string _muzzleId;
  16. public void CreateFireMuzzle(string firearmName, string fallback = null)
  17. {
  18. var firearmParams = FirearmCollection.FirearmParams.SingleOrDefault(i => i.Name == firearmName)
  19. ?? FirearmCollection.FirearmParams.SingleOrDefault(i => i.Name == fallback)
  20. ?? FirearmCollection.FirearmParams.SingleOrDefault(i => i.Name == "Basic");
  21. if (firearmParams == null) throw new Exception($"Firearm params not found for {firearmName}. Please check FirearmCollection.");
  22. if (_muzzleId != firearmParams.Name)
  23. {
  24. Initialize(firearmParams);
  25. }
  26. foreach (var muzzle in _instances.Where(i => i.gameObject.activeInHierarchy))
  27. {
  28. muzzle.Play(true);
  29. }
  30. AudioSource.PlayOneShot(firearmParams.ShotSound);
  31. }
  32. private void Initialize(FirearmParams firearmParams)
  33. {
  34. if (_instances.Count > 0)
  35. {
  36. _instances.ForEach(i => Destroy(i.gameObject));
  37. _instances.Clear();
  38. }
  39. for (var i = 0; i < 4; i++)
  40. {
  41. var anchor = Character4D.Parts[i].AnchorFireMuzzle;
  42. var muzzle = Instantiate(firearmParams.FireMuzzlePrefab, anchor);
  43. _instances.Add(muzzle);
  44. }
  45. _muzzleId = firearmParams.Name;
  46. }
  47. }
  48. }