[Unity] 24. 애니메이션 동기화 & PlayerPrefs (저장)

치치·2025년 3월 28일
0

Unity

목록 보기
26/27
post-thumbnail

오늘 구현한 것

  1. 캐릭터가 장애물에 닿으면 Die()애니메이션이 실행된 뒤 키 입력을 받을 수 없게해야한다 → 게임매니저가 false가 되면 return 조건을 InputManager에 넣어주기

  2. 캐릭터가 Die() 조건이 되면, 시네마틱 카메라가 캐릭터를 바라보게 설정 → 시네머신 버츄얼 카메라에 LookAt 프로퍼티를 캐릭터로 설정 (Transform)

  3. 스피드 매니저의 스피드 증가에 따른 애니메이션 동기화 → 스피드 매니저의 속도가 증가할수록 캐릭터의 애니메이션도 싱크에 맞게 속도 증가
    → 애니메이션 속도 증가 함수는 캐릭터.cs에서 작성 (애니메이션을 갖고있는 .cs이기 때문)
    → 도로 : 30 → 60까지 5초에 2.5씩 증가 / 캐릭터 : 1 → 2 까지 증가해야함
    → 변하는 속도값 / 초기 속도값으로 계속 갱신

  4. 도로의 스피드가 증가할때마다 캐릭터 애니메이션 속도 증가가 호출되게 해야한다SpeedManager는 타이틀씬에 있지만, Runner 오브젝트는 게임씬에 존재한다
    → 씬이 이동하면 Runner 게임 오브젝트를 찾거나, Runner컴포넌트가 부착된 오브젝트를 찾는다
    → 스피드 매니저의 스피드 값이 증가한 뒤 애니메이션 함수 호출

  5. 데이터를 저장하는 PlayerPrefs를 사용하여 최고 시간 기록하기


InputManager에서 입력 못받게 처리하기

  • 게임매니저 false가 되면 키 입력 못받게 처리


CinemachineVirtualCamera를 사용하여 LookAt 프로퍼티 사용해보기

  • Runner 스크립트에서 시네머신 버츄얼 카메라를 에디터에서 할당
  • CinemachineVirtualCamera클래스는 using Cinemachine 선언 필수


LookAt 내부 구조

LookAt 프로퍼티 내부구조

  • 시네머신 버츄얼 카메라의 LookAt()

  • 내부 구조는 프로퍼티로 작성되어있다

  • LookAt을 사용하여 set으로 벨류값(Transform타입)을 할당한다

  • set : 외부에서 할당받은 벨류값을 m_LookAt에 저장한다

  • 벨류는 Transform 타입이다LookAtTransform을 통해 특정 오브젝트나 위치를 바라보기 때문에 Transform 타입이 아니면 할당이 불가능

  • get : m_LookAt을 반환

  • m_LookAt에 값을 저장하는 형식이라 대입형식이다


코드 작성

→ 캐릭터가 죽으면 카메라가 캐릭터를 바라보게 함

Runner 스크립트가 부착된 게임 오브젝트의 위치값 : transform을 할당한다

Die()함수 내부에 작성


  • LookAt이 들어있는 시네머신 카메라를 에디터에 할당하기

애니메이션 스피드 증가

  • 스피드 매니저의 스피드가 5초마다 증가하는데, 이때마다 캐릭터 애니메이션 속도도 증가 하게 하려면 이벤트를 사용하거나 직접 참조를 통해 호출

  • Runner 스크립트에 본인의 애니메이션을 가지고 있으니 애니메이션 스피드 조정 함수는 Runner 스크립트에 작성

  • 애니메이션 동기화 함수 (변화하는 스피드 값 / 초기 스피드 값(30))

  • 스피드 매니저에서 읽기전용으로 초기 스피드값을 정해두고 Runner에서 가져다가 쓰기
    → 스피드는 1 → 2 / 도로 스피드는 30 → 60 이기 때문

  • 씬이 로드되면 게임 씬의 하이라키창에서 Runner 게임 오브젝트를 찾아서 컴포넌트 가져오기
    Runner에 작성해둔 함수를 호출하기 위해서
    SpeedManager는 타이틀씬에 존재하고, 싱글톤으로 게임씬에서도 파괴되지 않는다.
    Runner 게임 오브젝트는 게임 씬에만 존재하기 때문에 씬이 로드될때 바로 Runner 오브젝트를 찾으려고 하면 에러 발생 (없으니까 null)

  • 스피드 증가 함수에서 애니메이션 스피드 증가 함수 호출


Playerprefs

  • 유니티에서 제공해주는 데이터 관리 클래스(데이터 저장 및 불러오기 가능)
    → 데이터 자료형은 int float string만 가능하여 저장하고 로드하는 기능을 제공한다

Set + 원하는 자료형
ex) SetInt(KEY, VALUE) : 값을 저장

Get + 원하는 자료형
ex) GetInt(KEY); : 키 값을 반환



Playerprefs의 단점

  1. 플랫폼에 따라 저장위치와 형식이 다르다

  2. 데이터 손실의 위험 → 앱 삭제하면 PlayerPrefs의 데이터가 모두 사라진다

  3. 대용량 데이터 저장은 부적합

  4. 대용량이나 암호화된 파일을 저장하려면 JSON을 사용하자!


playerprefs의 내부 구조

Playerprefs정적 메서드를 가진 일반 클래스

  • MonoBehaviour를 상속받지 않기 때문에 클래스 이름으로 바로 정적메서드 호출가능

  • TimeManagerPlayerPrefs 값을 저장하고 반환하는 함수 작성 SetTime(저장될 시간)

  • Watch클래스에서 호출해서 사용하기

→ 게임이 종료되면 현재 시간을 Playerprefs에 저장하기

→ 게임이 완전히 종료되고 난 후 다시 실행해도 이전 기록(시간)이 저장되어있다

  • 위의 BestTime은 현재 베스트 시간

  • 아래의 Current Time은 방금 플레이 한 기록 → 게임을 다시 실행하면 이 값이 BestTime으로 갱신된다



유니티 제공 - 플라스틱scm과 글루온

  • 협업에서 유용하게 사용할 수 있는 유니티 특화 시스템

  • 아티스트 직군을 위해 제공되는 Gluon Mode : 대용량 파일 다루기에 특화되어있고 단순한 UI로 쉽게 작업할 수 있다

여러 VCS (Version Control System)

  1. 분산형 - Git
  2. 중앙집중형 - SVN


유니티 스마트 병합 (머지 툴)
참고 : https://velog.io/@jaehyeoksong0/Plastic-SCM-1

profile
뉴비 개발자

0개의 댓글