-
[유니티 2D 스터디] 애니메이션, 추가로 시네머신 살짝 공부쾌락없는 책임 (공부)/Unity 2021. 3. 16. 22:37반응형
애니메이션 전환
기존 들고있는 스프라이트의 모션이 빈약한 결과 애니메이션이 단 2개가 되었습니다. 크게 설명할것도 없이 방향키 입력을 받으면 isWalk = true, Player_idle에서 Player_walk가 됩니다. 이 과정에서 다시 멈추거나 점프를 하면 Player_idle 상태로 넘어가게 됩니다.
// Flip if (Input.GetButton("Horizontal")) spriteRenderer.flipX = Input.GetAxisRaw("Horizontal") == 1; // 걷는 애니메이션 if (Mathf.Abs(rigid.velocity.x) < 0.2f || jumpCount > 0) //속도가 0이라면 = 단위벡터가 0 anim.SetBool("isWalk", false); else anim.SetBool("isWalk", true);
시네머신을 통한 셀레스트같은 카메라 무브
이전 코드로 제어하는 카메라 무브보다 시네머신의 효과가 더 월등해 시네머신을 설치, 사용했습니다.
<시네머신 설치>
유니티 상단 Window 메뉴 > Package Manager > Package : Unity Registry로 설정 > Cinemachine 설치
- 설치 후 메뉴 상단에 시네머신 메뉴가 생기게 됩니다
위와 같은 효과를 내기 위해서는 우선 각 시네머신의 카메라에 '카메라가 갈 수 있는 범위'를 지정해 줘야 합니다. 그 방법은 아래 사진과 같습니다.
1. 시네머신의 인스펙터 창에서 CinemachineVirtualCamera > Extensions > Add Extension에서 Cinemachine Confiner 선택
2. Cinemachine Confiner의 Bounding Shape 2D 에 범위로 지정할 콜라이더를 추가하면 됩니다.
- 제가 알기로는 이 콜라이더에는 Polygon, TileMap만 가능
- 이 콜라이더는 Trigger로 설정을 해야 플레이어가 밀리는(?) 현상이 없습니다.
3. 이후 위 Follow를 Player로 지정해 주시면 됩니다.
그리고 이후 각 맵을 지정을 하고 현재 플레이어가 있는 맵을 제외하고 비활성화 해두시면 됩니다.
+ CM vcam : 시네머신 카메라입니다
+ Grid : 타일맵으로 만든 맵 입니다
+ CamArea : 위 방법으로 설정한 '카메라 영역'입니다. > 이건 활성화 해두셔야 합니다
이후 각 카메라 범위 오브젝트에(위에서는 CamArea에 해당) 아래 스크립트를 넣으면 됩니다.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class RoomCam : MonoBehaviour { public GameObject vituralCam; public GameObject Map; private void OnTriggerEnter2D(Collider2D other) { if(other.CompareTag("Player") && !other.isTrigger){ vituralCam.SetActive(true); Map.SetActive(true); } } private void OnTriggerExit2D(Collider2D other) { if(other.CompareTag("Player") && !other.isTrigger){ StartCoroutine(SetTF()); } } IEnumerator SetTF(){ yield return new WaitForSeconds(1f); vituralCam.SetActive(false); Map.SetActive(false); } }
<코드 설명>
- 변수
public GameObject vituralCam; public GameObject Map;
- virtualCam : 인스펙터에서 해당 맵에 배치된 시네머신을 넣으면 됩니다.
- Map : 인스펙터에서 해당 맵의 구성 요소들을 넣으면 됩니다.
-실제 기능
private void OnTriggerEnter2D(Collider2D other) { if(other.CompareTag("Player") && !other.isTrigger){ vituralCam.SetActive(true); Map.SetActive(true); } } private void OnTriggerExit2D(Collider2D other) { if(other.CompareTag("Player") && !other.isTrigger){ StartCoroutine(SetTF()); } } IEnumerator SetTF(){ yield return new WaitForSeconds(1f); vituralCam.SetActive(false); Map.SetActive(false); }
플레이어가 영역에 들어온걸 감지하면 카메라와 맵의 요소들을 SetActive(true) 해줍니다. 이후 플레이어가 나가면 1초 뒤 카메라와 맵을 false처리 해줍니다. 만약 1초의 여유 시간을 주지 않으면 카메라가 전환 과정에서 맵이 바로 없어져 부자연스러운 전환이 됩니다.
+ 생각해보니 Invoke를 사용해도 될 것 같습니다. 뭐가 더 나은지는 제 지식으로는 모르겠습니다.
<게임 화면>
이런식의 카메라 전환이 됩니다. 플레이어가 잘려 보이는데 이는 카메라 영역을 조정하면 개선될 문제입니다.
<눈떠보니 부족한 점>
1. 시네머신 저렇게 사용하면 메모리 관리가 잘 되는 편인가?
- 이걸 씬에 수를 제한 하고 씬을 이동하면서 Load하는건 메모리 관리가 수월하나?
2. 셀레스트 맵 이동시 잠깐 멈추는 효과가 있는데 timescale을 통해서 할 수 있는가?
반응형'쾌락없는 책임 (공부) > Unity' 카테고리의 다른 글
유니티 텍스트 메쉬 프로 한글 적용하기 - Unity TextMeshPro korean (1) 2021.03.27 유니티 2D 시네머신 사용기 - 씬 이동시 플레이어를 추적하는 카메라 (2) 2021.03.26 유니티 인게임 메뉴 만들기 - 게임 일시정지, 재시작 등 (0) 2021.03.14 유니티 2D 시네머신 사용기 - 맵 이동시, 카메라 전환, confiner change (2) 2021.03.13 [유니티 2D 스터디] 캐릭터 이동, 벽 충돌처리 (0) 2021.03.11