유니티 책을 만들어보자! #책 Page 넘기기

 

프로토타입 용

 

여러분은 게임 이야기를 만든 다음 어떻게 유저에게 전달하시나요?

나레이션? 글? 아니면 타임라인? 다양한 방법이 있지만 저는 책을 읽듯이 스토리를 전달받을 때 몰입감이 높았습니다.

예를 들면 Moss2 VR게임처럼요!

 

하지만 책을 읽듯이 스토리를 전달하는 것은 폼이 많이 드는 작업이어서 선뜻하기 어렵죠...

하.지.만. 이제 걱정하지 마세요! 이 에셋을 알게 된 여러분은 이제 어렵지 않게 구현할 수 있으니깐요!

 

이제 여러분의 이야기를 더 이상 2차원으로 제한하지 마세요. "EndlessBook"과 함께 3차원으로 여러분의 이야기를 표현해 보세요. 여러분의 이야기가 생동감 넘치듯, 살아 숨 쉬게 될 시간입니다. 


 "EndlessBook"이란?

"EndlessBook"에셋은 단순히 책 페이지(Page)를 넘기는 것 이상의 경험을 제공합니다. 예를 들어 현실적인 (페이지)'뒤집기' 애니메이션을 통해, 유저가 직접 책을 넘기고 있는 것 같은 느낌을 받게 해 줍니다!

 

“EndlessBook"은 책 페이지를 뒤집는 애니메이션을 구현하는 데 필요한 모든 기능을 제공합니다. 유저는 페이지를 앞뒤로 뒤집거나, 특정 페이지로 바로 이동할 수 있습니다. 또한, 각 페이지에 대한 데이터를 관리하고, 책의 상태를 변경하며, 페이지를 드래그하여 뒤집는 등의 상호작용을 구현할 수 있습니다. 

 

“EndlessBook"에는 뒤집기가 끝날 때 얻을 수 있는 Event 함수들도 쉽게 구현할 수 있습니다!


 "EndlessBook"사용방법

Book Setting

 

먼저 Book프리팹을 찾아줘야 합니다. Demo Scene에 있는 Book을 사용하셔도 되고, Book Prefab 검색해서 찾아주시면 됩니다.

 

각 페이지를 담당할 Material들을 책임지는 Base Map(Texture)의 Size는 1024x1024 규격입니다.

 

Book의 State

State

 

Book의 State는 총 5가지가 존재합니다

Front

Closed Front는 좌측 사진처럼 책 커버가 덮어져 있는 형태입니다. 

Open Front는 커버를 처음 열었을 때의 첫 Page입니다. 좌측에는 커버가 존재하고 우측에는 첫 Page가 등장합니다.

 

Middle

 

Book에서 제일 중요한 부분입니다. 모든 Page 인터렉션은 Middle에서 이루어지며 반드시 Middle에서 Pages 메테리얼을 수정하셔야 합니다.

 

Back

 

Front와 비슷한 개념이고 책의 맨 뒷 부분을 뜻합니다.


그 외

(좌) High / (우) Low

 

Open Middle Quality : State가 Middle일 때 책의 퀄리티를 어떻게 할지 정하는 옵션입니다. 위 사진을 보시면 Low의 경우 책의 두꺼움을 표시하는 Page들이 없습니다.

 

Max Pages Turning : 책 넘기는 애니메이션이 실행될 때 최대 몇 개의 Page가 넘겨지는지 설정하는 옵션입니다. 이 수치가 높을수록 부하가 많이 걸리니 프로젝트에 맞게 설정하시면 되겠습니다.

 

Page Filler Material : 책의 페이지에 대한 데이터가 부족하거나 없을 때 사용되는 기본 머티리얼을 의미합니다. 예를 들어, 책에 100페이지가 있지만 페이지 데이터가 50페이지만 정의된 경우, 나머지 50페이지는 "Page Filler Material"로 채워집니다. 

 

Pages

 

페이지는 말 그대로 해당 페이지에 표시할 메테리얼을 설정하는 공간입니다.


함수

Current State 바꾸기

EndlessBook.StateEnum newState = EndlessBook.StateEnum.ClosedFront;

if (Input.GetKeyDown(KeyCode.Z)) { changeState = true; newState = EndlessBook.StateEnum.ClosedFront; }
else if (Input.GetKeyDown(KeyCode.X)) { changeState = true; newState = EndlessBook.StateEnum.OpenFront; }
else if (Input.GetKeyDown(KeyCode.C)) { changeState = true; newState = EndlessBook.StateEnum.OpenMiddle; }
else if (Input.GetKeyDown(KeyCode.V)) { changeState = true; newState = EndlessBook.StateEnum.OpenBack; }
else if (Input.GetKeyDown(KeyCode.B)) { changeState = true; newState = EndlessBook.StateEnum.ClosedBack; }

 

위에처럼 newState를 바꾼 다음에 아래 함수를 통해 페이지를 넘길 수 있습니다.

 book.SetState(newState, animationTime: stateAnimationTime, onCompleted: OnBookStateChanged);

 

animationTime은 Page를 넘기는데 걸리는 시간을 뜻하며, onCompleted함수는 페이지가 다 넘겨지면 콜백 받을 함수를 지정하는 곳입니다.

 

원하는 Page로 넘기기

int newPageNumber = 0;

if (Input.GetKeyDown(KeyCode.Alpha1)) { turnToPage = true; newPageNumber = 1; }
else if (Input.GetKeyDown(KeyCode.Alpha2)) { turnToPage = true; newPageNumber = 2; }
else if (Input.GetKeyDown(KeyCode.Alpha3)) { turnToPage = true; newPageNumber = 3; }
else if (Input.GetKeyDown(KeyCode.Alpha4)) { turnToPage = true; newPageNumber = 4; } }

 

위에처럼 넘길 Page의 Number를 지정한 다음에  아래 함수를 통해 해당 페이지로 넘길 수 있습니다.

book.TurnToPage(newPageNumber, turnTimeType, turnTime,
                    openTime: stateAnimationTime,
                    onCompleted: OnBookTurnToPageCompleted,
                    onPageTurnStart: OnPageTurnStart,
                    onPageTurnEnd: OnPageTurnEnd
                    );
매개변수  설명
turnTimeType 페이지를 넘기는 데 사용되는 시간 유형입니다. deltaTime 또는 unscaledDeltaTime으로 설정할 수 있습니다.
turnTime 해당 페이지로 이동하는 데 걸리는 총 시간입니다.
openTime 한 페이지를 넘기는 데 걸리는 시간입니다.
완료 시 페이지가 완료되면 트리거되는 콜백 함수입니다.
페이지 시작 페이지를 넘길 때 트리거되는 콜백 함수입니다.
페이지 끝 페이지가 끝날 때 트리거되는 콜백 함수입니다.

 

 

드래그

드래그 하는 방법은 Demo3을 참고하시면 됩니다!

 


구매 링크

 

이 글은 어필리에이트 링크를 포함하고 있습니다. 

위 링크를 클릭하셔서 애셋을 구매하시면 저에게 수수료가 제공됩니다.
링크를 클릭하는 것으로는 수익이 발생하지 않습니다!
감사합니다!