Unity 공부

Awake() Vs. Start()

특징 Awake Start
공통점 최초 1회만 실행됨 → 보통 초기화 용도로 사용
모든 오브젝트 참조 보장
객체 상태 객체가 Disabled일 때도 실행 객체가 Enabled일 때만 실행
실행 타이밍 모든 오브젝트 생성 이후
모든 Start 실행 이전(동적 생성 제외)
최초 Update 실행 직전

따라서 미리 만들어둬야 하는 동적 할당체(Collections 등)는 Awake에서 할당해주는 것이 좋아 보인다(Disabled일 때도 실행해두고, Start에서 해당 변수들을 사용하기 위해서).

출처: https://blog.naver.com/blastingzone/220406033699


Dictionary의 순회


Dictionary<K, V>를 순회할 때는 KeyValuePair<K, V>라는 자료형을 사용한다.
혹은 자료형을 명시하지 않고 var를 사용해도 무방하다.
(item.Key, item.Value로 접근 가능)

출처: https://stackoverflow.com/questions/141088/how-to-iterate-over-a-dictionary


TextMeshPro 한글 폰트 깨짐

먼저 TTF/OTF 등 폰트 파일을 에셋에 추가하고,
Window → TextMeshPro → Font Asset Creator
위 UI에서 Source Font File로 에셋에 등록한 폰트 파일을 사용해서 Generate Font Atlas를 통해 SDF 에셋을 생성한다.
이후 사용할 TextMeshPro Prefab이나 오브젝트에 위 폰트 SDF를 추가해주면 완료.
추가로, SDF의 인스펙터 창에서 Altas Population Mode를 Dynamic으로 바꿔주고, 샘플링 사이즈를 60 정도로 바꿔주는 게 좋다고 한다. 글자를 미리 로딩해놓을 필요가 없다면 동적으로 로딩해서 최적화를 신경써주자.

출처: https://maloveforme.tistory.com/168


out 키워드

매개변수 앞에 붙이는 키워드, 즉 "매개변수 한정자"의 일종
변수가 참조로 전달되며, 이 변수는 함수 내부에서 값을 지정해주어야 함

예시: Int32.TryParse 함수는첫 번째 매개변수로 들어온 문자열을 int 타입의 숫자로 변환해서 두 번째 매개변수로 들어온 out 키워드 매개변수에 담아줍니다. 반환은 숫자로 변환이 가능한 값이면 true, 아니면 false.

특정 조건 하에서만 변수를 할당해서 메모리를 아끼고 싶을 경우 유용하게 사용할 수 있어 보인다.

출처: https://blockdmask.tistory.com/606


코루틴(Coroutine)이란?

실행의 지연과 재개를 허용함으로써, 비선점적 멀티태스킹을 위한 서브 루틴을 일반화한 컴퓨터 프로그램 구성요소
  • 비선점형 비동기 처리 - 즉 동시성 O 병렬성 X (논리적으로 병렬 작업처럼 보이지만, 물리적으로 그렇진 않음)
  • 선점형 비동기 처리: 코드가 복잡해지고, Context switch 비용 커짐
  • 작업 단위인 Context를 오버라이드하여 실행 → Context switch 비용 없음, 개발자가 직접 작업 스케줄링 가능
  • 서브 루틴과 다름
    • 메인 루틴: 프로그램 전체의 개괄적인 동작으로 main 함수에 의해 수행되는 흐름
    • 서브 루틴: 반복적인 기능을 모은 동작으로 main 함수 내에서 실행되는 개별 함수의 흐름
    • 그런데 코루틴은 서브루틴과는 다르게, 중간에 동작을 중단하고 이후 해당 지점에서 실행 재개가 가능(진입-반환이 여러 개)
  • Continuation Passing Style(CPS, 연속 전달 방식)과 State machine을 이용
    • 일종의 콜백 함수인 Continuation을 전달해 함수 작업 완료 시 다시 호출하는 방식

출처: https://dev.gmarket.com/82


Switch 문

계산 결과를 내놓는 식(연산자)

string grade = score switch {
  90 => "A",
  80 => "B",
  _ => "C"// default
};

위 코드를 실행하면, score에 따라 grade가 A, B, C로 초기화된다.

2개 이상의 매개변수를 받거나, 내부에서 when 절을 사용해 추가 분기 처리도 가능하다.

int damage = (selectedCardDamage, opponentSelectedCardDamage) switch
{
    (1, _) => 1,
    (_, 0) => 0,
    (0, 1) => 0,
    (0, _) => opponentSelectedCardDamage,
    var (s, o) when s > o => selectedCardDamage,
    _ => 0
};

출처: https://daekyoulibrary.tistory.com/entry/C-switch-%EB%AC%B8%EA%B3%BC-when-%EC%A0%88-%EA%B7%B8%EB%A6%AC%EA%B3%A0-switch-%EC%8B%9D


https://blog.naver.com/saegot/222427891659
23까지 완료!(12/10)

댓글

이 블로그의 인기 게시물

[몬스터헌터 와일즈] 광룡증을 알아보자 (feat. 흑식일체, 무아지경, 식공복장)

[엘든 링 밤의 통치자] 집행자 요도(히나타츠카미) 유물 분석

[몬스터헌터 와일즈] 역습을 알아보자