ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [유니티 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);
    시네머신을 통한 셀레스트같은 카메라 무브

    셀레스트(풍월량 유튜브) : https://youtu.be/lKtdutuIXYM

     이전 코드로 제어하는 카메라 무브보다 시네머신의 효과가 더 월등해 시네머신을 설치, 사용했습니다.

     

    <시네머신 설치>

    유니티 상단 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을 통해서 할 수 있는가?

    반응형

    댓글

Designed by Tistory.