-
유니티 드래그앤 드롭, UI / 오브젝트 드래그앤 드롭쾌락없는 책임 (공부)/Unity 2021. 9. 8. 21:47반응형
해당 프로젝트 깃허브
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축이랑 맞춰주고 만약 범위에 벗어났다면 초기 위치로 되돌려주는 기능을 하게 됩니다.
반응형'쾌락없는 책임 (공부) > Unity' 카테고리의 다른 글
유니티 2D에서 파쿠르 기능 구현하는 일지 (0) 2021.11.24 유니티 Stopwatch로 시간 측정하기 (0) 2021.09.14 유니티 한방향 발판 만들기 - One Way Platform (0) 2021.08.05 Unity Cinemachine Confiner change - 시네머신 confiner 변경 (0) 2021.07.20 유니티 Vector2.Reflect로 오브젝트 반사하기 (입사각, 반사각) (0) 2021.07.04