오늘까지 유니티 입문 주차 개인 과제를 완료했다.
내 힘으로 최대한 필수 요구 사항들을 진행해보려 했지만, 캐릭터의 스프라이트와 애니메이션을 변경하는 부분에서 막혔다... 어쩔 수 없이 튜터님의 해설 영상을 참고하여 내가 구현할 수 있는 부분들은 내가 해보려 했지만 그마저도 실패하고 거의 튜터님의 코드대로 작성할 수 밖에 없었다. 시간이 부족하여 너무 아쉽다..
SerializeField를 적극적으로 사용해도 괜찮은가? 잘 모르겠지만 사용하면 편리하긴 하다. 맨 처음엔 Unity 강의 영상처럼 GetComponent를 통해 최대한 찾아보려 했으나, 너무 코드가 어려워지고 헷갈리기 시작하여 코드를 다 뒤집어 엎고 다시 시작했다. 튜터님의 해설 영상을 보니, SerializeField를 적극적으로 사용하시길래 나도 사용했다.
SerializeField를 통해 private으로 Object를 선언하더라도 Unity의 Inspector에서 찾아 대입할 수 있게 된다.
// PopupStartMenu.cs
...
[SerializeField] private InputField inputField;
[SerializeField] private TextMeshProUGUI playerName;
[SerializeField] private Button characterSelectButton;
[SerializeField] private Image SelectedCharacter;
[SerializeField] private GameObject popupCharacterSelectMenu;
...
PopupStartMenu에서 플레이어의 캐릭터 스프라이트, 애니메이션, 이름을 변경하기 위한 코드에서 SerializeField를 통해 UI들을 지정해줄 수 있었다.
PopupStartMenu에서 플레이어가 이름, 스프라이트, 애니메이션을 변경할 수 있도록 하기 위해서 GameManager에 characterList를 만들어 characterList에서 선택한 CharacterType과 같은지 비교하는 코드를 작성했다.(튜터님이)
GameManager에서 List<Character>characterList
를 선언하여 캐릭터 클래스를 리스트로 저장하고 있다가, PopupStartMenu에서
GameManager.Instance.characterList.Find
(item => item.CharacterType == GameManager.Instance.characterType);
를 통해 선택한 characterType과 일치하는 캐릭터 클래스를 가져오는 방식이었다.
문제는, 캐릭터 클래스였다.
// Character.cs
public enum CharacterType
{
Penguin,
Dwarf
}
[Serializable]
public class Character
{
public CharacterType CharacterType;
public Sprite CharacterSprite;
public RuntimeAnimatorController CharacterAnimatorController;
}
코드에서 알 수 있듯이 Sprite, RuntimeAnimatorController를 저장해야 하는데, 코드에서 이를 처리하는 것이 매우 어려워서 시간을 많이 잡아 먹었다.
그러나 튜터님은 Serializable을 통해 클래스를 Inspector에서 저장할 수 있도록 하여 처리하셨다.
오늘은 튜터님의 강의를 살짝씩 참고하며 과제를 완성하려 했었다. 그러나 내가 너무 복잡하게 생각한 것인 것 같다. 튜터님의 해설 영상을 보니 굉장히 깔끔했다. 그리고 내가 미처 생각하지 못한 방법들을 많이 사용하셨으니, 앞으로는 이를 참고하여 응용할 수 있도록 잘 숙지하자!