Files
aibis-dream/Assets/Scripts/MiniGame/Engine/CordPull.cs
T
2025-06-04 21:45:50 +08:00

138 lines
4.0 KiB
C#

using AibisDream.Framework;
using AibisDream.Utility;
using DG.Tweening;
using UnityEngine;
using UnityEngine.EventSystems;
namespace AibisDream
{
public class CordPull : MonoBehaviour, IInteraction
{
private static readonly int ShineFade = Shader.PropertyToID("_ShineFade");
private EventTriggerEx _trigger;
private SpriteRenderer _sprite;
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>();
_sprite = GetComponent<SpriteRenderer>();
_trigger.Register(EventTriggerType.BeginDrag, OnBeginDrag);
_trigger.Register(EventTriggerType.EndDrag, OnEndDrag);
_trigger.Register(EventTriggerType.Drag, OnDrag);
}
private void Update()
{
if (_isDragging)
{
MoveToDragPos();
}
}
private void MoveToDragPos()
{
float curY;
// 如果拖拽点在上方,直接移动
if (_dragPoint.y > transform.position.y)
{
curY = _dragPoint.y;
}
// 如果拖拽点在下方,限速移动
else
{
curY = _dragPoint.y;
var pullDelta = Mathf.Abs(curY - transform.position.y) / maxDistance;
// 将增量同步给Engine
_engineSystem.AddAirPress(pullDelta);
}
transform.position = new Vector3(transform.position.x, curY, transform.position.y);
}
private void OnDrag(BaseEventData data)
{
// 这里是一些阻碍拖动的情况
if (!IsActive) return;
// 正常情况下不会出错
if (data is not PointerEventData pointerData) return;
// 设置拖拽目标点
SetDragTarget(pointerData.position);
}
private void OnBeginDrag(BaseEventData data)
{
// 这里是一些阻碍拖动的情况
if (!IsActive) return;
// 首次拖拽后关闭高亮
if (GlobalVariableKit.IsCordHighLight)
{
GlobalVariableKit.IsCordHighLight = false;
_sprite.material.SetFloat(ShineFade, 0);
}
// 正常情况下不会出错
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.returnSpeed;
transform.DOMove(_initPos, retractTime);
}
private void SetDragTarget(Vector3 mousePos)
{
var worldPos = CameraKit.GetMouseWorldPos(mousePos);
var dragY = CommonUtil.Limit(worldPos.y, _initPos.y, _initPos.y - maxDistance);
_dragPoint = new Vector3(transform.position.x, dragY, transform.position.z);
}
public void ActiveShine()
{
_sprite.material.SetFloat(ShineFade, 1);
}
#region 交互限制相关
public bool IsActive => _engineSystem.isPullActive;
public bool IsAvailable => _engineSystem.isAvailable;
public GameObject GetGameObject()
{
return gameObject;
}
#endregion
}
}