diff options
author | chai <chaifix@163.com> | 2020-10-21 08:40:48 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2020-10-21 08:40:48 +0800 |
commit | 348306caec8f3c1aebee14523f7ae7d9b2c452b3 (patch) | |
tree | d2b28b4c3942e766a561bcad79e0d2ca4ad7b311 /Assets/Art/Vfx/GrabSquaresEffect/AbstractWiresEffect/Scripts | |
parent | d94c73f535949b4f2eed41b1f6d0ced605664a08 (diff) |
+VFX
Diffstat (limited to 'Assets/Art/Vfx/GrabSquaresEffect/AbstractWiresEffect/Scripts')
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: |