[Unity]TIL (33) | 2023.09.07 | 유니티 게더처럼 만들어보기

kjg5370·2023년 9월 7일
0

TIL

목록 보기
33/91
post-thumbnail

들어가기 앞서

오늘 개인과제 해설이 끝나고 개인과제도 제출을 완료해서 과제를 진행하면서
어려웠던 부분이나 기억하고 싶은 부분들을 적어보려고 합니다.

오늘 배운 것

  • 캐릭터 선택 시스템

    말 그대로 캐릭터 선택입니다. 이름 입력은 PlayerPrefs로 저장해서 가져올 수 있어서
    어렵다고 느껴지지는 않았지만 그 다음인 캐릭터를 선택하는 것은 어떻게 해야할지 고민이 있었습니다.
    일단 저는 캐릭터를 만드는 씬과 게임이 진행되는 씬을 나눴습니다.
    이것을 만들 때 참고한 영상이 있습니다. [유니티] 캐릭터 선택창을 만들었다!_Dev GomDol
    이 영상처럼 진행을 했습니다.순서는 다음과 같습니다.

    1. 게임이 진행 될 MainScene과 별개로 캐릭터 세팅을 하는 Scene 만들기

      일단 기능은 없지만 이런식으로 화면을 꾸몄습니다.
    2. DataManager 스크립트 생성
      빈 오브젝트로 DataManager를 만들어서 DataManager스크립트를 생성하여 넣어줍니다.
    • DataManager.CS
      ```
      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);
          }
      
      }
      이 매니저는 플레이어가 고른 캐릭터를 enum형태로 저장해서 DontDestroyOnLoad로 씬이 넘어가도 값을 가지고 있어서
      이 값을 MainScene에 있는 gameManager에게 전달해 값에 맞는 캐릭터를 생성해줍니다.
    1. 캐릭터를 고르는 창 만들기
      위 화면에서 노란색 박스를 클릭하면 캐릭터를 고르는 창을 띄워야 하는데
      일단 캐릭터 고르는 창을 만듭니다.

      그리고 클릭하면 노란색 박스의 캐릭터가 바뀌도록 각 회색 박스에 버튼을 달아줍니다.
    2. 캐릭터를 고르는 스크립트
      노란색 박스에는 이미 두개의 캐릭터를 만들어두고 고른 캐릭터가 SetActive가 되도록 버튼에 할당할 코드를 짭니다
    • SelectChar.cs
      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);
          	}
      }	
      이렇게 펭귄이나 기사를 고르면 DataManager에 고른 것의 enum값을 저장하고 고른 캐릭터를 캐릭터 선택 창 밖에 노란색
      박스에 표시해줍니다.
      그리고 이름을 입력하고 join 버튼을 누르면 dataManager는 세팅 씬이 종료되고 MainScene으로 넘어가도 죽지 않고
      gameManager에게 플레이어가 고른 캐릭터의 정보를 넘겨주게 됩니다.
  • NPC 대화
    두 번째로 어려웠던 것은 NPC와 대화를 하는 것인데 여러 사람들이 만들어본 것들을 많이 참고 했던것 같습니다.
    참고한 사이트 : npc와 대화 시스템 구현

  1. NPC 만들기
    일단 대화를 할 NPC를 맵에 만들었습니다.
  1. 대화 걸기 버튼 생성
    플레이어가 가까이 가면 생기는 대화 걸기 UI를 만들고

    NPC에게 스크립트를 할당해 플레이어의 위치를 계속 받아와서 가까이오면 이 UI가 보이도록 설정했습니다.
    OpenTalkBtn.cs
    	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);
    	    }
    	}
  1. Actor와 Dialogue 스크립터블 오브젝트 생성
    위에서 참고한 사이트에 있는 코드로 스크립터블 오브젝트를 생성합니다.

  1. DialogueController 생성
    NPC의 스크립트를 생성하고 관리해 줄 DialogueController를 생성해줍니다.
    DialougeController.cs
    	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);
    	    }
    	}
    이 컨트롤러는 대화걸기버튼을 누르면

    스크립트 창을 생성하고 마우스의 왼쪽버튼을 누르면 다음 스크립트로 넘어가도록 되어있습니다. 그리고 준비된 스크립트가
    끝나면 Conclude()를 호출해 스크립트 UI를 비활성화 시킵니다.

기억 할 것 & 진행 사항

스크립터블 오브젝트의 활용 방법과
캐릭터의 데이터를 저장해서 DontDestroyOnLoad로 데이터를 넘기는 방법 등
여러 방법들을 알아보고 좋아 보이는 방법들을 많이 활용해야 겠다고 생각했습니다.

개인 과제는 끝났고 내일부터 팀 프로젝트의 시작이므로 첫날 발제를 듣고 팀원들과
열심히 기획을 해서 완성도 높은 게임을 만들어 보고 싶습니다.

내일 할 일

  • 하루 계획
    • 오전
      • 09:00 ~ 10:00 : 알고리즘 코드카타
      • 10:00 ~ 10:30 : 팀 회의
      • 10:30 ~ 14:00 :
        • 오늘 계획 (Task)
          • 팀 프로젝트 시작
      • 12시-1시: 점심식사
    • 집중 코딩
      • 14:00 ~ 18:00
    • 저녁
      • 6시-7시: 저녁식사
      • 19:00 ~ 20:00 : 집중 코딩 시간 부족한 부분 해결해보기
      • 20:00 ~ 21:00: TIL 작성, 마무리 회고 진행
      • 21:00 : 내일은 위한 휴식!
profile
학생입니다

0개의 댓글