Update()와 FixedUpdate()의 차이

  • Update : 매 프레임마다 호출되는 메서드. 게임 로직의 주요 업데이트가 이루어진다. 매 프레임 호출되는 만큼 불필요한 계산을 피하고 최적화하기 위해 사용하지 않으면 지워주는 것이 좋다.
  • FixedUpdate : 물리 엔진 업데이트 시 호출되는 메서드. 물리적인 시뮬레이션에 관련된 작업을 처리할 때 사용된다. Fixed Timestep에 설정된 값에 따라 일정한 간격으로 호출된다.

스크립트 라이프 사이클

 

Update는 불규칙한 호출임으로 물리엔진 충돌검사 등이 제대로 안될 수 있기 때문에 물리적인 시뮬레이션에 관련된 작업을 처리할 때는 FixedUpDate를 사용하는 것이 좋다.

 

리듬게임의 노트에 판정을 위한 Collider가 붙어있으므로 FixedUpDate를 사용한다.

private float noteSpeed;

private void FixedUpdate()
{
    Move();
}

private void Move()
{
    transform.position += Vector3.down * noteSpeed * Time.fixedDeltaTime;
}

 

 

노트의 정확한 판정을 위해 double을 사용하면 어떨까 해서 적용해보니 Vector3 및 double 형식의 피연산자에 적용할 수 없다고 뜬다.

float에 비해 double의 소수점 범위가 더 크기 때문에 발생하는 문제가 아닐까 예측했는데 double의 연산자 오버로딩이 없어서 그런 것이었다. 즉, 유니티에서 Vector3에 곱하는 방법을 명시하지 않은 것이다.

 

 

<Wire Frame>

게임 컨셉은 아쿠아리움으로 노래를 Perfect 등급으로 깰 때마다 새로운 물고기를 얻는 방식으로 계획했다.

 

 

<구현 계획>

  • 노트 생성
    • 여러 곡의 리듬에 맞는 노트 생성
    • 일정 게이지 이상 노트 획득 시 아쿠아리움 내에 먹이 생성
    • 오브젝트 풀링 활용
  •  아쿠아리움 구성
    • 물고기 인벤토리씬 : 물고기 장착 해제 시 맵 내에 물고기 활성화/비활성화
    • 물고기의 움직임 구현 / 애니메이션 또는 AI로 구현해 보기
    • 어항 크기 조절 < 시간이 남으면 추가로 구현
  • 리듬 게임 페이즈
    • 노트가 떨어지는 트랙 생성
    • 노트와 판정선 사이의 충돌 판정(Perfect,Great,Good,Bad,Miss)
    • 콤보 정보 기록(UI 연동)
  • UI / UX
    • 노트 히트 콤보 기록
    • 점수 기록
    • LIfe 게이지 기록
    • 물고기 먹이 게이지
  • 게임 엔딩 조건
    모든 곡을 퍼펙트로 클리어하여 전설의 물고기 모두 수집 시 게임 엔딩/ 고래 수집

나는 노트 생성 부분을 맡았으며 오브젝트 풀 방식을 완벽히 이해하고 사용하여 코드적인 부분 어필하는 것이 목표이다.

 

 

이번 팀과제는 리듬게임을 하기로 했다.

휴일이 길어서 그동안 간단하게 공부할 것들을 정하고 게임의 방향성과 계획을 짰다.

 

<필수 구현 계획>

노래에 맞게 노트 생성(JSON을 통해 실시간으로 직접 노트를 찍거나 단순히 BPM에 맞게 노트 생성)

노트 타격 판정

타격에 따른 애니메이션

콤보 및 점수

 

<선택 구현 계획>

사용자 모드(사용자가 원하는 노래 추가 및 노트 생성)

일정 콤보가 되면 피버 타임 구현

음량 조절

 

전체적으로 8Bit 컨셉으로 노래 또한 8Bit로 몇 가지 만들 생각이다. 에셋은 각자 원하는 것을 하나씩 가져와서 상의 후 결정하기로 했다.

주말에 이론강의 + 수준별 강의를 정주행하고 하고 개인 과제 때 오브젝트 풀에 대해 정확히 이해하지 못하고 사용한 것 같아서 좀 더 공부해야겠다. 개인과제에서 전체적인 설계가 많이 무너졌기 때문에 초기에 설계를 확실히 짜고, 특히 이전 강의에 나왔던 애니메이션과 FSM의 스크립트 구조를 공부해볼 생각이다.

나름 여러 번 팀과제를 했지만 3D는 처음이라 무엇이 문제인지 모르겠지만 어쨌든 해결(?)한 문제들과 재밌는 버그가 많았던 것 같다.

 

트러블 슈팅

  • Scriptable Object 연결끊김

프로젝트를 병합하는 과정에서 자원과 구조물 등의 Scriptable Object 연결이 끊겼다. 다시 연결해도 Missing이 뜨길래 Scriptable Object를 상속받은 스크립트 파일의 위치를 옮겼다가 다시 원래대로 옮기니까 해결되었다. meta 파일 때문인 것 같은데 정확한 원인은 모르겠다.

 

  • 외부 객체의 컴포넌트 참조

프로젝트 작업에서 프리팹으로 오브젝트들을 관리했는데 마찬가지로 병합하는 과정에서 연결이 끊겨서 코드로 연결시켰다.

 

  • 낚시대로 자원 채집

Raycast를 충돌체로 설정해서 모든 충돌체와 상호작용하는 문제였는데 웃겨서 넣었다.

나무도 낚고
돌도 낚고 ㄷㄷ 강태공

 

 

하고 싶은 것들이 많았지만 마감은 맞춰야하니 타협하며 적정선에서 마무리한 것 같다. 마지막 날은 버그 찾는데 시간을 보냈는데 배울 점도 많았고 재밌었다.

+ Recent posts