using UnityEngine; using DG.Tweening; public class RopePullTask : MonoBehaviour { [Header("绑定")] public TreeTask treeTask; // 你的解密任务脚本 public Transform ropeMesh; // 绳子本体(用于抖动) [Header("下拉设置")] public float pullThreshold = 0.25f; // ✅ 下拉触发阈值(米) public float followSpeed = 25f; // 吸附跟随速度 [Header("抖动参数")] public float shakeStrength = 0.05f; public float shakeTime = 0.4f; [Header("回弹参数")] public float returnTime = 0.3f; private Transform snapHand; private bool isSnapping = false; private bool isTriggered = false; private float startHandY; private Vector3 ropeStartPos; private void Start() { ropeStartPos = ropeMesh.position; } private void OnTriggerEnter(Collider other) { if (isTriggered) return; if (!other.CompareTag("RightHand")) return; snapHand = other.transform; startHandY = snapHand.position.y; isSnapping = true; // ✅ 震动反馈 MRInput.Ins.VibrateRightController(0.6f, 120); // ✅ 初次轻微抖动 ropeMesh.DOShakePosition(0.2f, 0.02f, 10, 60); TriggerPullSuccess(); } private void OnTriggerExit(Collider other) { if (!other.CompareTag("RightHand")) return; isSnapping = false; snapHand = null; // ✅ 松手回弹 ropeMesh.DOMove(ropeStartPos, returnTime).SetEase(Ease.OutBack); } private void Update() { if (!isSnapping || snapHand == null || isTriggered) return; // ✅ 只跟随 XZ,Y 由手控制 // Vector3 targetPos = new Vector3( // ropeStartPos.x, // snapHand.position.y, // ropeStartPos.z // ); // // ropeMesh.position = Vector3.Lerp( // ropeMesh.position, // targetPos, // Time.deltaTime * followSpeed // ); // // // ✅ 判断是否下拉到触发距离 // float pullDistance = startHandY - snapHand.position.y; // // if (pullDistance >= pullThreshold) // { // TriggerPullSuccess(); // } } // =============================== // ✅ 触发成功逻辑 // =============================== private void TriggerPullSuccess() { if (isTriggered) return; isTriggered = true; isSnapping = false; Debug.Log("✅ 拉绳成功,触发画卷解密任务!"); // ✅ 强力震动反馈 MRInput.Ins.VibrateRightController(1f, 250); // ✅ 成功抖动特效 ropeMesh.DOShakePosition(shakeTime, shakeStrength, 20, 90) .OnComplete(() => { // ✅ 回弹 ropeMesh.DOMove(ropeStartPos, returnTime).SetEase(Ease.OutElastic); }); // ✅ 触发你的画卷任务 if (treeTask != null) { treeTask.StartTask(); } } }