티스토리 뷰

오늘은 Unity에서 게임 오브젝트를 클릭 해서 옮길 수 있는 Drag&Drop에 대해서 배워볼 예정이다

(출처: https://blog.naver.com/yd7210/220656440400)

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 (현재위치, 목표위치, 속도)

: 어떤 물체를 현재위치에서 목표위치까지 정해진 속도로 이동시킨다.

 


참고싸이트

https://youtu.be/Tv82HIvKcZQ

 

728x90
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함