IT/UNITY(C#)
(C#) UNITY_게임 오브젝트 옮기기(드래그앤드랍)
KS짱짱맨
2022. 7. 14. 15:12
오늘은 Unity에서 게임 오브젝트를 클릭 해서 옮길 수 있는 Drag&Drop에 대해서 배워볼 예정이다
1. OnMouseDrag를 이용해 기본적인 Drag & Drop 기능 구현
기본적인 기능 구현에 앞서서, object에 'collider2D' component를 넣어두자
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DragAndDrop : MonoBehavior {
private Camera cam;
void Awake(){
cam = Camera.main; // 이렇게 카메라를 지정해주는 이유는, 함수 실행마다 찾아가는 수고를 덜어 주기 위해!
}
#드래그를 하는 동안
void OnMouseDrag(){
transfrom.position = GetMousePos(); // object의 위치를 마우스 위치로 이동
}
Vector3 GetMousePos(){
#아주 중요한 부분
var mousePos = cam.ScreenToWorldPoint(Input.mousPosition);
// 현재 보여지는 화면안에서 마우스의 좌표값을 가져와 mousePos에 할당
mousePos.z = 0; // 2D이기 때문에 z값 0으로
return mousePos; // 마우스의 현제 좌표값은 반환
}
}
이렇게 되면 기본적인 이동은 가능해진다.
하지만 한가지 문제점이 발생!!!
바로 object의 정가운데를 클릭하지 않는 이상,
드래그를 하기 위해 클릭함과 동시에 object가 마우스 위치로 조금씩 움직여 버리게 된다.
그래서 ↓↓↓
2. 오브젝트 바깥을 클릭했을때, 움직이는 것 수정 (어딜 클릭해도 가만이 있게끔 하기)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DragAndDrop : MonoBehavior {
private Camera cam;
private Vector3 dragOffset; // 클릭했을때, object의 중앙좌표와과 클릭한 좌표사이의 차이
void Awake(){
cam = Camera.main;
}
#클릭 했을때
void OnMouseDown(){
dragOffset = transform.position - GetMousePos();
//object의 중앙좌표와과 클릭한 좌표사이의 차이값을 구하기
}
#드래그를 하는 동안
void OnMouseDrag(){
transfrom.position = GetMousePos() + dragOffset; //좌표차이를 상쇄해주기
}
Vector3 GetMousePos(){
var mousePos = cam.ScreenToWorldPoint(Input.mousPosition);
mousePos.z = 0;
return mousePos;
}
}
3. 드래그 속도 조절하기
이제 속도를 조절해서 천천히 따라오게끔 해보자
나중에 클릭한 좌표로 오브젝트를 이동시킬때 사용될 수 있을 것 같다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DragAndDrop : MonoBehavior {
private Camera cam;
private Vector3 dragOffset;
[SerializedField] private float speed = 10f;
// 앞에 [SerializedField]를 붙이면 inspector에서 값을 조절 할 수 있다.
void Awake(){
cam = Camera.main;
}
#클릭 했을때
void OnMouseDown(){
dragOffset = transform.position - GetMousePos();
}
#드래그를 하는 동안
void OnMouseDrag(){
transfrom.position = Vector3.MoveTowards(transform.position,
GetMousePos()+dragOffset,
speed*Time.deltaTime);
}
Vector3 GetMousePos(){
var mousePos = cam.ScreenToWorldPoint(Input.mousPosition);
mousePos.z = 0;
return mousePos;
}
}
Vector3.MoveTowards (현재위치, 목표위치, 속도)
: 어떤 물체를 현재위치에서 목표위치까지 정해진 속도로 이동시킨다.
참고싸이트
728x90