📌
개인 프로젝트에 집중하느라 TIL을 계속 미뤘다. 작업한 기간은 금, 토, 일 3일이었고 10~11시간 정도 걸린 것 같다. 먼저 내가 스스로 작성한 코드부터 정리하고 해설 영상 TIL을 이어서 작성할 예정이다.
학습 내용
1. 개인 프로젝트 발제
2. 캐릭터 이동 (with 애니메이션)
3. 캐릭터 선택 시스템
1. 개인 프로젝트 발제
2D 맵에서 캐릭터가 움직이는 등의 기능을 구현하는 게 목표였다. 시간상 강의를 10강까지만 들었어서 W/A/S/D로 움직이는 기능 말고는 보자마자 막막했다. 네? 이게 입문이라고요? 싶었음. 그래서 필수 기능은 거의 완성했지만 도전 기능은 하나도 하지 못 했다.
구현했던 필수 기능 중 어려웠던 기능을 목차로 가져왔다.
파트 별로 고민했던 부분과 핵심 로직 등을 가볍게 정리해보겠다.
2. 캐릭터 이동
✅ 구현 방법
인풋시스템( InputSystem)을 사용해 w/a/s/d 키로 상하좌우 이동 기능을 구현했다.
시간이 되면 Run, Jump 도 만들어보고 싶어서 저렇게 구성했지만 결국 Walk 만 작업했다.
여기서 핵심 포인트는 input action를 컨포넌트로 생성했다고 플레이어가 움직이는 게 아니라는 것이다. input action은 asset일 뿐이고 이 asset을 스크립트로 가져와서 어떻게 실행할 것인지 코드로 작성해줘야 한다!
input action 을 받아온 플레이어의 인스펙터 창에서 Behavior 아래에 OnWalk, OnLook 등으로 내가 만들었던 액션이 함수로 생성된 것을 확인할 수 있다.
public class PlayerInputController : TopDownController
{
public void OnWalk(InputValue value)
{
Vector2 moveInput = value.Get<Vector2>().normalized;
이 함수를 스크립트로 가져온 형태이다. 여기서 InputValue value 는 walk 액션에서 지정했던 키값(value), 즉 w/a/s/d를 입력 받았을 때 해당 함수를 실행하겠다는 의미이다. 이런 식으로 액션 함수를 스크립트에서 실행해주는 과정이 꼭 필요하다. 컨트롤러 스크립트는 강의 스크립트를 가져왔기 때문에 생략하겠다.
✅ 상하좌우 이동에 따라 다른 애니메이션 실행하기
과제는 쉬웠다. 똑같은 애니메이션이 멈추는 동작 없이 메인 씬에서 계속 돌아가게 하면 끝나는 작업이었다. 실제로 과제에서 줬던 에셋으로는 구현했다. 하지만 내가 쓰고 싶었던 에셋은 상하좌우로 다 다른 애니메이션이 실행되는 구조였고, 멈췄을 때와 이동할 때를 구분해야 했다.
정~말 많은 시련이 있었던 애니메이션. 최종 구현에 실패한 관계로 오류를 다 해결하고 작성할 예정이다. 아마 Q&A로 빼서 자세히 정리하지 않을까?
3. 캐릭터 선택창
스타트 씬에서 선택한 캐릭터가 게임 씬에서 생성되도록 하는 기능이다.
닉네임 정보를 받아오는 로직을 이미 짰었기 때문에 구조는 비슷했다. 캐릭터 선택 UI에서 각 캐릭터에 맞는 버튼을 클릭하면 selectChareter 값이 저장되도록 했다. 그리고 이 selectCharater 값이 female/kid/male 중 어떤 값이냐에 따라서 플레이어가 리스폰 되면 끝!
✅ 프리팹 사용
사실 과제에서 줬던 기능은 플레이어의 sprite 컴포넌트만 바꾸면 구현이 됐었다. 즉, Player 오브젝트를 하나만 나두고 그 오브젝트의 sprite 컴포넌트를 selectCharater 값에 따라 계속 변경해서 할당하면 되니까! 카메라 컨트롤러 스크립트에서도 player 오브젝트를 따라가게 해둬서 그게 편했다.
하지만 그렇게 진행하게 된다면 확장성 없는 스크립트가 될 것 같았다. 만약 캐릭터 외형 뿐만 아니라 캐릭터 별로 다른 조건을 가지고 있다면? 기본값으로 제공되는 무기가 다르거나 스탯 표시 등 오브젝트와 자식 변수가 추가될수록 이 방식은 너무 코드가 길어질 것 같았다. 더군다나 게임씬에서 캐릭터를 변경할 수 있도록 하려면 이 방식이 깔끔했다. (비록 구현하지 못 했지만...)
✅ 구현 방법
1) 캐릭터 데이터를 enum으로 정리한다.
public enum CharacterClass
{
Female, // 0
Male, // 1
Kid
}
2) 캐릭터 선택창 버튼에 할당할 함수를 만든다.
public void SelectCharacter(int characterIndex)
{
CharacterClass selectedClass;
switch (characterIndex)
{
case 0: // female
selectedClass = CharacterClass.Female;
Debug.Log("Character 1 Selected");
break;
case 1: // male
selectedClass = CharacterClass.Male;
Debug.Log("Character 2 Selected");
break;
case 2: // kid
selectedClass = CharacterClass.Kid;
Debug.Log("Character 3 Selected");
break;
default:
Debug.LogError("Invalid character index");
return;
}
GameManager.instance.SetSelectedCharacter(selectedClass);
버튼마다 개별적인 함수를 만들기 싫어서 공통 함수를 만들고 매개변수를 활용해 각 버튼에 index 값을 할당해줬다!
해당 코드는 클릭한 버튼의 index 값에 따라 캐릭터 클래스의 캐릭터를 찾아가고, 이 selectedClass 값을 게임 매니저 SetSelectedCharacter 함수로 가져오고 있다.
public class GameManager : MonoBehaviour
{
private CharacterClass selectedCharacterClass;
public void SetSelectedCharacter(CharacterClass characterClass)
{
selectedCharacterClass = characterClass;
}
public CharacterClass GetSelectedCharacter()
{
return selectedCharacterClass;
}
3) 게임씬에서 선택된 캐릭터를 불러오는 함수를 작성한다.
[SerializeField] private GameObject Male;
[SerializeField] private GameObject Female;
[SerializeField] private GameObject Kid;
private GameObject currentCharacter;
public GameObject playerPrefab;
private void SpawnCharacter()
{
CharacterClass selectedClass = GameManager.instance.GetSelectedCharacter();
switch (selectedClass)
{
case CharacterClass.Male:
currentCharacter = Instantiate(Male);
break;
case CharacterClass.Female:
currentCharacter = Instantiate(Female);
break;
case CharacterClass.Kid:
currentCharacter = Instantiate(Kid);
break;
}
각 캐릭터의 프리팹이 들어갈 자리를 변수로 선언하고 Instantiate 함수를 통해 인게임에서 생성되도록 했다. 인스펙터에 생성된 Male/Female/Kid 변수 자리에 맞는 프리팹을 드롭 앤 드롭으로 넣어주면 잘 작동한다. 게임 매니저를 통해 데이터를 가져오는 과정이 살짝 복잡하지만 이해하면 쉬운 기능이었다.
다만, 변수가 많은 게 싫어서 직접 파일을 찾아가는 함수를 쓰려고 했는데 시간상 수정을 못 했다.
📝
정말 많은 과제를 했지만 이번처럼 검색을 많은 한 건 처음이다. 코드 하나를 짜는데도 '이게 맞을까?', '더 좋은 방법이 없을까? 내가 너무 불편한 코드를 짜고 있는 건 아닐까?' 생각하면서 많은 사이트를 돌아다녔다. 내가 코딩에 대한 개념이 부족해서 내 코드에 대한 확신이 없기 때문에 더 불안했던 것 같다. (챗지피티 끊어야 하는데 너무 많이 사용했다~...)
그래도 최선을 다했기 때문에 미련 없이 제출했던 프로젝트! 타래로 참고한 사이트(자료)가 이어진다.
본문 관련
1) 캐릭터 이동 애니메이션 구현
2) 캐릭터 선택창 구현
https://yahangom.tistory.com/14
다양하게 참고할 수 있었던 자료
'[내배캠] 본 캠프 개발 학습 > 매일매일 쓰는 TIL' 카테고리의 다른 글
10월 16일 수요일 본 캠프 개발 일지 | NULL 참조 팀 프로젝트 (2) (2) | 2024.10.16 |
---|---|
10월 15일 화요일 본 캠프 개발 일지 | NULL 참조 팀 프로젝트 (2) | 2024.10.15 |
10월 10일 목요일 본 캠프 개발 일지 | Unity 개발 입문 강의 (3) | 2024.10.10 |
10월 8일 화요일 본 캠프 개발 일지 | Unity 개발 입문 강의 (9) | 2024.10.08 |
10월 7일 월요일 본 캠프 개발 일지 | Unity 개발 입문 강의 (0) | 2024.10.07 |