상세 컨텐츠

본문 제목

Unity Drag Move

카테고리 없음

by 한국인맛집 2023. 7. 6. 17:23

본문

반응형
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);
    }
}
반응형