private void InitDragAction(DragAction dragAction, GameObject target, ClickAction mouseActionFallback) { dragIniting = true; this.dragAction = dragAction; dragInitScreenPos = Input.mousePosition; dragStartDist = target is null ? 1 : Vector3.Distance(camera.transform.position, target.transform.position); dragTarget = target; dragClickActionFallback = mouseActionFallback; }
private bool HandleDrag() { if (dragAction is null) { return(false); } if (dragIniting) { // Cancel if releases before starting drag if (!Input.GetKey(dragAction.specifiers.HasFlag(HotkeySpecifier.Secondary) ? secondaryKey : primaryKey)) { dragAction = null; if (dragClickActionFallback && dragClickActionFallback.validate(dragTarget)) { ExecuteClickAction(dragClickActionFallback, dragTarget); } return(false); } // Check if enough movement var dragDist = Vector2.Distance(dragInitScreenPos, Input.mousePosition); if (dragDist < minDragDist) { return(true); } dragIniting = false; dragAction.start(dragTarget, GetDragPosition()); } // End if released if (!Input.GetKey(dragAction.specifiers.HasFlag(HotkeySpecifier.Secondary) ? secondaryKey : primaryKey)) { dragAction.end(dragTarget, GetDragPosition()); if (!dragAction.specifiers.HasFlag(HotkeySpecifier.Persistent)) { _actions.Remove(dragAction); } dragAction = null; return(false); } dragAction.drag(dragTarget, GetDragPosition()); return(true); Vector3 GetDragPosition() => camera.transform.position + camera.ScreenPointToRay(Input.mousePosition).direction *dragStartDist; }