3 분 소요

유데미 x 스나이퍼팩토리 10주 완성 프로젝트 캠프 - 유니티 기초 학습 4주차 내용이다.

수요일 수업

image

유니런 제작

오늘은 2D게임과 좀비 게임을 다루는 시간이였다.
이번 수업은 코드마다 주석이 너무 잘 되어있는 교제를 택해서 해당 코드가 무슨 역할을 하는지 쉽게 알 수 있었다. 그래서 딱히 어려운 내용은 없었고 정리하면 유용한 내용을 정리해야겠다.

  • 싱글톤 패턴
    게임 매니저처럼 관리자 역할을 하는 오브젝트(ex 파일 매니저, 몬스터 매니저, 점수 등)는 일반적으로 프로그램에 단 하나만 존재해야 합니다(단일 오브젝트). 그리고 언제 어디서든 즉시 접근 가능해야 함.(손쉬운 접근)

싱글톤 패턴을 구현할 때는 정적 변수의 특징을 활용함.(저번에 정리한 static 키워드를 활용)
내가 기억하기로는 싱글톤 패턴의 코드가 다양했던 기억이 많은데 이 중 가장 간단한 방법을 예제에서 사용을 했다.

    void Awake() {
        // 싱글톤 변수 instance가 비어있는가?
        if (instance == null)
        {
            // instance가 비어있다면(null) 그곳에 자기 자신을 할당
            instance = this;
        }
        else
        {
            // instance에 이미 다른 GameManager 오브젝트가 할당되어 있는 경우

            // 씬에 두개 이상의 GameManager 오브젝트가 존재한다는 의미.
            // 싱글톤 오브젝트는 하나만 존재해야 하므로 자신의 게임 오브젝트를 파괴
            Debug.LogWarning("씬에 두개 이상의 게임 매니저가 존재합니다!");
            Destroy(gameObject);
        }
    }

제네릭을 사용하는 방법도 있으니 잘 확인하자 [참고 - 싱글톤 패턴] (https://wonjuri.tistory.com/entry/Unity-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%EC%8B%B1%EA%B8%80%ED%86%A4-%ED%8C%A8%ED%84%B4Singleton-Pattern)
아무래도 메모리면에서나 즉시 접근이 가능하기에 편하지만 전역이라는 특성을 가지며 단일 오브젝트이기에 잘 관리를 하며 사용을 해야한다.

  • 오브젝트 풀링
    초기에 필요한 만큼 오브젝트를 미리 만들어 ‘풀(웅덩이)’에 쌓아두는 방식
    비용이 많이 드는 Instantiate, Destroy 대신 시작 시 미리 생성을 하고 오브젝트를 활성화 비활성화를 해서 비용을 아끼는 방식이다.(총알이나 적 유닛처럼 많이 생성되고 많이 삭제되는 오브젝트에 사용)
    void Start() {
        private GameObject[] platforms; // 미리 생성한 발판들

        // 변수들을 초기화하고 사용할 발판들을 미리 생성
        platforms = new GameObject[count];
        for(int i =0; i < count; i++)
        {
            platforms[i] = Instantiate(platformPrefab, poolPosition, Quaternion.identity);
        }
        lastSpawnTime = 0f;
        timeBetSpawn = 0f;
    }

    void Update() {
        // 순서를 돌아가며 주기적으로 발판을 배치
        if (GameManager.instance.isGameover)
            return;
            
        //마지막 배치 시점에서 timeBetSpawn 이상 시간이 흘렀다면
        if(Time.time >= lastSpawnTime + timeBetSpawn)
        {
            lastSpawnTime = Time.time; //기록된 마지막 시점을 현재 시점으로 갱신
            timeBetSpawn = Random.Range(timeBetSpawnMin, timeBetSpawnMax); 
            float yPos = Random.Range(yMin, yMax);
            //사용할 현재 순번의 발판 게임 오브젝트를 비활성화하고 즉시 다시 활성화
            //이때 발판의 Platform 컴포넌트의 OnEnable 메서드가 실행됨
            platforms[currentIndex].SetActive(false);
            platforms[currentIndex].SetActive(true);
            platforms[currentIndex].transform.position = new Vector2(xPos, yPos);
            currentIndex++;
            if (currentIndex >= count)
                currentIndex = 0;
        }
    }

게임 최적화를 위해 꼭 사용해야하는 방법이니 잘 숙지해야 겠다.

좀비 게임

아직 진도를 다 나가지 않아서 배운 14장 까지 기능 설명을 적어야겠다.

  • 라이트 맵 유니티는 라이팅 데이터 에셋을 사용하여 라이팅 효과의 실시간 연산량을 줄이며, 씬에 변화가 감지될 때마다 매번 새로운 라이팅 데이터 에셋을 생성함.(대게 움직이지 않는 정적인 물체에 대해 미리 조명효과를 설정하여 텍스쳐를 만들어 버림)(현재 상태를 이미지로 캡쳐하여 사용하는 느낌 - 계산을 계속 하지 않는다.)

  • 인터페이스
  • 외부와 통신하는 공개 통로이며, 통로의 규격임.
  • C#에서는 다중 상속이 불가하기에 인터페이스를 많이 사용한다.
  • 인터페이스로 정의한 것들은 자식 클래스가 구현해야 한다.
  • 첫 글자를 대문자 I로하는 것이 암묵적인 룰이다.

커플링이란 서로 상호작용하는 시스템들간의 의존성을 의미한다.

  • 긴밀한 커플링(Tight Coupling) 다른 오브젝트에 대한 상당히 많은 정보를 필요로 하고 보통 두 객체간의 인터페이스들에게 서로 높은 의존성을 가지고 있다. 타이트하게 연결된 게임에서 하나의 객체를 변경하는 것은 많은 다른 객체들의 변경을 요구한다.

  • 느슨한 커플링 (Loose Coupling) 느슨한 커플링은 하나의 컴포넌트의 변경이 다른 컴포넌트들의 변경을 요구하는 위험을 줄이는 것을 목적으로 하는 시스템에서 컴포넌트 간의 내부 의존성을 줄이는 것을 추구하는 디자인 목표이다. 전체 프레임워크를 더욱 안정적으로 만들고 시스템의 유연성을 증가하게 하려는 의도를 가진 개념이다.

  • 코루틴 시간지연 함수로 비슷하게 Invoke함수가 있다. (알기로는 Invoke보다 Coroutine이 활용하기 좋음. 예시로 매개변수를 사용하는 경우나 active일때만 동작함)

반환타임 : 선언 시 IEnumerator, 반환 시 return이 아닌 yield return (break(코루틴 종료), null(1프레임만큼 동작 중지), new WaitForSeconds(s)) 으로 돌려주어야 한다.
코루틴 실행 - StartCoroutine(“함수 명”);
코루틴 중지 - StopCoroutine(“함수 명”);

  • IK (역운동학)
    자식 조인트의 위치를 먼저 결정하고 부모 조인트가 거기에 맞춰 변형됨.
    참고 블로그를 보며 공부하자. [참고 - IK] (https://ansohxxn.github.io/unity%20lesson%201/chapter9-3/)

  • Action 반환값이 없는 메서드를 등록할 수 있는 델리게이트다.
    using System 선언 후 사용 가능
    ```C# Action onClean; void Start(){ onClean += CleaningRoomA; //+= 를 해서 이벤트를 구독, -=는 삭제 onClean += CleaningRoomB; } void CleaningRoomA(){} void CleaningRoomB(){}

이렇게 설정 후 onClean();를 실행하면 A,B 둘 다 실행됨 ```

  • 포스트 프로세싱 흔히 후처리라고 번역되며, 게임 화면이 최종 출력되기 전에 카메라의 이미지 버퍼에 삽입하는 추가 처리임.
    Post-process Layer 컴포넌트 추가 후 사용

-안티엘리어싱 - 일명 계단 효과라고 불리는 이 현상은 가장자리 선을 부드럽게 만드는 기술을 말한다. 종류가 다양하니 참고하자 참고 - Anti-Aliasing

본 후기는 유데미-스나이퍼팩토리 10주 완성 프로젝트캠프 학습 일지 후기로 작성 되었습니다. #프로젝트캠프 #프로젝트캠프후기 #유데미 #udemy #스나이퍼팩토리 #웅진씽크빅 #인사이드아웃 #IT개발캠프 #개발자부트캠프 #unity #유니티 #게임개발 #메타버스