ControlDisplacerParticleSys.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. namespace Lux_SRP_GrassDisplacement {
  6. [RequireComponent(typeof(ParticleSystem))]
  7. public class ControlDisplacerParticleSys : MonoBehaviour
  8. {
  9. public float maxDistance = 1.0f;
  10. public float fallOff = 2.0f;
  11. [Layer]
  12. public int layerMask = 0;
  13. [Space(5)]
  14. public bool DebugRay = true;
  15. private Transform trans;
  16. private ParticleSystem ps;
  17. private ParticleSystem.MainModule main;
  18. private RaycastHit hit;
  19. private float alpha;
  20. private float min_alpha;
  21. private float max_alpha;
  22. private Color min_StartColor;
  23. private Color max_StartColor;
  24. void OnEnable() {
  25. trans = GetComponent<Transform>();
  26. ps = GetComponent<ParticleSystem>();
  27. main = ps.main;
  28. min_StartColor = main.startColor.colorMin;
  29. min_alpha = min_StartColor.a;
  30. max_StartColor = main.startColor.colorMax;
  31. max_alpha = max_StartColor.a;
  32. }
  33. void Update() {
  34. var mask = 1 << layerMask;
  35. if (Physics.Raycast(trans.position, Vector3.down, out hit, maxDistance, mask )) {
  36. #if UNITY_EDITOR
  37. if(DebugRay) {
  38. Debug.DrawRay(transform.position, Vector3.down * hit.distance, Color.green);
  39. }
  40. #endif
  41. alpha = (float)(1.0 - Math.Pow(hit.distance / maxDistance, fallOff));
  42. min_StartColor.a = min_alpha * alpha;
  43. max_StartColor.a = max_alpha * alpha;
  44. main.startColor = new ParticleSystem.MinMaxGradient(min_StartColor, max_StartColor);
  45. }
  46. else {
  47. #if UNITY_EDITOR
  48. if(DebugRay) {
  49. Debug.DrawRay(transform.position, Vector3.down * maxDistance, Color.red);
  50. }
  51. #endif
  52. if (alpha != 0.0f) {
  53. alpha = 0.0f;
  54. min_StartColor.a = alpha;
  55. max_StartColor.a = alpha;
  56. main.startColor = new ParticleSystem.MinMaxGradient(min_StartColor, max_StartColor);
  57. }
  58. }
  59. }
  60. }
  61. }