PortalFX_Turbulence.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. using System;
  2. using UnityEngine;
  3. [ExecuteInEditMode]
  4. public class PortalFX_Turbulence : MonoBehaviour
  5. {
  6. public float TurbulenceStrenght = 1;
  7. public Vector3 Frequency = new Vector3(1, 1, 1);
  8. public Vector3 OffsetSpeed = new Vector3(0.5f, 0.5f, 0.5f);
  9. public Vector3 Amplitude = new Vector3(5, 5, 5);
  10. public Vector3 GlobalForce;
  11. private float lastStopTime;
  12. private Vector3 currentOffset;
  13. private float deltaTime;
  14. private ParticleSystem.Particle[] particleArray;
  15. private ParticleSystem particleSys;
  16. private float time;
  17. private void Start()
  18. {
  19. particleSys = GetComponent<ParticleSystem>();
  20. if (particleArray==null || particleArray.Length < particleSys.maxParticles)
  21. particleArray = new ParticleSystem.Particle[particleSys.maxParticles];
  22. }
  23. private void Update()
  24. {
  25. int numParticlesAlive = particleSys.GetParticles(particleArray);
  26. if (!Application.isPlaying) {
  27. deltaTime = Time.realtimeSinceStartup - lastStopTime;
  28. lastStopTime = Time.realtimeSinceStartup;
  29. }
  30. else
  31. deltaTime = Time.deltaTime;
  32. currentOffset += OffsetSpeed * deltaTime;
  33. for (int i = 0; i < numParticlesAlive; i++) {
  34. var particle = particleArray[i];
  35. float timeTurbulenceStrength = 1;
  36. var pos = particle.position;
  37. pos.x /= Frequency.x;
  38. pos.y /= Frequency.y;
  39. pos.z /= Frequency.z;
  40. var turbulenceVector = new Vector3();
  41. turbulenceVector.x = ((Mathf.PerlinNoise(pos.z - currentOffset.z, pos.y - currentOffset.y) * 2 - 1) * Amplitude.x + GlobalForce.x) * deltaTime;
  42. turbulenceVector.y = ((Mathf.PerlinNoise(pos.x - currentOffset.x, pos.z - currentOffset.z) * 2 - 1) * Amplitude.y + GlobalForce.y) * deltaTime;
  43. turbulenceVector.z = ((Mathf.PerlinNoise(pos.y - currentOffset.y, pos.x - currentOffset.x) * 2 - 1) * Amplitude.z + GlobalForce.z) * deltaTime;
  44. turbulenceVector *= TurbulenceStrenght * timeTurbulenceStrength;
  45. particleArray[i].position += turbulenceVector;
  46. }
  47. particleSys.SetParticles(particleArray, numParticlesAlive);
  48. }
  49. }