오브젝트 드래그
게임상에서 오브젝트를 클릭하고 드래그하는 방법을 알아보자.
우선, 가장 간단한 방법은 마우스 입력이 일어나면 마우스 포인터 위치에 raycast를 진행해 오브젝트를 찾아서 처리하는 것이다.
하지만, 다른 방법도 있다.
마우스 입력을 처리하는 인터페이스를 사용하면 된다.
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class DraggableObject : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler
{
private Vector3 startPosition;
private Camera mainCamera;
[SerializeField] private float maxPullDistance;
[SerializeField] private LineRenderer _lineRenderer;
private void Awake()
{
mainCamera = Camera.main;
}
public void OnPointerDown(PointerEventData eventData)
{
startPosition = mainCamera.ScreenToWorldPoint(
new Vector3(eventData.position.x,
eventData.position.y ,
mainCamera.WorldToScreenPoint(transform.position).z));
}
public void OnPointerUp(PointerEventData eventData)
{
throw new System.NotImplementedException();
}
public void OnDrag(PointerEventData eventData)
{
Vector3 mouseWorldPos = mainCamera.ScreenToWorldPoint(new Vector3(eventData.position.x, eventData.position.y, mainCamera.WorldToScreenPoint(transform.position).z));
Vector3 pullDirection = startPosition - mouseWorldPos;
Vector3 linePosition = Vector3.zero;
if (pullDirection.magnitude > maxPullDistance)
{
pullDirection = pullDirection.normalized * maxPullDistance;
linePosition = startPosition - pullDirection;
}
else
{
linePosition = mouseWorldPos;
}
transform.position = linePosition;
_lineRenderer.SetPosition(1, linePosition);
}
}
인터페이스의 함수를 통해 마우스 이벤트를 처리할 수 있다.
해당 인터페이스가 동작하려면 scene에 EventSystem이 있어야 하고 카메라에 Physics Raycaster 컴포넌트가 있어야 한다.