Я реализую функцию перетаскивания для своей игры Unity, и мне трудно установить границы перетаскивания. Это мой код OnDrag.
private Canvas canvas;
private Vector2 pos;
public void OnDrag(PointerEventData eventData)
{
Debug.Log("OnDrag");
RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas.transform as RectTransform, Input.mousePosition, canvas.worldCamera, out pos);
Vector3 draggablePos = draggableObject.transform.position;
transform.position = canvas.transform.TransformPoint(pos);
if (draggablePos.x <= -2)
{
print("outofbound");
draggablePos.x = -2;
}
if (draggablePos.x >= 2)
{
print("outofbound");
draggablePos.x = 2;
}
if (draggablePos.y <= -1)
{
draggablePos.y = -1;
print("outofbound");
}
if (draggablePos.y >= 1)
{
draggablePos.y = 1;
print("outofbound");
}
}
Получение положения перетаскиваемого игрового объекта и определение того, вышел ли он за пределы, сработало, поскольку моя консоль записывала отладочное сообщение. Однако преобразование игрового объекта не было установлено в правильное положение, и, кроме сообщения отладки, других видимых эффектов выхода за пределы нет. Я пробовал гуглить, но все равно это не сработало. Вот что я сделал:
Чтобы получить более явную ссылку на мой перетаскиваемый объект, я добавил этот код. Сценарий прикрепляется к перетаскиваемому объекту.
public GameObject draggableObject;
private void Awake()
{
draggableObject = this.gameObject;
}
Чтобы получить новую позицию Vector3, я протестировал ее на Vector3.zero, но это все равно не сработало... Сообщение отладки было зарегистрировано, но позиция моего игрового объекта все еще находилась за пределами области. Код:
if (draggablePos.x <= -2)
{
print("outofbound");
draggablePos = new Vector3(0, 0, 0);
}
if (draggablePos.x >= 2)
{
print("outofbound");
draggablePos = new Vector3(0, 0, 0);
}
if (draggablePos.y <= -1)
{
draggablePos = new Vector3(0, 0, 0);
print("outofbound");
}
if (draggablePos.y >= 1)
{
draggablePos = new Vector3(0, 0, 0);
print("outofbound");
}
Как установить границы перетаскиваемого игрового объекта?





Это скрипт для привязки объекта к определенной области.
public Rect ScreenBounds;
public bool DrawBoundary;
void LateUpdate()
{
clampToBoundary();
}
private void clampToBoundary()
{
Rect boundary = ScreenBounds;
transform.position = new Vector3(
Mathf.Clamp(transform.position.x, boundary.xMin , boundary.xMax),
Mathf.Clamp(transform.position.y, boundary.yMin , boundary.yMax),
transform.position.z
);
}
void OnDrawGizmos()
{
if (!DrawBoundary)
return;
Gizmos.color = Color.cyan;
Gizmos.DrawLine(new Vector2(ScreenBounds.xMin, ScreenBounds.yMin), new Vector2(ScreenBounds.xMax, ScreenBounds.yMin));
Gizmos.DrawLine(new Vector2(ScreenBounds.xMax, ScreenBounds.yMin), new Vector2(ScreenBounds.xMax, ScreenBounds.yMax));
Gizmos.DrawLine(new Vector2(ScreenBounds.xMin, ScreenBounds.yMax), new Vector2(ScreenBounds.xMin, ScreenBounds.yMin));
Gizmos.DrawLine(new Vector2(ScreenBounds.xMax, ScreenBounds.yMax), new Vector2(ScreenBounds.xMin, ScreenBounds.yMax));
}