Files
SXDMystery/Assets/_SXDMystery/Scripts/Task/TreeTask/RopePullTask.cs
2025-12-16 11:15:33 +08:00

118 lines
3.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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;
// ✅ 只跟随 XZY 由手控制
// 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();
}
}
}