#19 게임 Title 화면 구현, 오클루전 컬링 적용
1.Title 화면 구현하기
게임 개발을 빨리 완료하고 싶어서 타이틀 화면은 검은 화면에 게임 이름, TOUCH TO START만 표기하려고 했지만...
이러면 너무 성의 없는게 아닐까? 생각이 들었다. 사실 이전까지 타이틀 화면에 대해 전혀 생각하고 있지 않았다.
간단하게라도 타이틀 화면을 구현하기로 결정하고 어떻게 구현할 지 생각해봤는데 간단하게 검은 화면에 하얀색 플레이어 캐릭터가 앞으로 달려가면 좋을 것 같았다. 게임 배경이 견습 마법사가 세상을 여행하며 마법사 수행을 하는 이야기인데 견습 마법사가 계속 달려가는 것이 계속해서 마법사 수행을 해나간다는 의미를 표현할 수 있을 것 같았다.
상상해보니 동적이여서 지루하지않고 의미도 있는 것 같아서 괜찮은 느낌이었다. 이런 연출은 이전 경험에서 아틸라 토탈워의 메인 화면과 게임 스쿨에서 개발했던 게임의 영향인 것 같다.

하지만 초기 기획처럼 구현하기가 어려웠다. 검은 배경은 만들 수 있었지만 흰색 플레이어 캐릭터를 만들기 어려웠다.
메테리얼을 흰색으로 변경해봤는데 생각한 것과 너무 달랐다. 다른 방법을 찾아봤는데 유니티 게임 책에서 러닝 게임의 배경 스크롤링과 플랫폼 생성 기능이 떠올랐다. 이 게임의 배경이 되는 도시를 플레이어가 달리는 컨셉으로 생각해봤다.
제자리를 달리는 플레이어와 바닥+건물, 성벽들을 일정 거리마다 배치하고(2d에서 레이어 별로 배치하듯이) 이동 속도를 다르게 하여 러닝 게임에서의 배경 스크롤링처럼 구현하기로 결정했다. 유니티 책에서는 배경화면 넓이를 기준으로 이동된 오브젝트 위치를 재배치하는데 나는 3D 오브젝트이기 때문에 그럴 수가 없었다. 따라서 박스콜라이더와 OnTriggerExit()를 이용하여 화면 왼쪽 외곽으로 이동한 오브젝트를 검출하고 위치를 재배치하는 형태로 구현했다.


카메라 설정
1.2D 카메라로 횡스크롤 느낌을 주기
-Camera의 Projection을 Orthographic으로 변경
-Size를 원하는 화면 크기로 변경(나의 경우 3.5 -> 7로 화면 너비를 늘림)
-완전한 횡스크롤은 3D 오브젝트의 입체감을 잘 표현해주지 못하는 것 같아서
약간 위에서 아래로 내려다 보는 느낌을 주고자 Camera Rotation을 변경했음
2.Audio Source, 타이틀 BGM 추가하기
-게임 시작 시 타이틀 BGM을 실행 시키기 위해서 Camera에 Audio Source 컴포넌트를 추가
- Audio Clip에 타이틀 BGM 할당
- Play On Awake(게임 시작 시 오디오 재생)와 Loop(반복 재생) 체크

배경 스크롤링 기능
1.플레이어는 오른쪽을 향해 제자리 달리기
-플레이어 프리팹을 배치하고, 프리팹을 해제한다.
-달리기 기능 외의 기능은 모두 제거 한다.
-TitleManager에서 달리기 파라미터를 true로 설정하여 제자리 달리기를 실행한다.
2.배경 오브젝트는 바닥과 건물 오브젝트, 성벽 오브젝트로 구성되며 각 2세트씩 준비한다.
(자연스러운 무한 달리기 구현용)

3.배경 오브젝트는 왼쪽으로 이동한다.
4.배경 오브젝트 별로 이동 속도는 다르며 플레이어와 멀리 있는 오브젝트는 이동 속도가 느리다.
-바닥과 건물 배경 오브젝트 이동 속도: 3
-성벽 오브젝트 이동 속도: 1.5
-입체감? 현실감있는 이동 연출 구현
5.무한 배경 스크롤링 기능
-배경 오브젝트 1세트가 화면 왼쪽 외곽 박스콜라이더에서 벗어났을 경우 재배치 위치로 위치를 변경한다.
-재배치 위치는 같은 종류의 배경 오브젝트 2세트 위치
6.배경 오브젝트들의 이동속도, 박스콜라이더 검사, 재배치 기능은 TitleManager에서 관리한다.
게임 시작 기능
1.타이틀 화면 전체 영역 아무 곳을 터치하면 Main 씬을 로드하여 게임을 시작한다.
2.게임 화면 전체 크기만큼의 터치 영역 Image를 생성한다.
3.타이틀 정보를 볼 수 있게 이미지는 투명하게 설정한다.

4.화면 터치 시 터치 영역의 On Click() 기능을 이용하여 Main 씬을 로드한다.
-SceneManager.LoadScene("Main", LoadSceneMode.Single)
-SceneManager를 이용하려면 스크립트 상단에 UnityEngine.SceneManagement를 미리 선언해야 한다.
TitleManager 스크립트
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement; //씬매니저 이용
public class TitleControl : MonoBehaviour
{
public float wallMoveSpeed = 1.5f;
public float planeMoveSpeed = 3f;
public GameObject wallObject;
public GameObject planeObject;
//오브젝트들이 화면을 벗어났을 때 배치할 위치
public GameObject wallLoop2;
public GameObject planeLoop2;
public Vector3 wallOffset;
public Vector3 planeOffset;
//타이틀 화면의 플레이어 달리기 제어
public Animator titlePlayerAni;
void Start()
{
wallOffset = wallLoop2.transform.position;
planeOffset = planeLoop2.transform.position;
titlePlayerAni.SetBool("CanMove", true);
}
void Update()
{
//왼쪽으로 이동하는 오브젝트 스크롤링 기능 구현
wallObject.transform.Translate(Vector3.left * wallMoveSpeed * Time.deltaTime);
planeObject.transform.Translate(Vector3.left * planeMoveSpeed * Time.deltaTime);
}
private void OnTriggerExit(Collider other)
{
if (other.tag == "TitleWall")
{
other.transform.position = wallOffset;
}
else if (other.tag == "TitlePlane")
{
other.transform.position = planeOffset;
}
}
public void GameStart()
{
//게임 시작
SceneManager.LoadScene("Main", LoadSceneMode.Single);
}
}
2.오클루전 컬링
오브젝트들이 많다 보니 플레이 렉이 생길 것 같아서 게임을 최적화하기로 했다.
https://docs.unity3d.com/kr/2018.4/Manual/OcclusionCulling.html
오클루전 컬링 설정하기
1.오클루전 컬링을 할 맵의 오브젝트들을 전체 선택하기

2.인스펙터창 > Static > Occluder Static 선택
3.유니티 상단 메뉴 Window > Rendering > Occlusion Culling 선택
4.인스펙터창 옆의 Occlusion 창 선택
5.우하단의 Bake 버튼 선택
6.오클루전 컬링이 완료되면 게임 시작 시 카메라 영역 이외의 오브젝트는 숨겨준다.
