오늘 학습 키워드

유니티 심화, 챌린지 반 강의

오늘 학습 한 내용을 나만의 언어로 정리하기

유니티 심화

플레이어 피격

// 아직 공격 안했음 + 데미지를 넣기 위한 최소 시간이 지났을 때
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들을 사용하면 씬에서 데이터가 배치되는 순서를 제어할 수 있기 때문에 유용함