0. 들어가기 전에
이번엔 도감에 애니메이션 기능을 적용했다. 페이지를 넘길 때 동적인 효과를 주고 싶었기 때문이다.
1. 애니메이션&애니메이터
도감 애니메이션을 위해 애니메이션과 애니메이터를 만들었다.
1.1 BookController 애니메이터
도감을 위한 애니메이터이다.
1. 상태
애니메이터 상태는 다음과 같다. 처음에는 Idle 상태에 있다가 도감 페이지 넘기기 버튼을 누르면 애니메이션이 수행되도록 했다.
파라미터로 Trigger 타입을 2개 만들어서 사용했다. Any State 에서 왼쪽 버튼이 눌리면 isLeftClicked 를 set 해서 도감을 넘기는 애니메이션이 적용되도록 했다. 반대도 마찬가지이다.

1.2 BookLeftAnim, BookRightAnim 애니메이션
도감 애니메이션을 위해 2개의 애니메이션을 만들었다.
1. BookLeftAnim
도감 왼쪽 버튼을 눌렀을 때 수행되는 애니메이션이다. Image 의 Sprite 를 이용해서 애니메이션을 만들었다.
기존에 찍어둔 도감 넘기기 애니메이션 Sprite 를 가져와서 넣었다.

2. BookRightAnim
도감 오른쪽 버튼을 눌렀을 때 수행되는 애니메이션. 위와 마찬가지로 Image 의 Sprite 를 이용해서 만들었다. 사진은 생략.
2. 스크립트
이번에 새로 만든 스크립트는 없고 BookController 를 수정했다.
2.1 BookController
1. 변수
다음과 같은 변수가 추가되었다.
bookUIs 는 도감 애니메이션이 수행될 때 책 속 UI 요소들이 안 보이도록 하기 위해 필요하고 anim 은 도감의 애니메이션을 수행시키기 위해 필요하다.
public GameObject[] bookUIs; // 책 애니메이션 수행시 책 속 UI 잠시 활성화 꺼지도록..
[Header("Animation")]
public Animator anim;
2. UpPageIdx(), DownPageIdx()
메서드를 수정했다. 크게 달라진 부분은 없고 StartBookAnim 메서드를 수행하는 부분이 추가되었다.
public void UpPageIdx()
{
if (pageIdx >= maxIdx - 1)
{
GameManager.instance.StartInfoPanel("마지막 페이지입니다.");
return; // 빠져나가기..
}
pageIdx++;
SetBookPanel();
StartBookAnim("right"); // 책 애니메이션 수행..
}
public void DownPageIdx()
{
if (pageIdx <= 0)
{
GameManager.instance.StartInfoPanel("처음 페이지입니다.");
return; // 빠져나가기..
}
pageIdx--;
SetBookPanel();
StartBookAnim("left"); // 책 애니메이션 수행..
}
3. StartBookAnim(string op)
op 에 맞는 애니메이션을 실행시키는 메서드이다.
애니메이션을 실행시켰으므로 도감 속 UI 를 안보이게 하기 위해서 활성화를 꺼줬다. 그리고 애니메이션이 수행되는 시간동안 기다리기 위해서 BookAnim 코루틴을 시작했다.
public void StartBookAnim(string op)
{
// 애니메이션 실행
if (op == "right")
anim.SetTrigger("isRightClicked");
else
anim.SetTrigger("isLeftClicked");
for (int i = 0; i < bookUIs.Length; i++)
bookUIs[i].SetActive(false); // 책 속 UI 활성화 끄기..
StartCoroutine(BookAnim());
}
4. BookAnim()
코루틴이다. 도감 애니메이션의 총 길이가 0.35 라 임의로 target 의 값을 0.4 로 설정해줬다. 해당 시간에 도달하면 비활성화 시켰던 UI 를 다시 활성화하고 빠져나가도록 했다.
private IEnumerator BookAnim()
{
float cur = 0;
float target = 0.4f;
while (cur < target)
{
cur += Time.deltaTime;
yield return null; // 다음 까지 기다림.
}
for (int i = 0; i < bookUIs.Length; i++)
bookUIs[i].SetActive(true); // 다시 활성화시키기ㅣ..
}
3. 결과물