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(); _engineSystem = transform.parent.GetComponent(); _sprite = GetComponent(); _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.z); } 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 } }