250425 TIL

박소희·2025년 4월 25일

Unity_7기

목록 보기
77/94

블럭 중복 조합이 안되게 조합 성공한 블럭은 검사하는 리스트에서 빼서 중복으로 검사하는 것을 방지했는데, 트리거가 있는 블럭은 또 접촉블럭이랑 조합되어야 해서 중복 조합이 되어야 한단다 ㅋㅋㅋ
왜 진작에 알려주지 않고 문제가 발생됐을 때 그제서야 알려주는 거지 ㅋㅋㅋ

    private void ContactBlockValid(ContactBlock contact, int index)
    {
        bool hasDeathTriggerBefore = PlacedBlocks.GetRange(0, index).Any(b => b.IsDeathTrigger);
        if (hasDeathTriggerBefore) 
        {
            contact.IsSuccess = true;
            contact.SetGhost();
            Debug.Log($"{contact.BlockName} 접촉 블럭 조건 만족: 사망 트리거 선행 존재");
        }
    }

접촉블럭일 때 검사를 따로 진행하도록 추가했다.

면접 준비 (2)

C# 문법
  1. 확장 메서드
  • 기존 클래스의 소스 코드를 수정하지 않고 메서드를 추가할 수 있게 해주는 기능.
  1. 콜백
  • 어떤 동작이 끝났을 때 나중에 실행되도록 등록해놓은 함수.
  • 버튼 클릭 시 실행할 메서드를 콜백으로 등록할 때 사용
  1. 델리게이트
  • 메서드를 참조할 수 있는 타입. 메서드를 변수처름 다룰 수 있게 해주는 기능, 특히 이벤트를 구현할 때 유용하게 사용됩니다.
  1. event
  • 델리게이트를 감싸서 외부에서는 등록만 가능하고 호울은 불가능하게 제한한 구조. 보안성과 구조적인 관리 면에서 더 안전하게 이벤트를 사용할 수 있게 해준다.
  1. Unity에서 사용하는 델리게이트/이벤트 예시
  • Unity에서는 UnityEvent, Action,Func, 또는 직접 선언한 델리게이트를 통해 이벤트 구현.
  • 버튼 클릭 이벤트나 게임 오버 시 처리되어야 하는 이벤트에서 사용.
  1. 참조형 vs 값형
  • 값 형식은 변수 자체에 값이 저장되고, 참조 형식은 실제 데이터는 힙에 저장되고 변수는 그 주소를 가지고 있는 구조. struct나 int 값 형식, class나 string은 참조 형식
  1. 스택 vs 힙
  • 스택은 빠르게 접근 가능한 메모리, 함수 호출 시 자동으로 할당되고 해제. 힙은 조금 더느리지만 자유롭게 크기를 할당할 수 있고, 가비지 컬렉터가 관리를 맡는다.
  1. struct와 class 차이(1,2)
  • 클래스는 참조 형식, 구조체는 값 형식. 클래스는 힙에 저장되고 참조를 통해 다루기 때문에 여러 객체가 같은 데이터를 참조할 수 있다. 구조체는 스택에 저장되어, 복사 시에 값 자체가 복사
  • 클래스는 사용자 정의 생성자를 자유롭게 만들 수 있지만, 구조체는 기본 생성자를 따로 정의할 수 없고, 모든 필드를 초기화해야만 생성자를 만들 수 있다.
  • 가비지 컬렉션
  • 프로그램 실행 중에 더 이상 사용되지 않는 메모리를 자동으로 해제해주는 기능.
유니티
  1. 코루틴 / 멀티스레딩 차이점
  • 코루틴은 Unity 메인 스레드 안에서 동작하기 때문에 UI나 게임 오브젝트에 안전하게 접근할 수 있다. 반면 멀티스레딩은 별도에 스레드에서 실행되기 때문에 Unity API를 직접 호출할 수 없고, 주로 연산이 많은 작업에서 사용된다.
  1. 유니티 최적화 기법
  • 유니티에서는 크게 렌더링, 물리, 스크립트, 메모리 측면에서 최적화를 고려할 수 있다. 대표적으로는 오브젝트 풀링, 불필요한 업데이트 제거, Draw call 감소 등이 있다.
  • 최적화 경험: 뱀서라이크 게임은 몬스터가 많이 생성될 수 밖에 없어서 관리가 필요하다. -> 오브젝트 풀링으로 최적화
  • 최적화에서 가장 중요한 부분: 병목을 파악하는 것이 중요하다. 무조건 최적화를 하기 보다 Profiler을 통해 실제로 자원 사용량이 큰 부분을 분석하고, 필요한 부분에만 선택적으로 최적화하는 게 중요.
  • 적용해본 텍스처 포맷: 없음
  1. 드로우콜, 최적화 방법
  • 드로우콜은 GPU 렌더링 명령을 보내는 호출 횟수, 이 수가 많을 수록 GPU 부하가 커진다.
  • 최적화를 위해서는 동일한 material을 사용하는 오브젝트를 Batching하거나, static batching, LOD를 사용한다.
  1. Find 함수 사용을 자제해야 하는 이유
  • 씬 내 모든 오브젝트를 탐색해 성능 비용이 크기 때문이다. 게임 실행 중 반복 호출되면 성능 저하의 원인이 될 수 있기 때문에, 초기화 시 캐싱하거나 인스펙터에서 직접 할당하는 방식이 더 안전하고 효율적.
  1. Update에서 GetComponent 자제해야하는 이유
  • 호출 시 비용이 큰 연산이기 때문에 Update처럼 자주 호출되는 함수 내에서 매번 사용하면 성능에 영향을 준다. 미리 캐싱하고 재사용하는 방식으로 처리해야한다.
  1. CSV / JSON 등 데이터 저장 포맷과 활용
  • CSV는 구조가 간단하고 가볍기 때문에 Excel 같은 툴과 연동이 쉬워 테이블형 데이터에 적합
  • JSON은 키-값 구조를 가지고 있어서 복잡한 구조나 중첩 데이터를 다룰 때 좋다. 가독성이 높고, 웹 API나 외부 데이터 연동에 자주 사용된다.
  1. 특정 데이터를 JSON으로 활용하려면
  • JSON을 저장하거나 불러오기 위해서는 직렬화가 가능한 클래스나 구조체를 정의하고, JsonUtility나 Newtonsoft.Json 같은 라이브러리를 사용해서 데이터를 문자열로 변환하거나 다시 객체로 역직렬화 해야한다.
  1. Unity에서 필드를 직렬화하려면
  • SerializeField를 추가해주면 직렬화. Dictionary나 Property는 기본적으로 직렬화하지 않기 때문에 별도의 처리가 필요하다.
  1. Unity에서 멀티스레딩 구현하려면
  • System.Threading.Thread, Task를 사용해서 멀티스레딩을 구현할 수 있지만, Unity의 대부분API는 메인 스레드에서만 접근 가능하다는 제한이 있다. 그래서 연산이 많은 작업은 백그라운드에서 처리하고, 결과만 메인 스레드로 넘기는 구조로 사용해야한다. Unity에서는 Job System과 Burst Compiler도 제공해서 멀티스레딩 기반으로 성능을 더 향상시킬 수 있다.
알고리즘
  1. tree 순회 방법
  • 전위 순회는 루트를 먼저 방문하고, 그 다음은 왼쪽, 오른쪽 자식을 순회.
  • 중위 순회는 왼쪽, 루트, 오른쪽 순서로 순회. 이진 탐색 트리에서 정렬된 데이터를 가져올 때 자주 사용.
  • 후위 순회: 자식 노드를 모두 순회한 뒤 루트를 방문. 하위 노드부터 계산을 추리할 때 유용.
  1. DFS / BFS
  • 깊이 우선탐색은 가능한 한 깊이 들어갔다가 더 이상 갈 곳이 없으면 한 단계 씩 되돌아오는 방식.
  • 너비 우선탐색은 가까운 노드부터 순차적으로 탐색.
  1. 행동 트리
  • 게임 AI에서 캐릭터의 행동을 결정하기 위해 사용하는 트리 기반의 구조. 루트 노드에서 시작해서 조건이나 행동 노드를 순차적으로 실행하며, 성공/실패 여부에 따라 다음 행동 결정.
  1. 길찾기 알고리즘
  • 대표적으로 DFS, BFS, Dijkstar, A* 알고리즘이 있다.
  • DFS/BFS는 단순한 구조나 미로 탐색 등에 사용되고, Dijkstra는 가중치 기반의 최단 경로를 찾는 데 사용, A* 는 휴리스틱 함수를 통해 보다 효율적인 탐색이 가능해서 게임에 자주 사용
  1. 각 길찾기 알고리즘의 차이점
  • DFS는 빠르게 깊은 노드 탐색하지만 최단 경로 보장 x
  • BFS는 가장 가까운 경로부터 탐색하기 때문에 가중치가 동일하다면 최단 경로 보장 가능
  • Dijkstra는 가중치가 있는 그래프에서 최단 경로를 찾는데 적합하지만, 전체 경로를 다 탐색하기 때문에 빠르고 효율적이다.

0개의 댓글