본문 바로가기

TIL

[TIL]2024-2-22 / 42일차 - 심화 주차 개인과제 제출

속마음을 대변하는 타이틀 이미지

 

1. 오늘의 알고리즘 코드카타 - 가장 가까운 글자

 

답안 :

public class Solution {
    public int[] solution(string s) {
        //s의 길이만큼 int 배열 생성
        int[] answer = new int[s.Length];
        //기본 인덱스 넘버
        int index = -1;
        
        for(int i = 0; i < s.Length; i++)
        {
            //인덱스 넘버 초기화
            index = -1;
            //이전에 i와 같은 문자가 있는지 체크하는 j
            for(int j = i - 1; j >= 0; j--)
            {
                if(s[i] == s[j])
                {
                    index = i - j;
                    break;
                }
            }
            answer[i] = index;
        }
        return answer;
    }
}

 


 

2. 작업물 설명

 

이번에는 솔직히 거의 공부하는 시간이었다.

 

https://youtu.be/dnNCVcVS6uw?si=N_LOmGJkAGlkUz-9

 

https://youtu.be/3sWTzMsmdx8?si=ek2T6qrXyxHoWgR5

 

위 두 영상을 집중적으로 보면서 기능 구현을 따라해보고자 했다. 그래플링까지는 되었으나, 아래 무브먼트는 리지드 바디와 콜라이더를 사용하지 않는 바람에 이를 어떻게 수정해서 이 둘을 사용하는 그래플링과 합칠까 하다가 시간이 다 소모되어 더미 데이터화 되었다.

 

부드러운 횡스크롤 움직임을 위해서는 참으로 생각해야 될 것이 많았다고 느껴진다.

 

아무튼 이번 과제에서 구현한 부분은 다음과 같다.

 

주요 주제 : 동적 생성 - 씬 전환, UI 생성 / 다른 강의따라서 기능 구현하는 시간

필수 요구

  1. 씬 변경
    • UI 구성
    • 시작버튼 추가
      • 시작 버튼시 씬 전환 - 메인 게임으로 이동
    1-2. 기본 기능
    • 캐릭터 이동
    • 카메라 이동
    • 방 만들기
  2. 1-1. 인트로 씬 구성

추가 요구

  • Dictionary 활용
  • Queue, Stack 활용
  • raycast
  • 오브젝트 폴링
  • Instantiate 로 오브젝트 생성

주요 코드

Managers

  • 싱글톤으로 구현된 모든 Manager를 관리할 클래스.
  • 유일하게 Monobehavior를 상속받는 Manager.
  • Managers를 통해 다른 Manager에 접근가능.
  • *(SoundManager는 급조하느라 Manager에서 관리되지 않고 별개의 풀을 사용하고 있음)
  • 하위 Manager
- UIManager - UI의 생성과 제거 - 스택
    
- ResourceManager - 리소스 폴더에 프리팹들을 생성 및 제거 (Instantiate)

- PoolManager - 오브젝트 생성 시 오브젝트 풀을 담당 - 큐 / 딕셔너리

- SceneManager - 씬의 로드에 사용 (유니티 SceneManager 네이밍과 겹쳐서 AdditionalSceneManager

- GameManager - 메인 씬의 게임 로직을 다루려고 했으나 현재 더미 데이터화

BaseScene

  • 모든 씬 요소의 부모 클래스.
  • 이벤트 시스템을 생성하고 씬 타입을 받는다.
  • 이후 개별 씬 코드에서 해당 씬에서 필요한 것들을 리소스 매니저를 통해 생성 (씬 별 UI 포함)

UI_Base

  • 모든 UI 요소의 부모 클래스.
  • Bind를 이용해 Button, Text 등을 objects에 저장할 수 있다.
  • 각 씬 별로 필요한 것들을 담은 UI 코드가 있어 씬에서 불러온다. (ex = Intro씬의 타이틀 이미지 모션)
  • 그렇기에 상단의 사진에 과제 스타트 버튼은 인스펙터 창에서 아무 기능이 없지만 UI_Intro에서 MainScene으로 넘어가는 코드가 들어있어 작동한다.
  • UI_EventHandler
    • 마우스 포인터와 클릭 감지

Util

  • 여러 곳에서 쓰일 수 있는 static 클래스
  • 현재 Define과 Utilities가 존재

Player

  • 카메라 = player = GameObject.Find("Player");를 Start()에 사용하여 생성된 플레이어를 자동으로 따라감
  • 컨트롤러 = 플레이어 자식으로 있는 groundCheck가 isGrounded = Physics2D.OverlapCircle(groundCheck.position, 0.1f, groundLayer);를 통해 바닥에 닿고 있는지 체크 (점프 제한)
  • 그래플링 = 유투브 강의를 통해 따라서 제작 해봄 - 라인 랜더러와 커브 / 스프링 조인트를 중심으로 구현 / 레이케스트를 통해 그래플 가능 여부 파악

 


3. 재미난 트러블슈팅 이야기

과제 제출을 하려던 중 과제용 폴더 이름과 개인 3D 프로젝트 폴더 명이 겹치면서 무언가 착오가 생겨 두 개의 프로젝트가 합쳐져 버리는 문제가 발생했다. 백업도 없는 대형사고가 발생하여 과제 제출 20분 전에 진짜 머리 속이 하얗게 변하였다.

 

하지만 이번 프로젝트는 동적 생성이 주제였고, 결국 잘 정리해둔 스크립트 파일들과 리소스 폴더만 빼내어 새로운 프로젝트를 만들고 그 안에 집어넣고 해당하는 명칭의 씬과 씬 스크립트만 넣어주니 바로 원래대로 작동하기 시작했다.

 

정말 동적 생성의 장점을 여실히 느끼게 해준 사건이 아닌가 한다.