TIL(Today I Learned)

Unity로 체스 만들기 외 - TIL#3

Najdorf 2023. 12. 26. 21:54
728x90

오늘 꽤 많은 걸 공부했다.

 

 

1. TIL 작성 방법

 

 

TIL(Today I Learned), 개발일지를 작성할 때 가장 중요한 것은

꾸준히 매일같이 남기는 것이라고 배웠다.

 

처음부터 세부적인 사항을 추가하며 쓰기엔 지치기에, 

하루하루 내용이 간단하더라도 작성하는 것에 의의를 두고 꾸준히 써 내려가다 보면,

그제서야 내용을 꾸미는 것에 여유가 생기고 할 수 있다고 배우게 되었다.

 

개발 일지 작성은 마치 언어공부와도 같다는 생각이 들었다.

 

언어를 배우기 위해 가장 중요한 것은 '매일' 하는 것이다.

한 달 간 집중적으로 외국어 실력을 늘렸다고 해서

그 이후 흥미를 잃고 손을 떼버린다면

다시 시작했을 때 언어를 시작하지 않은 여타 다른 사람과 엇비슷한 상태가 되어버린다.

 

TIL도 이처럼 매일 습관을 붙여서 써 가는 것이 가장 중요하다는 생각이 들었다.

 

그리고 가장 중요한 TIL 내용은 '문제 해결을 어떻게 했는지' 라고 배웠다.

앞으로 문제가 생기면 머리를 싸매고 해결하려고 노력하는 것도 중요하지만

항상 TIL을 꾸준히 써서 기록을 꼼꼼히 하도록 하자...

 

 

2. findRtan(4주차 르탄이 찾기 카드게임)에 게임 재시작 버튼 추가

 

 

르탄이 찾기 카드 게임을 복습을 하고 있는데, 

게임 오버가 되었을 때 말고, 즉시 게임을 다시 시작하고 싶을 때가 있었다.

 

그런데 배운 대로만 만들면 르탄이 찾기 게임엔 그런 기능은 존재하지 않는다.

그래서 재시작 버튼을 만들어 해당 기능을 간단히 추가해보면 좋겠다고 생각했다.

 

기능을 추가하는 것을 전혀 어렵지 않았다.

재시작하는 기능 자체로는 게임이 끝났을 때 'endTxt'를 클릭했을 때 Scene을 다시 로드하기만 하면 끝이니까.

 

하지만, 이렇게 기능만 추가해서 끝내면 재미가 없다.

그래서 직접 버튼을 디자인해보기로 생각하고 구글링으로 관련 정보를 찾아봤다.

Pixilart 에서 만든 다시시작 버튼

 

평소에도 내가 게임을 디자인해야만 한다면 도트를 찍어서 디자인 하고 싶었다.

새로고침 버튼이야 인터넷 상에 널려있는 이미지 중 (저작권 없는) 아무거나 가져와서 소스로 써도 되지만,

간단한 버튼 정도야 게임에 어울리게 내가 만들 수 있지 않을까? 라고 생각이 들었고

마침 평소에도 도트를 찍어보고 싶어서 시도를 하게 되었다.

 

Pixilart를 비롯해 여러 도트 앱이나 사이트가 있지만,

가장 무난한 곳을 선택해서 시도해봤다. 좋은 시도였던 것 같다. (광고가 많아서 짜증났음.)

 

차후 레벨 기능을 만들어서 레벨이 오르면 중간에 카드가 섞이는? 기능을 만들어도 재미있을 듯 하다.

 

 

3. Unity로 체스 만들기

참고 영상: https://youtube.com/playlist?list=PLXV-vjyZiT4b7WGjgiqMy422AVyMaigl1&si=QzdOJMrIlyOpo9XE

 

오늘 Unity 엔진으로 개발한 체스 게임.

 

르탄이 카드 맞추기 게임을 만지작 거리다가, 본격적인 게임을 만들고 싶다는 생각이 들었다.

그래서 어떤 게임을 만들까? 라는 고민을 하던 중, 결국 모든 게임의 근본은 체스가 아닐까? 싶어서

Unity로 체스부터 구현해보자 마음 먹었다.

 

프로젝트를 생성하고 처음부터 구현하기 위해 애를 썼는데, 내가 Unity에 대해 완벽히 알고 있는 것도 아니고 다양한 함수의 기능을 잘 숙지를 못한 상태이기 때문에 혼자 생각해서 만들다간 10년은 늙을 것만 같았다.

 

그래서 구글링을 하다,

마침 좋은 강좌 영상이 있길래 참고해서 체스 게임을 구현해봤다.

(이미지는 lichess.org 공식 github의 소스를 사용함)

 

 

체스 게임을 따라 만들며 가장 크게 느낀 점은,

스크립트를 작성하다 어떤 필요한 기능의 함수가 있으면

평소대로라면 그 기능을 수행하는 함수를 완벽하게 정의를 한 뒤 다시 돌아와서 작성을 했지만,

빨간 줄이 뜨더라도 일단 작성하던 스크립트를 생각대로 끝마쳐 놓고,

나중에 해당 함수를 정의해도 전혀 상관 없다는 것이다.

 

오히려, 이 방법으로 스크립트를 써 내려가면,

기능 구현에 있어서 어떤 함수를 선행해서 써야 되는가? 라는 머리 아픈 고민을 할 필요 없이

계속 편하게 써 내려갈 수 있다는 것이 매우 좋은 점인 듯 싶었다.

 

나도 스크립트를 작성하는 습관을 이처럼 들이기 위해 노력해야 할 것 같다.

 

 

이 외에 기술적으로 알게 된 것들이 몇 개가 있는데,

 

enum의 선언과 사용(약간 Python의 숫자 키로만 배정되어 있는 dictionary 같았다. 숫자로 변환 가능)

배열의 선언과 사용(C#에서 배열 선언 시 차원을 명시하고 싶으면, 2차원이면 이런 식 [,]으로 선언을 한다)

그리고 항상 'UI > Image'와 '2D Sprite > Square' 등의 항목을 잘 구별해야 한다는 것이다;;

(Image 생성해놓고 있지도 않은 SpriteRenderer 컴포넌트를 불러오니깐 문제가 생기지... 2시간 고민함...)

 

이런 것들이 있다.

 

 

게임을 강의를 따라 어느 정도 구현을 했는데,

기물의 움직임이나 이를 나타내는 'MovePlate'까지는 구현을 했지만,

체스의 특수 규칙을 아직 구현을 못 했다는 것이 매우 아쉬웠다.

 

아직 구현이 덜 된 기능들이다.

  • 폰 최초의 움직임은 2칸 전진 가능.
  • 킹과 룩이 한번도 움직이지 않은 상태고 체크가 아니라면, 킹이 룩 쪽으로 2칸 움직이고 룩은 킹의 반대편으로 움직이는 특수 규칙(캐슬링)
  • 폰이 상대 진영의 마지막 행에 도착했다면 킹을 제외한 어떤 기물로도 승진 가능(프로모션)
  • 상대 폰이 앞선 첫 번째 규칙으로 원래 폰의 한 칸 움직임으로 잡을 수 있던 칸을 지나간다면, 해당 폰의 현재 위치를 무시하고 한 칸 움직인 것으로 간주하여 잡으면서 이동(앙파상)
  • 킹이 자신이 먹히는 곳으로 움직이지 못하는 규칙(일리걸 무브)
  • 같은 이유로 자신의 기물을 치웠을 때 킹이 상대방 기물에 잡혀서 움직이지 못하게 하는 규칙(일리걸 무브)
  • 체크메이트 되었을 때 게임을 종료하는 기능.
  • 시간 설정 기능.

체스 게임 자체가 어떻게 동작하는 지 직접 따라서 만들었기 때문에,

작동 로직만 신경쓰고 고민하다 보면 위의 기능도 충분히 개발할 수 있을 것이라는 생각이 든다.

 

또 하나 느낀 점은,

고작(?) 체스 게임 하나 구현하는데 스크립트 짜는데만 엄청난 시간이 소요 되었던 것으로 보아,

개발에 있어서 역할 분담협업이 얼마나 중요한 지 알 수 있었다;;

 

 

 

오늘 궁금했던 점:

Unity에서 .xml 확장자의 파일을 읽어서 파싱을 하려면? -> 나중에 필요할 것 같음

 

 

 

728x90