쾌락없는 책임 (공부)/Unity

유니티 드래그앤 드롭, UI / 오브젝트 드래그앤 드롭

허스크 2021. 9. 8. 21:47
반응형

해당 프로젝트 깃허브

 

GitHub - JangHanjun/UnityPractice: 각종 유니티 기능들 실험하는 곳

각종 유니티 기능들 실험하는 곳. Contribute to JangHanjun/UnityPractice development by creating an account on GitHub.

github.com

 

UI 드래그 앤 드롭

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

public class DragAndDrop : MonoBehaviour, IPointerDownHandler, IBeginDragHandler, IEndDragHandler, IDragHandler, IDropHandler
{

    RectTransform rectTransform;
    CanvasGroup canvasGroup;
    [SerializeField] Canvas canvas;
    private void Awake() 
    {
        rectTransform = GetComponent<RectTransform>();
        canvasGroup = GetComponent<CanvasGroup>();
    }


    public void OnBeginDrag(PointerEventData eventData)
    {
        canvasGroup.alpha = .6f;
        canvasGroup.blocksRaycasts = false;
    }

    public void OnDrag(PointerEventData eventData)
    {
        // 이전 이동과 비교해서 얼마나 이동했는지를 보여줌
        // 캔버스의 스케일과 맞춰야 하기 때문에
        rectTransform.anchoredPosition += eventData.delta / canvas.scaleFactor;
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        canvasGroup.alpha = 1f;
        canvasGroup.blocksRaycasts = true;
    }

    public void OnPointerDown(PointerEventData eventData)
    {

    }

    public void OnDrop(PointerEventData eventData)
    {

    }
}

 전체적으로 각종 클래스들을 상속받아서 사용을 하게 됩니다. 코드만 잘 본다면 크게 어렵지 않은 기능이었습니다.

 

 

오브젝트 드래그 앤 드롭

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

public class DragAndDropItem : MonoBehaviour
{
    [SerializeField] SpriteRenderer spriteRenderer;
    public Vector3 LoadedPos;
    float startPosx;
    float startPosY;
    bool isBeingHeld = false;
    public bool isInLine;
    float timelinePosY;

    private void Start() 
    {
        LoadedPos = this.transform.position; 
    }
    private void Update() 
    {
        if(isBeingHeld)
        {
            Vector2 mousePos;
            mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);

            this.gameObject.transform.position = new Vector2(mousePos.x - startPosx, mousePos.y - startPosY);
        }
    }


    #region 마우스 드래그앤 드롭



    private void OnMouseDown() 
    {
        if(Input.GetMouseButtonDown(0))
        {

            spriteRenderer.color = new Color(1f, 1f, 1f, .5f);
            Vector3 mousePos;
            mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);


            startPosx = mousePos.x - this.transform.position.x;
            startPosY = mousePos.y - this.transform.position.y;


            isBeingHeld = true;

        }
    }

    private void OnMouseUp() 
    {
        spriteRenderer.color = new Color(1f, 1f, 1f, 1f);
        isBeingHeld = false;

        if(isInLine)
            this.gameObject.transform.position = new Vector3(this.gameObject.transform.localPosition.x, timelinePosY, -1f);
        else 
            this.gameObject.transform.position = LoadedPos;
    }



    #endregion
    
    
    #region 타임라인이랑 맞는지
    
    private void OnTriggerEnter2D(Collider2D other) 
    {
        if(other.CompareTag("TimeLine"))
        {
            isInLine = true;
            timelinePosY = other.transform.position.y;
        }
    }

    private void OnTriggerExit2D(Collider2D other) 
    {
        if(other.CompareTag("TimeLine"))
        {
            isInLine = false;
        }
    }


    #endregion
}

위 코드를 사용하면 TimeLine 태그가 붙은 Trigger 오브젝트들의 y축이랑 맞춰주고 만약 범위에 벗어났다면 초기 위치로 되돌려주는 기능을 하게 됩니다.

반응형