using UnityEngine;
public class DragObject : MonoBehaviour
{
private bool isDragging = false;
private Vector3 offset;
private void Update()
{
if (Input.touchCount > 0)
{
Touch touch = Input.GetTouch(0);
switch (touch.phase)
{
case TouchPhase.Began:
// 터치가 시작될 때 호출됩니다.
// 드래그를 시작합니다.
isDragging = true;
// 터치한 위치와 객체의 위치 사이의 오프셋을 계산합니다.
offset = gameObject.transform.position - GetTouchWorldPosition(touch);
break;
case TouchPhase.Moved:
// 터치가 움직일 때 호출됩니다.
if (isDragging)
{
// 드래그 중인 경우, 객체의 위치를 터치 포지션으로 업데이트합니다.
transform.position = GetTouchWorldPosition(touch) + offset;
}
break;
case TouchPhase.Ended:
case TouchPhase.Canceled:
// 터치가 끝날 때 호출됩니다.
// 드래그를 중지합니다.
isDragging = false;
break;
}
}
}
private Vector3 GetTouchWorldPosition(Touch touch)
{
// 터치 포지션을 스크린 좌표에서 월드 좌표로 변환합니다.
Vector3 touchPosition = touch.position;
touchPosition.z = -Camera.main.transform.position.z;
return Camera.main.ScreenToWorldPoint(touchPosition);
}
}
- 개선 코드 -
using UnityEngine;
public class DragObject : MonoBehaviour
{
private bool isDragging = false;
private Vector3 offset;
private void Update()
{
if (Input.touchCount > 0)
{
Touch touch = Input.GetTouch(0);
switch (touch.phase)
{
case TouchPhase.Began:
// 터치가 시작될 때 호출됩니다.
// 드래그를 시작합니다.
if (IsTouchingObject(touch))
{
isDragging = true;
// 터치한 위치와 객체의 위치 사이의 오프셋을 계산합니다.
offset = gameObject.transform.position - GetTouchWorldPosition(touch);
}
break;
case TouchPhase.Moved:
// 터치가 움직일 때 호출됩니다.
if (isDragging)
{
// 드래그 중인 경우, 객체의 위치를 터치 포지션으로 업데이트합니다.
transform.position = GetTouchWorldPosition(touch) + offset;
}
break;
case TouchPhase.Ended:
case TouchPhase.Canceled:
// 터치가 끝날 때 호출됩니다.
// 드래그를 중지합니다.
isDragging = false;
break;
}
}
}
private bool IsTouchingObject(Touch touch)
{
// 터치한 위치에 객체가 있는지 확인합니다.
Vector3 touchPosition = GetTouchWorldPosition(touch);
Collider2D collider = Physics2D.OverlapPoint(touchPosition);
return (collider != null && collider.gameObject == gameObject);
}
private Vector3 GetTouchWorldPosition(Touch touch)
{
// 터치 포지션을 스크린 좌표에서 월드 좌표로 변환합니다.
Vector3 touchPosition = touch.position;
touchPosition.z = -Camera.main.transform.position.z;
return Camera.main.ScreenToWorldPoint(touchPosition);
}
}