summaryrefslogtreecommitdiff
path: root/Assets/Scripts/DragItem.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Assets/Scripts/DragItem.cs')
-rw-r--r--Assets/Scripts/DragItem.cs79
1 files changed, 79 insertions, 0 deletions
diff --git a/Assets/Scripts/DragItem.cs b/Assets/Scripts/DragItem.cs
new file mode 100644
index 0000000..46ba50f
--- /dev/null
+++ b/Assets/Scripts/DragItem.cs
@@ -0,0 +1,79 @@
+using UnityEngine;
+
+public class DragItem : MonoBehaviour
+{
+ private Vector3 SelfPivot
+ {
+ get
+ {
+ var p = transform.position;
+ return new Vector3(p.x, 0, p.z);
+ }
+ }
+
+ private Vector3 DraggerPivot
+ {
+ get
+ {
+ var p = dragger.position;
+ return new Vector3(p.x, 0, p.z);
+ }
+ }
+
+ private bool _dragging;
+ public Transform dragger;
+
+ private Vector3 _lastDirection;
+ private Vector3 _lastSelfPivot;
+ private float _lastAngle;
+ private float _lastLength;
+ private int _currentStep;
+
+ private void FixedUpdate()
+ {
+ FixedUpdateDragger();
+
+ // 判断是否在拖拽
+ if (! _dragging) return;
+
+ // 位置计算
+ var draggerPivot = DraggerPivot;
+ var selfPivot = SelfPivot;
+ var direction = (_lastSelfPivot - draggerPivot).normalized;
+ var position = draggerPivot + direction * _lastLength;
+ var y = transform.position.y;
+ transform.position = new Vector3(
+ position.x,
+ y,
+ position.z
+ );
+
+ // 角度计算
+ if (direction != _lastDirection)
+ {
+ var angle = Vector3.SignedAngle(direction, _lastDirection, Vector3.up);
+ var selfAngle = transform.eulerAngles;
+ selfAngle.y -= angle;
+ transform.eulerAngles = selfAngle;
+ }
+
+ // 记录值
+ _lastSelfPivot = selfPivot;
+ _lastDirection = direction;
+ }
+
+ private void FixedUpdateDragger()
+ {
+ if (!_dragging && dragger != null)
+ {
+ _dragging = true;
+ var draggerPivot = DraggerPivot;
+ _lastSelfPivot = SelfPivot;
+ _lastLength = Vector3.Distance(draggerPivot, SelfPivot);
+ _lastDirection = (_lastSelfPivot - draggerPivot).normalized;
+ }
+
+ if (_dragging && dragger == null)
+ _dragging = false;
+ }
+}