이번글에서는 핸드플레이 버튼 기능을 만들어보려고 한다

물론 그와 함께 점수를 계산하고 저장하는 기능도 연계하여 만들 예정이다

그전에 카드를 플레이했을때 카드 위로 각각 숫자에 맞는 점수가 활성화 되었다가 사라지는 기능부터 구현해보자
2~10까지는 각 숫자에 맞게 점수가 부여되고 JQK는 10점, A는 11점을 부여받는다
그럴려면 카드 위에 각자의 숫자에 맞게 점수가 올라와야 하는데 이걸 하려면 카드의 프리팹 구조를 수정해야 한다

우선 카드 프리팹의 밑으로 캔버스와 텍스트 파일인 PointText를 만들어주었다
당연히 텍스트는 캔버스 요소이므로 캔버스가 위에 필요하고


각각 캔버스와 PointText의 Inspector창이다
우선 캔버스를 보면 Render Mode - World Space로 되어 있는데 이게 사실 가장 중요하다.
Canvas RenderMode 정리
늘 유니티를 하며 헷갈렸던 부분 중 하나. 게임 오브젝트는 인게임 요소고, 텍스트는 캔버스 요소라 둘은 완전 다른 위치에 있는데,만약 텍스트를 게임 오브젝트 요소처럼 쓰고 싶다면 어떻게
sangeun00.tistory.com
자세한건 위 글에 따로 정리해두었다. 이렇게 하면 캔버스 요소를 게임 오브젝트로
게임화면 안에서 컨트롤 할 수 있다

이제 핸드플레이 버튼 기능을 만들어보자!
버튼을 하나 만든뒤 버튼을 클릭할때 OnHandPlayButtonClick() 클릭 메서드가 실행되고
버튼을 누르면 deckManager의 HandPlay()메서드가 실행된다

핸드플레이 메서드는 다음과 같다.
우선 선택된 카드가 한장도 없다면 아무런 일이 일어나지 않아야 하기에 양쪽다 특정조건에 return을 걸어주었고
제외조건을 넘긴다면 핸드플레이 코루틴을 시작한다
카드를 위로 올리고, 점수를 차례대로 띄우고 점수를 합산한뒤 카드를 버리는 효과를 가진 코루틴은
우선 넘기겠다. 왜냐면 잠시 후 이 모든게 DOTween으로 최적화가 되어 코드가 바뀌기 때문...
이렇게 성공적으로 핸드플레이 버튼 기능이 구현되었다!
이번엔 이어서 앤티와 라운드, 그리고 핸드와 버리기 사용제한 그리고 라운드에 따른 최소 득점을 만들어보도록 하자

어떻게보면 게임의 난이도이자 스테이지의 전부인 앤티와 라운드 시스템.
어찌보면 예전에 만든 갤럭시볼의 무한모드 (스테이지, 라운드)의 개념을 보는것 같다
우선 시스템은 간단하다. 최소득점은 라운드의 값에 따라 변경되게 되고, 이걸 알아내기 위해 직접
게임을 플레이하면서 정리해본 결과
300, 450, 600, 800, 1200, 1600, 2000, 3000, 4000, 5000, 7500, 10000 ,11000, 16,500, 22000, 20000, 27,500, 35000, 35000, 52,500, 70000 ,50000, 75,000, 100000, 110000, 165,000, 220000 ,560000, 840000, 2240000, 7200000, 10800000, 14400000, 300000000, 450000000, 600000000
이게 한 라운드 당 증가하는 최소득점의 값이다.
발라트로가 한번 하는데 오래 걸리는 게임이 아니라서 다행이다..
private int[] goalPoints = { 300, 450, 600, 800, 1200, 1600, 2000, 3000, 4000, 5000, 7500, 10000, 11000, 16500, 22000, 20000, 27500, 35000, 35000, 52500, 70000, 50000, 75000, 100000, 110000, 165000, 220000, 560000, 840000, 2240000, 7200000, 10800000, 14400000, 300000000, 450000000, 600000000 };
그래서 이 수치들을 그대로 가져와 goalPoints 배열에 넣어주었고

그걸 라운드의 값에 따라 최소득점 값을 변경해주는 UpdateGoalPoint 메서드를 짜주었다


그리고 GameManager 코드에 public으로 선언한 각종 엔티와 라운드, 최소득점 변수들
이렇게 해야지 후에 게임 진행상황을 저장할때 키워드가 될 변수들을 조절하여
게임의 저장기능을 구현할 수 있다

그리고 한가지 더, trashcount와 handcount라는 변수를 각각 추가해주어
이제부터 핸드플레이나 버리기 버튼을 누를때마다 사용가능 횟수가 1씩 줄어들도록 하였다
물론 카운트가 0이되는순간 아무리 버튼을 눌러도 return으로 작동이 되지 않도록 제한을 걸어두었다
이러면 이제 핸드플레이와 버리기 횟수를 제한을 걸고 게임을 진행할 수 있다
이제 라운드에 따라 최소득점이 결정되고, 핸드나 버리기 버튼을 누를때마다 사용횟수가 줄어드는것을 볼 수 있다
여기서 이제 더 나아가 핸드가 0이 되기전 sumPoint가 최소득점을 넘기면 스테이지 클리어
핸드가 0이 되었는데 sumPoint가 최소득점을 넘기지 못했다면 게임종료가 되는것이다
마지막으로 한가지 더...현재 카드의 애니메이션을 구현하느라 너무나도 많은
코루틴이 사용되어 코드가 길어지고 최적화 부분에서도 좋지 않아지는데
DOTween (HOTween v2) | 애니메이션 도구 | Unity Asset Store
Use the DOTween (HOTween v2) tool from Demigiant on your next project. Find this & more animation tools on the Unity Asset Store.
assetstore.unity.com
사실 애니메이션 자체가 다 그렇게 어렵거나 복잡한것이 없기 때문에 DOTween을 사용하여
더 간편하게 코드길이도 줄이고, 최적화도 진행해주었다
- MoveInitialCardsCoroutine - 초기 카드 배치 애니메이션
- HandPlayCoroutine - 카드 위로 이동 애니메이션
- SuitCoroutine - 카드 정렬 애니메이션
- RankCoroutine - 카드 정렬 애니메이션
- MoveCardToPosition - 개별 카드 이동 애니메이션
크게 이 5가지의 코루틴을 없애고 전부 DOTween으로 대체해주었다
card.transform.DOMove(targetPos, moveDuration)
.SetEase(Ease.OutQuad)
.OnComplete(() =>
{
card.SetOriginalPosition(targetPos);
});
덕분에 코드가 무려 80줄 가까이 줄어들었다!
'Galaxy Card > 1. 시스템 개발' 카테고리의 다른 글
(3) 게임 클리어/오버 판정, 상점과 다음레벨 구현(임시) (2) | 2025.04.08 |
---|---|
(1) 기본 시스템 개발 - 1 (카드관리, 카드 움직임, 핸드족보, 버리기버튼) (2) | 2025.03.27 |