Почему мой ScreenHandler не обрабатывает клики-драги?C#

Место общения программистов C#
Ответить
Anonymous
 Почему мой ScreenHandler не обрабатывает клики-драги?

Сообщение Anonymous »

Я пытаюсь создать в игре кликабельный экран, и у меня есть его обрабатывать перевод в нужную точку на экране, за исключением того, что перетаскивание и клики не всегда обрабатываются правильно, как и в том, что нажимают, работают нормально, но ползунки даже не выбирают вообще, и я не знаю и не знаю, с чего начинать для реализации пари. Вот мой сценарий. < /P>
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.InputSystem;
using UnityEngine.UI;

public class ScreenHandler : MonoBehaviour
{
public Camera mainCamera;
public Camera uiCamera;
public Canvas uiCanvas;
public float dragThreshold = 5f;
public RenderTexture renderTexture;
private Vector2 mousePosition;
private GraphicRaycaster raycaster;
private bool dragging = false;
private GameObject target;
private PointerEventData dragData;

private Vector2 uiStartPos;
private Vector2 currentUIPos;

void Awake()
{
if (uiCanvas != null)
{
raycaster = uiCanvas.GetComponent();
if (raycaster == null)
{
raycaster = uiCanvas.gameObject.AddComponent();
}
}
}

public bool CheckForInteractable(GameObject obj)
{
if (obj == null)
{
return false;
}
bool b = false;
// Check for Button component
if (obj.GetComponent() != null) { b = true; }
if (obj.GetComponent() != null) { b = true; }
if (obj.GetComponent() != null) { b = true; }
return b;
}

public void Click(InputAction.CallbackContext context)
{
if (context.performed)
{
Ray ray = mainCamera.ScreenPointToRay(mousePosition);
if (Physics.Raycast(ray, out RaycastHit hit))
{
if (hit.collider.gameObject == gameObject)
{
Vector2 uv = hit.textureCoord;
Vector2 pix = new Vector2(
uv.x * renderTexture.width,
uv.y * renderTexture.height
);

// Store UI coordinates for consistent tracking
uiStartPos = pix;
currentUIPos = pix;

PointerEventData pointerData = new PointerEventData(EventSystem.current)
{
position = pix
};

var results = new System.Collections.Generic.List();
raycaster.Raycast(pointerData, results);

if (results.Count > 0)
{
for (int i = 0; i < results.Count; i++)
{
if (CheckForInteractable(results.gameObject))
{
target = results.gameObject;
break;
}
}

if (target != null)
{
dragData = new PointerEventData(EventSystem.current)
{
position = pix,
pressPosition = pix, // Important for sliders
delta = Vector2.zero
};

// Start with pointer down event
ExecuteEvents.Execute(target, dragData, ExecuteEvents.pointerEnterHandler);
ExecuteEvents.Execute(target, dragData, ExecuteEvents.pointerDownHandler);
}
}
}
}
}
else if (context.canceled)
{
if (target != null)
{
if (dragging)
{
ExecuteEvents.Execute(target, dragData, ExecuteEvents.endDragHandler);
}
else
{
ExecuteEvents.Execute(target, dragData, ExecuteEvents.pointerClickHandler);
}

ExecuteEvents.Execute(target, dragData, ExecuteEvents.pointerUpHandler);
}

// Reset state
dragData = null;
dragging = false;
target = null;
}
}

public void MouseMove(InputAction.CallbackContext context)
{
if (context.performed)
{
mousePosition = context.ReadValue();

// Update current UI position
Ray ray = mainCamera.ScreenPointToRay(mousePosition);
if (Physics.Raycast(ray, out RaycastHit hit))
{
if (hit.collider.gameObject == gameObject)
{
Vector2 uv = hit.textureCoord;
currentUIPos = new Vector2(uv.x * renderTexture.width, uv.y * renderTexture.height);
}
}

if (target != null && !dragging)
{
// Use UI coordinates for drag threshold
float distance = Vector2.Distance(currentUIPos, uiStartPos);
if (distance > dragThreshold)
{
dragging = true;
ExecuteEvents.Execute(target, dragData, ExecuteEvents.beginDragHandler);
}
}

if (target != null && dragData != null)
{
// Always update position and delta for proper slider behavior
Vector2 previousPos = dragData.position;
dragData.position = currentUIPos;
dragData.delta = currentUIPos - previousPos;

if (dragging)
{
ExecuteEvents.Execute(target, dragData, ExecuteEvents.dragHandler);
}
}
}
}
}
< /code>
Я попытался изменить обработчик, чтобы увидеть, обнаруживает ли Raycast рукоятку слайдера, и вместо того, чтобы ничего не делать, он просто набирает максимальное значение независимо от того, перетаскиваю ли я или где. Сценарий как-просто игнорирует ползунки. Ошибки не бросаются, обнаружение перетаскивания работает нормально, кажется, что это проблема с событиями, и я не знаю, что делать.

Подробнее здесь: https://stackoverflow.com/questions/797 ... -correctly
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»