Files
aibis-dream/Assets/Scripts/MiniGame/Engine/CordPull.cs
T
2025-01-17 21:05:06 +08:00

124 lines
3.6 KiB
C#

using AibisDream.Framework;
using AibisDream.Utility;
using DG.Tweening;
using UnityEngine;
using UnityEngine.EventSystems;
namespace AibisDream
{
public class CordPull : MonoBehaviour, IInteraction
{
private EventTriggerEx _trigger;
private EngineSystem _engineSystem;
private Vector3 _initPos;
public float maxDistance;
private Vector3 _dragPoint;
private bool _isDragging;
private void Awake()
{
// 记录当前位置
InitRefs();
}
private void InitRefs()
{
_initPos = transform.position;
_trigger = GetComponent<EventTriggerEx>();
_engineSystem = transform.parent.GetComponent<EngineSystem>();
_trigger.Register(EventTriggerType.BeginDrag, OnBeginDrag);
_trigger.Register(EventTriggerType.EndDrag, OnEndDrag);
_trigger.Register(EventTriggerType.Drag, OnDrag);
}
public float GetCurOil()
{
return Mathf.Abs((transform.localPosition.y - _initPos.y) / maxDistance);
}
private void Update()
{
if (_isDragging)
{
MoveToDragPos();
}
}
private void MoveToDragPos()
{
float curY;
// 如果拖拽点在上方,直接移动
if (_dragPoint.y > transform.position.y)
{
curY = _dragPoint.y;
}
// 如果拖拽点在下方,限速移动
else
{
if (Mathf.Abs(_dragPoint.y - transform.position.y) / Time.deltaTime >
_engineSystem.engineConfig.pullMaxSpeed)
{
curY = transform.position.y - _engineSystem.engineConfig.pullMaxSpeed * Time.deltaTime;
}
else
{
curY = _dragPoint.y;
}
}
transform.position = new Vector3(transform.position.x, curY, transform.position.y);
}
private void OnDrag(BaseEventData data)
{
// 这里是一些阻碍拖动的情况
// 正常情况下不会出错
if (data is not PointerEventData pointerData) return;
// 设置拖拽目标点
SetDragTarget(pointerData.position);
}
private void OnBeginDrag(BaseEventData data)
{
// 正常情况下不会出错
if (data is not PointerEventData pointerData) return;
// 设置拖拽目标点
SetDragTarget(pointerData.position);
// 开始拖动的时候把原有的动画删掉
transform.DOKill();
_isDragging = true;
}
private void OnEndDrag(BaseEventData data)
{
_isDragging = false;
// 松手后抽回去
var retractTime = (_initPos.y - transform.localPosition.y) / _engineSystem.engineConfig.retrunSpeed;
transform.DOMove(_initPos, retractTime);
}
private void SetDragTarget(Vector3 mousePos)
{
var worldPos = CommonUtil.GetMouseWorldPos(mousePos, transform);
var dragY = CommonUtil.Limit(worldPos.y, _initPos.y, _initPos.y - maxDistance);
_dragPoint = new Vector3(transform.position.x, dragY, transform.position.z);
}
public bool IsActive => true;
public bool IsAvailable => _engineSystem.isAvailable;
public GameObject GetGameObject()
{
return gameObject;
}
}
}