
오늘 학습 키워드
유니티 심화, 챌린지 반 강의
오늘 학습 한 내용을 나만의 언어로 정리하기
유니티 심화
플레이어 피격
// 아직 공격 안했음 + 데미지를 넣기 위한 최소 시간이 지났을 때
if(!alreadyAppliedDealing && normalizedTime >= stateMachine.Enemy.Data.DealingStartTransitionTime)
{
// Weapon 키기
stateMachine.Enemy.Weapon.SetAttack(stateMachine.Enemy.Data.Damage, stateMachine.Enemy.Data.Force);
stateMachine.Enemy.Weapon.gameObject.SetActive(true);
alreadyAppliedDealing = true;
}
// 공격 했음 + 데미지를 못 넣는 최소 시간이 지났을 때
if(alreadyAppliedDealing && normalizedTime >= stateMachine.Enemy.Data.DealingEndTransitionTime)
{
// Weapon 끄기
stateMachine.Enemy.Weapon.gameObject.SetActive(false);
alreadyAppliedDealing = false;
}게임 빌드 프로세스
공통 내용
- 씬 관리
- 해상도 대응
윈도우용 빌드
- File > Build Settings > Platform에서 Windows
- 유의사항 : 윈도우 운영체제에서만 (당연히) 실행됨.
- 플러그인 호환성 이슈도 확인해 보아야 함
안드로이드용 빌드
- Minimum API Level과 Target API Level을 설정해 주어야 함
- 외부 플러그인 호환성 잘 봐야 함
- 안드로이드 빌드를 하려면 JDK와 Android SDK 필요.
- 안드로이드는 다양한 해상도와 기기를 지원하기 때문에, 이를 고려해서 UI/UX 디자인이 필요
- Other Setting > Scripting Backend : IL2CPP > ARM64 체크 해야 구글 출시 가능
- Minimum API Level을 33정도로 올려서 설정하셈 (구글 정책이 변경됨)
- 만약에 SDK가 없다? 안드로이드 스튜디오 들어가서 설치해야됨
- Preference > External Tools > Android > Android SDK Tools 위치 바꾸셈
주요 Player Settings 옵션
- 회사 이름, 제품 이름, 기본 아이콘, 기본 커서, 버전 등등 설정 가능
- Resolution and Presentation
- Default Screen Width, Default Screen Height를 설정 하기
- FullScreen Mode도 설정 가능
- Visible in Background : 창이 백그라운드에 있을 때 게임이 보일 지 여부
챌린지 반 강의 (주제 : Asset Bundle, Addressable)
Asset Bundle
-
다양한 에셋이 들어있는 아카이브 파일. 에셋 번들은 DLC에 유용함. 초기 설치 크기를 줄이고, 런타임 메모리 압박이 줄어듬
-
파일 전송 서버에 번들을 올려두고 필요할 때 다운로드 해서 씀
-
압축해서 올려둠. 그러다보니 업로드/다운로드에 이득임
-
게임 리소스 패치가 다 에셋 번들임. 서버에서 받아다 쓰는거
-
플랫폼마다 따로 관리를 해야함
-
에셋 번들은 Zip과 유사한 컨테이너 파일 포맷. (에셋들을 압축한다는 의미)
-
에셋 번들에는 스크립트가 들어가지 않음.
-
에셋 번들 지정하는 방법 : 에셋 누르면 밑에 에셋 번들 있음. 거기서 직접 지정 가능
- 코드로도 가능하긴함
-
StreamingAssets 폴더 내 파일은 에셋 번들에 추가할 수 없음.
- StreamingAssets : 게임 홍보 영상, 다운로드 될 때 뜨는 영상 혹은 미니게임 들이 들어감.
-
에셋 번들을 나누는 방법
- 논리적 엔티티 그룹화 : UI, 캐릭터, 환경 등등으로 나누기 (DLC에 유용)
- 타입 그룹화 : 오디오끼리 묶고, 사진끼리 묶고 등등..
- 동시 컨텐츠 그룹화
-
에셋 번들 종속성 : 여러 번들에 필요한 데이터들이 있으면 그 번들이 다 로드되어야 함
-
에셋 번들 관리 까다로움
Addressable
- 유니티 에셋 번들 기반. 자세한 관리 코드를 직접 작성하지 않아도 됨.
- 어드레서블은 그룹 단위로 파일이 나뉨
- Simplify Addressable Names를 선택하면 파일 명을 간단하게 바꿀 수 있음
- 파일 누르면 그 밑에 Addressable 체크박스가 있음. 그거 누르면 어드레서블로 관리 가능함.
- 어드레서블은 비동기가 기본임. 근데 WaitForCompletion() 쓰면 동기처럼 사용 가능함.
- 필요 없어졌으면 Unload 해줘야 됨.
- 그룹마다 추가적인 설정이 가능함
- Bundle Mode > Pack Together(다같이) / Pack Seperately(번들 안에서 또 쪼갬. 메모리 절약 가능)
- 중복 분석이 가능함.
챌린지 반 강의 (주제 : 프로젝트 구조 샘플)
- UI Manager
- Dictionary<string, UIBase>로 UI를 모아서 관리
- Resource Manager
- 오브젝트 생성을 관리
- Scene Load Manager
- 씬 타입을 지정
- 씬 베이스를 만들어서 Loading, Enter, Exit를 만듬
public void LoadScene(SceneType sceneType)
{
// 진행중인 씬 로딩이 있으면 정지
if(_loadingCoroutine != null) StopCoroutine(_loadingCoroutine);
// 로드할 씬이 등록되어 있는 씬인지 확인
if(!_scenes.TryGetValue(sceneType, out var scene))
{
Debug.LogError($"SceneType이 없습니다 : {sceneType}");
return;
}
// 현재와 같은 씬을 로드하려고 하는지 확인
if(_currentScene == scene) return;
_loadingCoroutine = StartCoroutine(LoadSceneProcess(sceneType));
}
IEnumerator LoadSceneProcess(SceneType sceneType)
{
//씬 타입에 따른 씬 오브젝트 가져오기
// 기존 씬이 있다면 종료하기
var scene = _scenes[sceneType];
_currentScene?.OnSceneExit();
_prevScene = _currentScene;
_currentScene = scene;
// 씬 로딩 시작
var operation = SceneManager.LoadSceneAsync(sceneType.ToString());
// 씬 전환은 끄기
operation.allowSceneActivation = false;
// 씬이 전환되는 동안 실행되어야 하는 것들 실행
// 아마 API나 어드레서블 등의 비동기 데이터 불러오기 등등이 포함될 것.
_currentScene.SceneLoading();
// allowSceneActivation이 false면 progress가 0.9까지만 진행됨
while (operation.progress < 0.9f)
yield return null;
// 씬 전환 켜기
operation.allowSceneActivation = true;
while (!operation.IsDone) yield return null;
yield return null; // 한 프레임 전환 대기 : 씬에 있는 오브젝트들 초기화 대기를 위함
_currentScene.OnSceneEnter();
_loadingCoroutine = null; // 로딩 다 됐으니까 코루틴 변수 비워주기
}- Scene Manager와 UI Manager, Resource Manager들을 사용하면 씬에서 데이터가 배치되는 순서를 제어할 수 있기 때문에 유용함