118 lines
3.0 KiB
C#
118 lines
3.0 KiB
C#
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();
|
||
}
|
||
}
|
||
}
|