캐릭터 선택 시스템
말 그대로 캐릭터 선택입니다. 이름 입력은 PlayerPrefs로 저장해서 가져올 수 있어서
어렵다고 느껴지지는 않았지만 그 다음인 캐릭터를 선택하는 것은 어떻게 해야할지 고민이 있었습니다.
일단 저는 캐릭터를 만드는 씬과 게임이 진행되는 씬을 나눴습니다.
이것을 만들 때 참고한 영상이 있습니다. [유니티] 캐릭터 선택창을 만들었다!_Dev GomDol
이 영상처럼 진행을 했습니다.순서는 다음과 같습니다.
이 매니저는 플레이어가 고른 캐릭터를 enum형태로 저장해서 DontDestroyOnLoad로 씬이 넘어가도 값을 가지고 있어서``` public enum Character { knight, penguin } public class DataManager : MonoBehaviour { public static DataManager i; public Character currentCharacter; // Start is called before the first frame update void Start() { i = this; DontDestroyOnLoad(gameObject); } }
이렇게 펭귄이나 기사를 고르면 DataManager에 고른 것의 enum값을 저장하고 고른 캐릭터를 캐릭터 선택 창 밖에 노란색public class SelectChar : MonoBehaviour { public GameObject ChooseChar; public GameObject Penguin; public GameObject Knight; private Vector3 playerPos = Vector3.zero; public void OpenPanel() { ChooseChar.SetActive(true); // 캐릭터를 고르는 창 } private void SelectCharacter(Character selectedCharacter) { DataManager.i.currentCharacter = selectedCharacter; ChooseChar.SetActive(false); Penguin.SetActive(selectedCharacter == Character.penguin); Knight.SetActive(selectedCharacter == Character.knight); } public void OnPenguinSelect() { SelectCharacter(Character.penguin); } public void OnKnightSelect() { SelectCharacter(Character.knight); } }
NPC 대화
두 번째로 어려웠던 것은 NPC와 대화를 하는 것인데 여러 사람들이 만들어본 것들을 많이 참고 했던것 같습니다.
참고한 사이트 : npc와 대화 시스템 구현
public class OpenTalkBtn : MonoBehaviour { public Transform player; // player Transform public GameObject TalkBtn; // 대화 버튼 public GameObject Panel; public float activationDistance = 7f; // 대화 버튼을 활성화할 거리 [SerializeField] DialogueContainer dialogue; private void Update() { player = gameManager.I.player.transform; // 플레이어와 튜터 간의 거리 계산 float distance = Vector3.Distance(transform.position, player.position); // 거리가 일정 거리 이내인 경우 대화 버튼을 활성화 if (distance <= activationDistance && !Panel.activeSelf) { TalkBtn.gameObject.SetActive(true); } else { TalkBtn.gameObject.SetActive(false); } } public void Show() { TalkBtn.SetActive(false); Panel.SetActive(true); gameManager.I.isMoveBlocked = true; gameManager.I.dialogueController.Initialize(dialogue); } }
이 컨트롤러는 대화걸기버튼을 누르면public class DialogueController : MonoBehaviour { [SerializeField] TMP_Text targetText; [SerializeField] TMP_Text nameText; [SerializeField] Image portrait; [SerializeField] Actor NPC; DialogueContainer currentDialogue; int currentTextLine; // Update is called once per frame void Update() { if (Input.GetMouseButtonDown(0)) { PushText(); } } private void PushText() { currentTextLine += 1; if (currentTextLine >= currentDialogue.line.Count) { Conclude(); } else { targetText.text = currentDialogue.line[currentTextLine]; } } public void Initialize(DialogueContainer dialogueContainer) { currentDialogue = dialogueContainer; currentTextLine = 0; targetText.text = currentDialogue.line[currentTextLine]; nameText.text = NPC.Name; portrait.sprite = NPC.portrait; } private void Conclude() { gameManager.I.isMoveBlocked = false; gameObject.SetActive(false); } }
스크립터블 오브젝트의 활용 방법과
캐릭터의 데이터를 저장해서 DontDestroyOnLoad로 데이터를 넘기는 방법 등
여러 방법들을 알아보고 좋아 보이는 방법들을 많이 활용해야 겠다고 생각했습니다.
개인 과제는 끝났고 내일부터 팀 프로젝트의 시작이므로 첫날 발제를 듣고 팀원들과
열심히 기획을 해서 완성도 높은 게임을 만들어 보고 싶습니다.
09:00 ~ 10:00 : 알고리즘 코드카타
10:00 ~ 10:30 : 팀 회의
10:30 ~ 14:00 :
12시-1시: 점심식사
14:00 ~ 18:00
6시-7시: 저녁식사
19:00 ~ 20:00 : 집중 코딩 시간 부족한 부분 해결해보기
20:00 ~ 21:00: TIL 작성, 마무리 회고 진행
21:00 : 내일은 위한 휴식!