TIL 0123 게임개발 입문 개인과제 - 4 / 개인 공부

강성원·2024년 1월 23일
0

TIL 오늘 배운 것

목록 보기
22/70
post-thumbnail

오늘은 유니티 입문 개인과제의 제출 날이다.

예상치 못한 강의 수준에 미루었던 과제를 어제부터 오늘까지 해서 제출했다.

강의 내용은 계속 들으며 정리하는 시간을 가져야 할 듯 싶다...ㅠㅠ

오늘 개발한 내용

플레이어의 캐릭터 선택하기

스타트 씬에서 메인 씬으로 전달할 내용이 플레이어의 이름 뿐만 아니라, RuntimeAnimatorController도 전달해야했다.

그래서 캐릭터의 정보를 어제 만들었던 싱글톤에 담아서 씬을 이동시키기로 하였다.

해설 영상에 Character 클래스를 만들어서 캐릭터를 관리하길래 그부분은 따라했다.

public enum CharacterType
{
    Knight,
    Wizard,
}

[System.Serializable]
public class Character
{
    public CharacterType Type;
    public Sprite CharacterSprite;
    public RuntimeAnimatorController AnimatorController;
}

public class GameManager : MonoBehaviour
{
    private static GameManager instance;
    public static GameManager Instance
    {
        get{return instance;}
    }

    public List<Character> characters = new List<Character>();
    public string PlayerName { get; set; }
    public Character Character { get; set; }

    private void Awake()
    {
        // instance가 비어있지 않고 현재 스크립트가 기존의 instance와 다르다면
        // => 지금 instance에 있는게 지금 스크립트랑 다르면
        if (instance != null && instance != this)
        {
            // 객체 재생성 막음
            Destroy(this);
            return;
        }

        instance = this;
        DontDestroyOnLoad(this.gameObject);
    }
}

내용이 길어질까 자세히는 적지 않지만 다른 객체에서
public Character Character { get; set; }에 메인 씬에서 사용할 Character 객체 정보를 할당해준다.

메인 씬에서는 플레이어의 정보나 애니메이터를 초기화 하는 부분에서 GameManager의 멤버만 갖다가 쓰면 된다.

오늘 공부한 내용

오늘은 유익한 공부보다는 "이거 이렇게 안되나?"싶은 내용의 의문을 해소했다.

약수의 개수와 덧셈

이 문제를 풀며 1~N까지 전부 순회하는 것은 절대 아닌 것 같은데 방법이 떠오르질 않아서 일단 풀어서 내고 방법을 찾아봤다.

using System;

public class Solution {
    public int solution(int left, int right) {
        int answer = 0;
        
        for(int i=left; i<=right; ++i)
        {
            int num = 0;
            for(int j=1; j<=i; ++j)
            {
                if(i%j == 0)
                    ++num;
            }
            
            answer += num % 2 == 0? i : -i;            
        }
        
        return answer;
    }
}

일단 1~N까지 전부 계산하는 코드이고 연산 시간은 아래와 같다.


역시 수학은 늘 정답을 제시해준다.
약수의 개수를 구하는 개념도 정리해봤다.

약수의 개수 구하는 법 정리글

이 개념을 토대로 문제를 다시 풀었다.

using System;

public class Solution {
    public int solution(int left, int right) {
        int answer = 0;
        
        for(int i=left; i<=right; ++i)
        {
            int count = 0;
            for(int j=1; j*j<=i; ++j)
            {
                if(j * j  == i)
                {
                    ++count;
                }
                else if(i % j == 0)
                {
                    count += 2;
                }
            }
            
            answer += count % 2 == 0? i : -i;            
        }
        
        return answer;
    }
}

연산 시간이 몇 배는 줄어들었다.

나중에 약수를 구하는 문제가 나온다면 꼭 이 방식으로 해결해봐야겠다.

인풋 시스템 + 이벤트 호출

이전에 강의에 나온 내용인 인풋 시스템과 이벤트 호출이 합쳐진 형태를 정리했었다.

TIL 0118 게임개발 입문 개인과제 - 1 / 인풋 시스템, 이벤트 관리, 타일맵(+충돌) 생성

코드로만 복잡하게 구성돼 있어서 그림으로 정리할 필요가 있다고 생각했고, 오늘 시간이 조금 남아서 그려봤다.
1월18일 TIL에도 다시 그림 추가해놨다.

생각보다..간단하다 ㅎㅎ 물론 인풋 시스템도 엮으면 더 복잡하겠지만 그 부분은 생략!

예전에 학교에서 프로젝트 관리론 시간에 배운 것 처럼 객체지향은 도식화하기에 좋은 것 같다.

그리고 세세한 코드의 내용은 한 번 이해하고 넘어가는 것이 좋아보이고, 이런 도식화의 형태로 남기는 것이 더 중요해보인다.

오브젝트 풀 도식화

내친김에 강의에서 설명하는 방식의 오브젝트 풀도 내가 알아보기 쉽게 도식화해봤다. (다른 이들에겐 난해할 수도..)

  • 우선 오브젝트를 모아놓는 풀(큐)와 풀을 string으로 분별해놓는 딕셔너리의 그림
  • 풀의 오브젝트를 가져다 쓰는 SpawnFromPool 메서드의 설명 그림
profile
개발은삼순이발

0개의 댓글