BeamWeapon.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. using System;
  2. using UnityEngine;
  3. namespace Assets.Scripts.BeamWeapon
  4. {
  5. internal sealed class BeamWeapon : MonoBehaviour
  6. {
  7. public GameObject BeamPrefab;
  8. public GameObject MuzzleFlashPrefab;
  9. public GameObject ImpactEffectPrefab;
  10. public GameObject ImpactEffectDecalPrefab;
  11. public bool IsUsingAureole;
  12. public GameObject AureolePrefab;
  13. public float ImpactDecalLifeTime = 1f;
  14. public float MaxDistance = 1000;
  15. public LayerMask LayerMask = ~0;
  16. public float InstantiateDelay = 0;
  17. public float InstantiateMuzzleFlashDelay = 0;
  18. private GameObject _laserBeamClone;
  19. private GameObject _muzzleFlashClone;
  20. private GameObject _impactEffect;
  21. private GameObject _impactEffectDecalPrefab;
  22. private BeamPositionSetter _beamPositionSetter;
  23. private Vector3 _prevImpactPosition;
  24. private float _startTime;
  25. private void Start()
  26. {
  27. _startTime = Time.time;
  28. Invoke("InstantiateBeam", InstantiateDelay);
  29. Invoke("InstantiateMuzzleFlash", InstantiateMuzzleFlashDelay);
  30. if (IsUsingAureole)
  31. {
  32. var aureoleClone = Instantiate(AureolePrefab, transform.position, transform.rotation);
  33. aureoleClone.transform.parent = transform;
  34. aureoleClone.transform.localScale = new Vector3(1, 1, 1);
  35. Destroy(aureoleClone, InstantiateDelay);
  36. }
  37. }
  38. private void InstantiateBeam()
  39. {
  40. _laserBeamClone = Instantiate(BeamPrefab, transform.position, transform.rotation);
  41. _laserBeamClone.transform.parent = transform;
  42. _beamPositionSetter = _laserBeamClone.GetComponent<BeamPositionSetter>();
  43. }
  44. private void InstantiateMuzzleFlash()
  45. {
  46. _muzzleFlashClone = Instantiate(MuzzleFlashPrefab, transform.position, transform.rotation);
  47. _muzzleFlashClone.transform.parent = transform;
  48. }
  49. private void Update()
  50. {
  51. if (Time.time - _startTime < InstantiateDelay)
  52. return;
  53. if (_laserBeamClone == null || _muzzleFlashClone == null)
  54. return;
  55. _laserBeamClone.transform.rotation = transform.rotation;
  56. RaycastHit hit;
  57. var ray = new Ray(transform.position, transform.forward);
  58. if (Physics.Raycast(ray, out hit, MaxDistance, LayerMask))
  59. {
  60. _beamPositionSetter.Set(transform.position, hit.point);
  61. if (_impactEffect != null)
  62. _impactEffect.transform.position = hit.point;
  63. else
  64. {
  65. _impactEffect = Instantiate(ImpactEffectPrefab, hit.point, new Quaternion());
  66. _impactEffect.transform.parent = transform;
  67. }
  68. if (hit.point != _prevImpactPosition)
  69. {
  70. if (_impactEffectDecalPrefab != null)
  71. Destroy(_impactEffectDecalPrefab, ImpactDecalLifeTime);
  72. _impactEffectDecalPrefab = Instantiate(ImpactEffectDecalPrefab, hit.point, new Quaternion());
  73. _impactEffectDecalPrefab.transform.parent = transform;
  74. _impactEffectDecalPrefab.transform.LookAt(transform.position + hit.normal);
  75. }
  76. _prevImpactPosition = hit.point;
  77. }
  78. else
  79. {
  80. _beamPositionSetter.Set(transform.position, transform.position + transform.forward * MaxDistance);
  81. if (_impactEffect != null)
  82. {
  83. Destroy(_impactEffect.gameObject);
  84. _impactEffect = null;
  85. }
  86. if (_impactEffectDecalPrefab != null)
  87. {
  88. Destroy(_impactEffectDecalPrefab, ImpactDecalLifeTime);
  89. _impactEffectDecalPrefab = null;
  90. }
  91. }
  92. }
  93. }
  94. }