쾌락없는 책임 (공부)/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축이랑 맞춰주고 만약 범위에 벗어났다면 초기 위치로 되돌려주는 기능을 하게 됩니다.
반응형