blob: 0bd1c9f06329c4cbd26ae0bad847fafa01bc351a (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
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);
}
}
}
|