본문 바로가기
Unity

[Unity] 오브젝트 Drag & Drop

by Kyoung2 2022. 6. 2.
반응형

2D에서 3D 콘텐츠를 드래그 앤 드랍하는 기능을 따로 만들어 보았다.

 

 

오브젝트를 드래그 & 드롭하는 기능

 

Scene을 생성하고 Object를 생성한다.

테스트를 위해 정중앙에 위치하도록 했다.
충돌을 감지하기 위한 Box Collider를 삽입했다. Tag는 Charactoer로 변경하여 준다.

 

Hierachy 창에서 빈 게임오브젝트를 생성하여 DragAndDropController라는 이름으로 생성해준다.

이름은 각자 간단하게 작성하면 된다.

Project 창에서 CharacterController.cs 파일을 생성하여 준다.

 

CharacterController.cs 파일 생성

 

소스코드

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CharacterController : MonoBehaviour
{
    private float dist; // Distance 
    private bool dragging = false;  //Drag 모션 Flag
    private Vector3 offset;  //오프셋
    private Transform toDrag;  //현재 위치 저장 변수

    public GameObject hitObj; // 감지 오브젝트

    void Update()
    {

        Vector3 vec;  // 지역 변수 Vector3
        if(Input.touchCount != 1) // 터치된 손가락의 수가 1가 아니면 
        {
            dragging = false; // Drag 모션 false
            return;  
        }

        Touch touch = Input.touches[0]; //입력된 Touch 수
        Vector3 pos = touch.position;  // 터치된 위치 값 저장

        if (touch.phase == TouchPhase.Began) // 터치 상태가 입력이 되었을때,
        {
            Ray ray = Camera.main.ScreenPointToRay(pos); // 스크린에 터치된 위치에 광선을 쏜다!
            RaycastHit hit; // Hit 지역 변수

            if (Physics.Raycast(ray, out hit)) // Hit 된 오브젝트 
            {
                if (hit.collider.gameObject.tag == "Character") // Character 태그가 붙어있는 오브젝트일때.
                {
                    hitObj = hit.transform.gameObject; // hitObj 변수에 hit 된 오브젝트를 담는다.
                    toDrag = hitObj.transform; // 현재 위치 저장
                    hitObj.GetComponent<Animator>().SetBool("Attack", true); // 캐릭터의 애니메이션 실행
                    dist = hit.transform.position.z - Camera.main.transform.position.z;  //Z 축에 대한 위치 계산
                    vec = new Vector3(pos.x, pos.y, dist);   
                    vec = Camera.main.ScreenToWorldPoint(vec);
                    offset = toDrag.position - vec;  현재 위치를 오프셋에 저장
                    dragging = true; // Drag 모드가 참
                }
            }

        }
        if(dragging && touch.phase == TouchPhase.Moved ) // 터치 상태가 움직일 때,
        {
            vec = new Vector3(Input.mousePosition.x, Input.mousePosition.y,dist);
            vec = Camera.main.ScreenToWorldPoint(vec);
            toDrag.position = vec + offset;
        }

        if(dragging && (touch.phase == TouchPhase.Ended || touch.phase == TouchPhase.Canceled)) // 터치 상태가 취소되거나, 끝났을 때
        {
            if (dragging == true) // 현재 상태가 Drag 상태이면
            {
                hitObj.GetComponent<Animator>().SetBool("Jump", true); // 캐릭터 애니메이션 실행
            }
            dragging = false; // Drag 는 false로 바꾼다.
            
            hitObj = null; // Hit 되었던 오브젝트 변수를 비워준다.
        }
    }
}

 

CharcterController.cs 파일을 DragAndDropController 오브젝트 컴포넌트에 삽입하여 준다.

 

 

모바일에서 확인하려면 File > BuildSettings > Platform  을 Android & IOS로 변경하여 빌드하여준다.

 

실행 화면

 

 

728x90
반응형

# 로딩 화면 동작 코드(Code) 설정하기
loading