diff options
author | chai <215380520@qq.com> | 2023-10-27 11:05:14 +0800 |
---|---|---|
committer | chai <215380520@qq.com> | 2023-10-27 11:05:14 +0800 |
commit | 766cdff5ffa72b65d7f106658d1603f47739b2ba (patch) | |
tree | 34d7799a94dfa9be182825577583c0fa6dc935f7 /GameCode/SwordArtMove.cs |
+ init
Diffstat (limited to 'GameCode/SwordArtMove.cs')
-rw-r--r-- | GameCode/SwordArtMove.cs | 61 |
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; + } +} |