17강 사운드 컨트롤
AudioSource
- 실제로 소리를 출력하는 담당
- 보통 AudioListener는 카메라에 달려있음
but 우리는 2D이므로 어디에 있든 소리가 들리게 설정
3D 프로젝트에서는 위치에 따라 소리가 크게 들리거나 작게 들리도록 설정 가능
Static Method
- Static 메서드는 Static 변수만 사용할 수 있음
- 정적인 변수 instance를 통해서만 객체의 값을 가져올 수 있음
public static SoundManager instance;
public static void ChangeBackgroundMusic(AudioClip music)
{
instance.musicAudioSource.Stop();
instance.musicAudioSource.clip = music;
instance.musicAudioSource.Play();
}
18강 UI 만들기
UGUI (Unity's User Interface)
- 기본 UI 시스템으로, 게임 내의 사용자 인터페이스를 구축하는 데 사용됨
- Canvas
- UGUI 안에서 모든 UI 요소는 Canvas라는 컴포넌트 내에 배치됨
- 스크린 공간, 월드 공간, 카메라 공간의 3가지 렌더 모드를 지원
- Screen Space - Overlay
- 캔버스가 씬 내부 아무곳에나 위치해도 게임 씬 전체를 덮는 형식으로 렌더링
- 씬에 카메라가 아예 없어도 렌더링 됨
- 스크린 크기가 조절되거나 해상도가 변경되면 캔버스는 여기에 맞춰서 자동으로 크기를 조절함
- Screen Space - Camera
- 카메라를 지정해 해당 카메라에서 일정 거리에 위치한 평면 오브젝트 위에 드로우되는 것처럼 렌더링
- 카메라 절두체 내에 정확히 맞도록 항상 다시 스케일되므로, 거리에 따라 크기가 달라지지 않음
- 씬 안의 오브젝트 중 UI 평면보다 카메라에 가까운 모든 오브젝트는 UI 앞에 렌더링
- World Space
- UI가 씬 안에 있는 평면 오브젝트인 것처럼 렌더링
- Screen Space - Camera 와의 차이 : UI가 항상 카메라를 향하지는 않음
- 화면에서의 캔버스 크기는 카메라의 뷰 각도와 카메라 거리에 따라 달라짐
참고 Unity Documentation
참고 Velog 코딩창고
- Rect Transform
- 기본 Transform 대신 UI 요소에 사용됨
- 위치, 크기, 회전, 스케일을 지정하는 데 사용되며, 앵커 및 피봇을 사용하여 부모와의 상대적 위치를 지정
- UI Components
- 버튼, 이미지, 텍스트, 슬라이더, 스크롤 바 등
- Event System
- UI 상호작용을 관리
- 마우스 클릭, 드래그, 키보드 입력 등
19강 로직 구현하기
코루틴 (Coroutine)
- 비동기적으로 실행되는 함수
- 특정 코드 블럭의 실행을 일시적으로 중지하고 다시 시작할 수 있게 해줌
- IEnumerator 리턴 타입의 함수에서 yield return을 사용하여 구현
- 프레임 간의 지연, 비동기 작업, 시간에 따른 애니메이션
- yield return null : 다음 프레임까지의 대기
- yield return new WaitForSeconds(n) : n초 동안 대기
- 별도의 다른 Thread를 생성하여 실행하는 것이 아닌 Unity의 MainThread 내에서 구분점을 갖는 것
-> 안전한 API 호출
- yield return을 만나면 실행을 반환했다가 다시 돌아오게 됨
- 아래 코드는 Update와 같은 동작을 함
IEnumerator StartNextWave()
{
while (true)
{
yield return null;
}
}
20강 스텟 계산하기
패턴 매칭
- C# 7.0부터 추가된 기능으로, 일치하는 패턴에 따라 코드를 실행
- switch문을 이용하여 객체의 타입이나 값에 따라 처리를 다르게 할 수 있음
- switch문과 함께 사용하면 코드 가독성을 높이고 유지보수성, 확장성, 유연성 ↑
- 객체의 타입을 확인하거나 특정 조건을 충족하는지 확인하면서 동시에 변수에 값 할당 가능
- case RangedAttackData_ : CurrentStats.attackSO가 RangedAttackData 타입일 경우 실행
switch (CurrentStats.attackSO)
{
case RangedAttackData _:
ApplyRangedStats(operation, newModifier);
break;
}
Max를 Min으로 잘못써서 화살이 안 날아가는 이 감자는.....
다른 분의 도움을 받아 화살을 날렸다고 한다.......
그래도 어찌저찌 2D 프로젝트 강의는 완강했따
3D는 언제 듣지...?
털썩 ㅇ<-<
끗 . , , . . .