전체 글 71

기술면접 질문 정리(추가)

struct와 class를 비교해서 설명해주세요 형식 구초제 - 값형식 / 클래스 - 참조형식 할당 구조체 - 복사 / 클래스 - 참조 다른점 구조체는 상속이 불가능함 구조체는 값형식이기 때문에 불변성을 가지고 한 번 생성되면 내부상태가 변경될 수 없다. 간단한 데이터 형식을 표현하는데 사용 가끔 성능 최적화나 특정한 상황에서만 쓰고 대부분 클래스를 사용 가비지 컬렉터에 대해 설명해주세요 / 가비지 컬렉터를 회피하기 위한 전략 / 가비지 컬렉션에 대해 설명해주세요 스택에 할당되는 데이터는 자동으로 해제되지만 힙에 저장된 데이터는 자동으로 해제가 되지않는다. 따라서 프로그램이 샐행 중에 힙에 할당된 메모리 중 사용되지 않는 메모리를 해제 시켜 메모리를 관리하는 기능입니다. 이는 개발자가 힙에 할당되는 메모..

카테고리 없음 2024.02.21

유니티 오디오 매니저로 오디오 관리하기 + enum으로 편하기 사용하기

오디오를 BGM만 넣으면 관리가 쉽지만 효과음(SFX)이 많아지면 관리가 힘들어진다. 그래서 오디오 매니저를 싱글톤화하여 관리를 하기로 했다. public class AudioManager : MonoBehaviour { public static AudioManager instance; // 배경음에 필요한 변수들 [Header("#BGM")] public AudioClip BGMclip; public float bgmVolume; AudioSource bgmSource; // 효과음을 관리하기 위한 변수들 + 배열에서 빼서 사용할 수 있도록 [Header("#SFX")] public AudioClip[] sfxClips; public float sfxVolume; public int channels; ..

카테고리 없음 2024.02.20

유니티 FixedUpdate/Update/LateUpdate

유니티의 생명주기 함수들인 Update/FixedUpdate / LateUpdate은 각각 다른 시기에 호출되며, 실행 프레임과 관련하여 다음과 같은 차이점이 있습니다. Update 프레임마다 호출됩니다. 일반적으로 게임 오브젝트의 위치, 애니메이션, 사용자 입력 등과 같이 매번 업데이트되어야 하는 로직에 사용됩니다. 주로 그래픽 관련 작업을 수행합니다. FixedUpdate 물리 엔진 업데이트 주기에 따라 호출됩니다. 기본적으로 초당 50회 호출됩니다. (그래서 컴퓨터 성능이 좋으면 매 프레임마다 FixedUpdate가 안 일어날 수 있고 반대로 컴퓨터가 안좋으면 갑자기 많은 FixedUpdate가 일어나서 렉걸린 현상처럼 일어납니다.) 물리 엔진 시물레이션 사용됩니다. 게임 오브젝트의 물리적 상태를 ..

카테고리 없음 2024.02.14

시간복잡도

시간복잡도는 알고리즘이 실행되는 데 걸리는 시간이 입력 크기에 대한 함수로 표현하는 것 입니다. 이를 통해 주어진 알고리즘이 입력 크기에 따라 어떻게 증가하는지 설명하는데 사용됩니다. 주로 BIG O 표기법을 사용하여 표현합니다. 버블정렬 최선/평균/최악 : O(n^2) 선택정렬 최선/평균/최악 : O(n^2) 삽입 정렬 최선 : O(n) - 이미 정렬된 경우 평균/최악 : O(n^2) 합병정렬 최선/평균/최악: O(n log n) 큇정렬 평균/최선: O(n log n) 최악: O(n^2) - 이미 정렬된 경우 또는 역순으로 정렬된 경우 힙정렬 최선/평균/최악: O(n log n) 계수 정렬 O(n + k), 여기서 k는 입력의 범위(최대값 - 최소값 + 1)입니다. 하지만 k가 n보다 작을 때에만 유용..

카테고리 없음 2024.02.13

C# 정렬 알고리즘

정렬 알고리즘은 데이터를 특정한 순서대로 재배치하기 위한 알고리즘이다. 데이터가 있을 때 일정한 기준으로 오름차순이나 내림차순으로 정렬하거나 특별한 기준에 떄라 재정렬하는 것이 목적이다. 정렬 알고리즘에는 다양한 방식이 있고 그에 따라 성능과 특성이 다르다. 1. 버블 정렬: 인접한 두 원소를 비교하여 필요에 따라 서로 교환하는 방식으로 동작합니다. 배열을 한 번 순회할때 마다 가장 큰 원소가 배열의 마지막으로 이동합니다. 2. 선택 정렬: 배열에서 가장 작은 원소를 찾아 배열의 맨 앞으로 이동시키는 방식입니다. 배열의 길이만큼 반복하여 정렬을 완성한다. 3. 삽입정렬: 배열을 정렬된 부분과 정렬되 않은 부분으로 나누고, 정렬되지 않은 부분의 원소를 정렬된 부분에 삽입하는 방식입니다. 4. 퀵 정렬: 분..

카테고리 없음 2024.02.08

C# 개념 채우기 숫자 2의 보수

컴퓨터는 1과 0으로 되어있다. 그렇기 때문에 음수를 표현하기 위해서 컴퓨터는 보수법을 사용한다. 보수는 보충해주는 수라는 뜻이다. 컴퓨터는 뺄셈을 하지 못한다. 따라서 -를 해당 숫자의 보수로 만들어 줘서 해당 진법의 배수로 만들어 줘서 맨 왼쪽자리를 없애줘야한다. 이게 뭔소리인지 모르겠지만 예시를 들어보겠습니다. 173이라는 십진법수가 있다고 가정하면 173의 보수는 173과 더해서 1000을 만들어줘야한다. 따라서 173의 보수는 827이 된다. 이를 확인하는 과정은 200 - 173을 통해 확인해 보자 앞서 말한것을 토대로 컴퓨터는 뺄셈을 하지 못한다. 따라서 -부분을 +로 만들어야한다. 200 + 827(173의 보수) = 1027이다. 그리고 맨 왼쪽자리를 없애면 27이 된다. 컴퓨터는 이런식..

카테고리 없음 2024.02.07

기술면접 개인 답변 정리

1. struct와 class를 비교해서 설명해주세요. 구조체는 값 타입이고 클래스는 참조 타입입니다. 따라서 구조체는 스택에 할당되며 직접 데이터를 보유합니다. 클래스는 힙에 할당되고 변수는 힙에 데이터의 주소가 할당됩니다. 구조체는 상속을 지원하지 않고 클래스는 상속을 지원합니다. 구조체는 스택에 저장되기 때문에 가비지 컬랙션의 대상이 아니고 클래스는 힙에 저장되어 가비지 컬렉션에 의해 정리됩니다. 2. 가비지 컬렉터에 대해 설명해주세요. / 가비지 컬렉터를 회피하기 위한 전략 / 가비지 컬렉션에 대해 설명해주세요 a. 스택에 저장된 데이터는 자동으로 해제 되지만 힙에 저장된 데이터는 자동으로 해제가 되지 않습니다. 프로그램이 실행 중힙에 사용되지 않는 메모리를 해제 시켜 메모리를 관리하기위한 것입니..

카테고리 없음 2024.02.07

유니티 타일맵 오류 해결하기

지금 만들고 있는 게임에서 타일맵을 플레이어가 부수거나 설치할 수 있게 해주는 시스템을 만들었는데 오류가 생겨서 오류에 대해 정리하려고 한다. 일정 방향에서 벽을 공격했을 때 벽에 대한 정보를 가지고 올 수 없는 오류 일정 방향에서 벽을 공격 했을 때 벽에 대한 정보를 가지고 올 수 없는 오류인데 public void Start() { // Bounds는 구조체 // 해당 Tile의 크기만큼 싹 for문을 돌린다. tile이 있으면 Dictionary에 추가. 각각 TileInfo의 값을 받는다. BoundsInt bounds = tilemap.cellBounds; for (int x = bounds.x; x < bounds.x + bounds.size.x; x++) { for (int y = bound..

유니티 Rule Tile

타일맵을 설치할 때 한 타일에 여러타일의 규칙성을 부여해서 설치방향과 순서에 따라 자동적으로 타일이 선택되게 하는 방법이다. 한 종류의 타일 설치하고 주위로 같은 타일을 설치하하면 설정된 룰 타일에 따라 모양이 자동으로 결정된다. 룰타일 파일을 생성 후 원하는 규칙을 지정해주면 해당 타일을 설치 규칙이 완성되어 한가지 타일만 설치하더라도 알아서 규칙이 생성된다.

유니티 2D 시야각(FOV) 만들기

지금 만들고 있는 게임에서 던전 탐험 느낌을 주기 위해 시야각(FOV_FieldOfVeiw)을 만들어 한층 더 게임의 분위기를 살리려는 노력을 했다. 플레이어 자식으로 가상의 mesh를 만들어 레이캐스트로 충돌 여부를 판단하고 시야각을 만들어 주었다. 시야각이 벽과 만났을 때는 시야각과 레이가 충돌했을 때의 크기 만큼 리턴해주고 시야각 안에 설정해 둔 레이어가 들어왔을때 화면에 랜더링 해주는 것을 추가해 몬스터가 시야각 안에 있어야지 볼 수 있게 해주었다. 또한 벽 넘어에 어떤 물체가 있는 지 모르기 때문에 탐험에 대한 긴장감을 느낄 수 있을 것 같다. [RequireComponent(typeof(MeshFilter))] [RequireComponent(typeof(MeshRenderer))] publi..