summaryrefslogtreecommitdiff
path: root/GameCode/SwordArtMove.cs
diff options
context:
space:
mode:
authorchai <215380520@qq.com>2023-10-27 11:05:14 +0800
committerchai <215380520@qq.com>2023-10-27 11:05:14 +0800
commit766cdff5ffa72b65d7f106658d1603f47739b2ba (patch)
tree34d7799a94dfa9be182825577583c0fa6dc935f7 /GameCode/SwordArtMove.cs
+ init
Diffstat (limited to 'GameCode/SwordArtMove.cs')
-rw-r--r--GameCode/SwordArtMove.cs61
1 files changed, 61 insertions, 0 deletions
diff --git a/GameCode/SwordArtMove.cs b/GameCode/SwordArtMove.cs
new file mode 100644
index 0000000..b521e51
--- /dev/null
+++ b/GameCode/SwordArtMove.cs
@@ -0,0 +1,61 @@
+using UnityEngine;
+
+public class SwordArtMove : MonoBehaviour
+{
+ private MoveTransform move;
+
+ public LayerMask mask;
+
+ public AnimationCurve heightCurve;
+
+ public AnimationCurve AwayCurve;
+
+ private Vector3 startUp;
+
+ private Vector3 startForward;
+
+ private Vector3 startPos;
+
+ public float multiplier = 1f;
+
+ public float heightMultiplier = 1f;
+
+ public float awayMultiplier = 1f;
+
+ public float speed = 1f;
+
+ private float counter;
+
+ private ParticleSystem[] parts;
+
+ private void Start()
+ {
+ parts = GetComponentsInChildren<ParticleSystem>();
+ move = GetComponentInParent<MoveTransform>();
+ move.enabled = false;
+ startForward = base.transform.forward;
+ startUp = Vector3.Cross(base.transform.forward, Vector3.forward);
+ startPos = base.transform.position;
+ awayMultiplier *= Mathf.Pow(move.localForce.magnitude / 40f * 2f, 0.45f);
+ awayMultiplier /= 1f + move.drag * 0.05f;
+ speed *= Mathf.Pow(awayMultiplier, 0.3f);
+ }
+
+ private void Update()
+ {
+ counter += TimeHandler.deltaTime * speed;
+ Vector3 vector = startPos + (heightCurve.Evaluate(counter) * heightMultiplier * startUp + AwayCurve.Evaluate(counter) * awayMultiplier * startForward) * multiplier;
+ RaycastHit2D raycastHit2D = Physics2D.Raycast(startPos, (vector - startPos).normalized, Vector3.Distance(vector, startPos), mask);
+ if ((bool)raycastHit2D.transform && !raycastHit2D.collider.GetComponent<Damagable>())
+ {
+ vector = raycastHit2D.point + raycastHit2D.normal * 0.1f;
+ for (int i = 0; i < parts.Length; i++)
+ {
+ parts[i].transform.position = (Vector3)raycastHit2D.point + Vector3.forward * 8f;
+ parts[i].transform.rotation = Quaternion.LookRotation(raycastHit2D.normal);
+ parts[i].Emit(1);
+ }
+ }
+ base.transform.root.position = vector;
+ }
+}