diff options
Diffstat (limited to 'Assets/Art/Vfx/GrabSquaresEffect/AbstractWiresEffect/Scripts/WiresConnector.cs')
-rw-r--r-- | Assets/Art/Vfx/GrabSquaresEffect/AbstractWiresEffect/Scripts/WiresConnector.cs | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/Assets/Art/Vfx/GrabSquaresEffect/AbstractWiresEffect/Scripts/WiresConnector.cs b/Assets/Art/Vfx/GrabSquaresEffect/AbstractWiresEffect/Scripts/WiresConnector.cs new file mode 100644 index 00000000..0bd1c9f0 --- /dev/null +++ b/Assets/Art/Vfx/GrabSquaresEffect/AbstractWiresEffect/Scripts/WiresConnector.cs @@ -0,0 +1,114 @@ +using UnityEngine; + +namespace Assets.AbstractWiresEffect.Scripts +{ + internal sealed class WiresConnector : MonoBehaviour + { + public GameObject WiresParticles; + public GameObject LineRendererPrefab; + public bool UseSkinnedMeshRenderer; + public SkinnedMeshRenderer TargetSkinnedMeshRenderer; + public float MaxDistance; + public int MaxConnections; + public int MaxLineRenderers; + + private ParticleSystem _particleSystem; + private ParticleSystem.MainModule _particleSystemMainModule; + private ParticleSystem.Particle[] _particles; + private LineRenderer[] _lineRenderers; + private Transform _psTransform; + + private void Start() + { + _lineRenderers = new LineRenderer[MaxLineRenderers]; + + var go = Instantiate(WiresParticles, transform.position, WiresParticles.transform.rotation); + go.transform.parent = transform; + + _particleSystem = go.GetComponent<ParticleSystem>(); + var sh = _particleSystem.shape; + + if (UseSkinnedMeshRenderer) + sh.skinnedMeshRenderer = TargetSkinnedMeshRenderer; + + _particleSystemMainModule = _particleSystem.main; + _psTransform = _particleSystem.GetComponent<Transform>(); + + int maxParticles = _particleSystemMainModule.maxParticles; + _particles = new ParticleSystem.Particle[maxParticles]; + } + + private void LateUpdate() + { + var liveParticles = _particleSystem.GetParticles(_particles); + var lineRenderersCount = _lineRenderers.Length; + + var lrIndex = 0; + for (int i = 0; i < liveParticles; i++) + { + var p1Pos = _particles[i].position; + + var particleConnections = 0; + + for (int j = i + 1; j < liveParticles; j++) + { + if (particleConnections == MaxConnections || lrIndex == MaxLineRenderers) + break; + + var p2Pos = _particles[j].position; + + float distance = Vector3.Distance(p2Pos, p1Pos); + if (distance > MaxDistance) + continue; + + LineRenderer lineRenderer; + + if (_lineRenderers[lrIndex] == null) + { + var go = Instantiate(LineRendererPrefab, _psTransform.position, _psTransform.rotation); + lineRenderer = go.GetComponent<LineRenderer>(); + lineRenderer.transform.parent = _psTransform.transform; + _lineRenderers[lrIndex] = lineRenderer; + } + + lineRenderer = _lineRenderers[lrIndex]; + + lineRenderer.enabled = true; + lineRenderer.SetPosition(0, p1Pos); + lineRenderer.SetPosition(1, p2Pos); + + lrIndex++; + particleConnections++; + } + } + + var outdatedLineRenderers = lineRenderersCount - lrIndex; + + for (int i = lrIndex; i < outdatedLineRenderers; i++) + { + if (_lineRenderers[i] != null) + _lineRenderers[i].enabled = false; + } + } + + private void Stop() + { + DestroyAllLines(); + } + + private void OnDestroy() + { + DestroyAllLines(); + } + + private void DestroyAllLines() + { + if (_lineRenderers == null) + return; + + foreach (var lineRenderer in _lineRenderers) + if (lineRenderer != null) + Destroy(lineRenderer); + } + } +}
\ No newline at end of file |