summaryrefslogtreecommitdiff
path: root/Assets/Art/Vfx/GrabSquaresEffect/AbstractWiresEffect/Scripts
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2020-10-21 08:40:48 +0800
committerchai <chaifix@163.com>2020-10-21 08:40:48 +0800
commit348306caec8f3c1aebee14523f7ae7d9b2c452b3 (patch)
treed2b28b4c3942e766a561bcad79e0d2ca4ad7b311 /Assets/Art/Vfx/GrabSquaresEffect/AbstractWiresEffect/Scripts
parentd94c73f535949b4f2eed41b1f6d0ced605664a08 (diff)
+VFX
Diffstat (limited to 'Assets/Art/Vfx/GrabSquaresEffect/AbstractWiresEffect/Scripts')
-rw-r--r--Assets/Art/Vfx/GrabSquaresEffect/AbstractWiresEffect/Scripts/CollisionDetector.cs34
-rw-r--r--Assets/Art/Vfx/GrabSquaresEffect/AbstractWiresEffect/Scripts/CollisionDetector.cs.meta12
-rw-r--r--Assets/Art/Vfx/GrabSquaresEffect/AbstractWiresEffect/Scripts/CollisionSpawner.cs53
-rw-r--r--Assets/Art/Vfx/GrabSquaresEffect/AbstractWiresEffect/Scripts/CollisionSpawner.cs.meta12
-rw-r--r--Assets/Art/Vfx/GrabSquaresEffect/AbstractWiresEffect/Scripts/WiresConnector.cs114
-rw-r--r--Assets/Art/Vfx/GrabSquaresEffect/AbstractWiresEffect/Scripts/WiresConnector.cs.meta12
6 files changed, 237 insertions, 0 deletions
diff --git a/Assets/Art/Vfx/GrabSquaresEffect/AbstractWiresEffect/Scripts/CollisionDetector.cs b/Assets/Art/Vfx/GrabSquaresEffect/AbstractWiresEffect/Scripts/CollisionDetector.cs
new file mode 100644
index 00000000..179d8511
--- /dev/null
+++ b/Assets/Art/Vfx/GrabSquaresEffect/AbstractWiresEffect/Scripts/CollisionDetector.cs
@@ -0,0 +1,34 @@
+using System;
+using UnityEngine;
+
+namespace Assets.AbstractWiresEffect.Scripts
+{
+ internal sealed class CollisionDetector : MonoBehaviour
+ {
+ public float CollisionDistance;
+
+ private Transform _transform;
+
+ public event Action<Vector3> CollisionDetected;
+
+ private void Start()
+ {
+ _transform = transform;
+ }
+
+ private void FixedUpdate()
+ {
+ RaycastHit hit;
+ if (!Physics.Raycast(_transform.position, -transform.up, out hit, CollisionDistance))
+ return;
+
+ var distance = Vector3.Distance(_transform.position, hit.point);
+
+ if (distance > CollisionDistance)
+ return;
+
+ if (CollisionDetected != null)
+ CollisionDetected.Invoke(hit.point);
+ }
+ }
+}
diff --git a/Assets/Art/Vfx/GrabSquaresEffect/AbstractWiresEffect/Scripts/CollisionDetector.cs.meta b/Assets/Art/Vfx/GrabSquaresEffect/AbstractWiresEffect/Scripts/CollisionDetector.cs.meta
new file mode 100644
index 00000000..bab53bf8
--- /dev/null
+++ b/Assets/Art/Vfx/GrabSquaresEffect/AbstractWiresEffect/Scripts/CollisionDetector.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 89af8e8c11b710841957296475354a38
+timeCreated: 1497378512
+licenseType: Free
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Art/Vfx/GrabSquaresEffect/AbstractWiresEffect/Scripts/CollisionSpawner.cs b/Assets/Art/Vfx/GrabSquaresEffect/AbstractWiresEffect/Scripts/CollisionSpawner.cs
new file mode 100644
index 00000000..82f19fd9
--- /dev/null
+++ b/Assets/Art/Vfx/GrabSquaresEffect/AbstractWiresEffect/Scripts/CollisionSpawner.cs
@@ -0,0 +1,53 @@
+using UnityEngine;
+
+namespace Assets.AbstractWiresEffect.Scripts
+{
+ [RequireComponent(typeof(CollisionDetector))]
+ internal sealed class CollisionSpawner : MonoBehaviour
+ {
+ public GameObject CollisionEffect;
+ public float LifeTime = 1f;
+
+ private bool _isAlreadySpawned;
+ private CollisionDetector _collisionDetector;
+
+ private void Start()
+ {
+ _collisionDetector = GetComponent<CollisionDetector>();
+ _collisionDetector.CollisionDetected += OnCollisionDetected;
+ }
+
+ private void OnCollisionDetected(Vector3 hit)
+ {
+ if (_isAlreadySpawned)
+ return;
+
+ InstantiateImpactEffect(hit);
+
+ ////todo add decal
+ ////InstantiateDecal();
+ }
+
+ private void InstantiateImpactEffect(Vector3 pos)
+ {
+ var impactEffect = Instantiate(CollisionEffect, pos, CollisionEffect.transform.rotation);
+ impactEffect.transform.position = pos;
+
+ //todo add ivoke with delay and params
+ Destroy(impactEffect, LifeTime);
+ Invoke("Reset", LifeTime);
+
+ _isAlreadySpawned = true;
+ }
+
+ private void Reset()
+ {
+ _isAlreadySpawned = false;
+ }
+
+ private void OnDestroy()
+ {
+ _collisionDetector.CollisionDetected -= OnCollisionDetected;
+ }
+ }
+}
diff --git a/Assets/Art/Vfx/GrabSquaresEffect/AbstractWiresEffect/Scripts/CollisionSpawner.cs.meta b/Assets/Art/Vfx/GrabSquaresEffect/AbstractWiresEffect/Scripts/CollisionSpawner.cs.meta
new file mode 100644
index 00000000..d0219bdc
--- /dev/null
+++ b/Assets/Art/Vfx/GrabSquaresEffect/AbstractWiresEffect/Scripts/CollisionSpawner.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: f1188527b3754cc40b3c05ec3089423a
+timeCreated: 1497378515
+licenseType: Free
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
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
diff --git a/Assets/Art/Vfx/GrabSquaresEffect/AbstractWiresEffect/Scripts/WiresConnector.cs.meta b/Assets/Art/Vfx/GrabSquaresEffect/AbstractWiresEffect/Scripts/WiresConnector.cs.meta
new file mode 100644
index 00000000..102baf87
--- /dev/null
+++ b/Assets/Art/Vfx/GrabSquaresEffect/AbstractWiresEffect/Scripts/WiresConnector.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: bbb8a810ae4045342a7b72f088142ca5
+timeCreated: 1497378504
+licenseType: Free
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant: