본문 바로가기
게임 개발/유니티

[ 유니티로 만들기 ]레인즈 (reigns) 게임 처럼 카드를 좌,우로 움직여서 선택지 고르기

by 티토로 2023. 6. 19.

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

public enum e_CardPosition    // 현재 카드가 가운데인지 왼쪽,오른쪽인지 나타는 enum
{
    Center,
    Left,
    Right,
}

public class CS_UI_Card : MonoBehaviour, IPointerDownHandler, IDragHandler, IEndDragHandler
{
    private RectTransform cardRectTransform;
    private Vector2 dragStartPosition;
    private Vector2 previousDragPosition;

    //Vector2 targetLocation;
    float targetLocationX;

    public float rotationSpeed = -0.1f;
    public float maxRotationAngle = 45f;

    public Animator anim_Selection

TextSlide;
    public e_CardPosition current_CardPosition;

    public Animator anim;

    private void Awake()
    {
        cardRectTransform = GetComponent<RectTransform>();
    }


    private void Update()
    {
        // 카드 위치와 회전 
        targetLocationX = Mathf.Clamp(targetLocationX, -120f, 120f);  // 최소, 최대 값 지정
        cardRectTransform.anchoredPosition = new Vector2(Mathf.Lerp(cardRectTransform.anchoredPosition.x , targetLocationX, Time.deltaTime * 10.0f) , 0f);  // lerp로 해야 손떨림이 안 느껴짐
        cardRectTransform.rotation = Quaternion.Euler(0f, 0f, cardRectTransform.anchoredPosition.x * rotationSpeed);  // 카드가 좌,우로 이동한 만큼 z축 기준으로 기울여서 줌
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        dragStartPosition = eventData.position;
        previousDragPosition = eventData.position;
    }

    public void OnDrag(PointerEventData eventData)
    {
        Vector2 currentDragPosition = eventData.position;
        Vector2 dragDelta = currentDragPosition - previousDragPosition;

        // 카드 이동
        float movementX = dragDelta.x;
        float movementZ = dragDelta.y;

        targetLocationX += movementX;       // 타겟 로케이션만 드래그에서 계산하고 실제 움직임은 업데이트에서 처리

        previousDragPosition = currentDragPosition;

        e_CardPosition new_CardPosition;

        if(targetLocationX < -50)
        {
            new_CardPosition = e_CardPosition.Left;
        }
        else if (targetLocationX > 50)
        {
            new_CardPosition = e_CardPosition.Right;
        }
        else
        {
            new_CardPosition = e_CardPosition.Center;
        }

        if(new_CardPosition != current_CardPosition)    // 카드 위치가 변경 되었다면
        {
            if(!CS_Card_Controller.Card_Controller.choice_L.isDefaultChoice)
            {
                switch (new_CardPosition)
                {
                    case e_CardPosition.Center:
                        // anim_SelectionTextSlide.Play("Idle", -1, 0f);   // 선택지 숨김 애니메이션
                        break;
                    case e_CardPosition.Left:
                        // anim_SelectionTextSlide.Play("Right", -1, 0f);  // 오른쪽 선택지 표시 애니메이션
                        break;
                    case e_CardPosition.Right:
                        // anim_SelectionTextSlide.Play("Left", -1, 0f);   // 왼쪽 선택지 표시 애니메이션
                        break;
                }
            }
            current_CardPosition = new_CardPosition;
        }
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        // 드래그 종료 시 필요한 작업을 수행할 수 있습니다.

        switch (current_CardPosition)
        {
            case e_CardPosition.Center:
                // 가운데 선택되었을 때 처리
                targetLocationX = 0f;
                anim_SelectionTextSlide.Play("Idle", -1, 0f);
                break;

            case e_CardPosition.Left:               
                // 왼쪽 선택 되었을 때 처리
                cardRectTransform.anchoredPosition = Vector2.zero;
                cardRectTransform.rotation = Quaternion.Euler(0f, 0f, 0f);
                break;
            case e_CardPosition.Right:
                // 오른쪽 선택 되었을 때 처리
                cardRectTransform.anchoredPosition = Vector2.zero;
                cardRectTransform.rotation = Quaternion.Euler(0f, 0f, 0f);
                break;
        }


    }
}

 

ReignsCardDrag.cs
0.00MB

 

 

반응형