[Unity] 존 레몬의 공포 체험 (1)

Kim Yuhyeon·2023년 2월 13일
0

게임개발

목록 보기
71/135

시작하기


참고

https://learn.unity.com/tutorial/jon-remonyi-gongpo-ceheom-sijaghagi?uv=2020.3&projectId=633563fcedbc2a7b67ba2f8f#633564e1edbc2a7c4195fe61

에셋

https://assetstore.unity.com/packages/templates/tutorials/3d-beginner-tutorial-resources-143848

Skinned Mesh Renderer

캐릭터를 나타나게 하는 컴포넌트입니다.

모델은 삼각형의 메시로 구성되어 있으며 Mesh Renderer는 이 메시를 렌더링하여 볼 수 있도록 합니다. Skinned Mesh Renderer는 Mesh Renderer의 특별한 유형으로 모델의 뼈대 전체의 위치와 회전을 기반으로 메시 모양을 변경할 수 있게 해 줍니다.
이러한 뼈대는 모델의 자식 게임 오브젝트입니다.
JohnLemon의 뼈대는 모두 Root 게임 오브젝트의 자식입니다.

각각의 게임 오브젝트는 JohnLemon 바디의 일부를 구성

LeftForeArm의 Rotation 90으로 하면 팔이 저렇게 꺾인다

하위오브젝트 다 펼치는/접는 단축키 : Alt 누른채로 부모 오브젝트 화살표

프리팹

Auto Save 체크박스를 비활성화합니다.
활성화할 경우 속도가 느려집니다.
프리팹을 변경한 내용을 직접 저장할 수 있도록 Save 버튼이 표시됩니다.

물리 반응

RigidBody

Rigidbody 컴포넌트는 게임 오브젝트를 이동 가능한 물리 시스템의 한 부분으로 표시합니다.
캐릭터가 움직이고 벽을 통과하지 못하도록 하여 물리 시스템의 일부로 만드는 것이 목표이기 때문에 JohnLemon 게임 오브젝트에 Rigidbody 컴포넌트가 필요합니다.

루트 모션

애니메이션은 특정 계층 구조 내에서 모든 게임 오브젝트를 이동하고 회전하는 데 사용됩니다.
이러한 이동과 회전의 대부분은 부모 오브젝트에 연관되어 발생합니다.
하지만 계층 구조의 부모 게임 오브젝트에는 부모가 없기 때문에 움직임에 영향을 받지 않습니다.
이 부모 게임 오브젝트는 루트라고도 불리며, 이 오브젝트의 움직임을 루트 모션이라고 부릅니다.

주의 :
JohnLemon 프리팹의 계층 구조에서 루트라고 불리는 게임 오브젝트는 골격의 루트를 가리키는 것이며, 실제 루트 게임 오브젝트를 가리키는 것이 아닙니다.
루트 게임 오브젝트는 Animator 컴포넌트가 위치한 게임 오브젝트를 가리키며 이 경우에는 JohnLemon이라는 게임 오브젝트가 이에 해당합니다.

업데이트 루프

영화와 TV의 원리와 마찬가지로, 게임에서도 화면에 이미지가 표시되고
이 이미지가 초 단위로 여러 번 바뀌면서 마치 움직이는 것처럼 보입니다.
프레임 : 이러한 이미지들
렌더링 : 프레임이 화면에서 표현되도록 하는 과정

게임에서는 사용자가 다음 상황에 영향을 미치기 때문에 다음 이미지에 대한 경우의 수가 굉장히 많습니다.
각각의 이미지는 사용자 입력에 따라 산출되어야 하고 사용자의 선택은 매우 짧은 순간마다 발생하기 때문에, 다음에 무엇을 표시할지 결정하는 프로그래밍도 이와 동일한 속도로 작동합니다.
이것을 업데이트 루프라고 합니다.

프레임이 표시될 때마다 많은 일들이 차례로 발생합니다.
현재로서는 커스텀 컴포넌트가 업데이트 메서드를 호출하며
화면에 새로운 이미지가 렌더링된다는 것만 알면 됩니다.

이러한 업데이트의 길이는 계산 및 렌더링의 복잡도에 따라 다양합니다.

하지만 모든 물리 작업을 실행하는 또 다른 루프가 있습니다.
이 루프는 업데이트 빈도에 변화가 없다는 것이 특징이며 이 때문에 FixedUpdate라고 부릅니다.

Animator 컴포넌트는 업데이트 수행 시점을 변경할 수 있습니다.
기본적으로 Animator 컴포넌트는 렌더링에 따라 업데이트를 수행합니다.
이는 애니메이터가 Update에서 캐릭터를 이동하고
동시에 리지드바디가 Fixed Update에서 캐릭터를 이동함을 의미합니다.

캐릭터의 이동 문제 해결

현재 캐릭터의 애니메이션에는 수직 루트 모션이 없습니다.
하지만 JohnLemon이 무언가와 충돌한 후 수직으로 이동하게 될 수도 있습니다.
이동을 중단하는 방법이 몇 가지 있습니다.
Rigidbody 컴포넌트에서 Use Gravity를 비활성화하는 것입니다.

이 방법을 사용하면 캐릭터가 아래로 떨어지는 것을 막을 수는 있지만 확실한 방법은 아닙니다. Use Gravity를 비활성화하더라도 캐릭터는 충돌로 인해 아래로 떨어지거나 위로 올라갈 수 있
습니다.
따라서 이러한 상황을 막으려면 물리를 통해 캐릭터의 이동을 제한해야 합니다.

이러한 Constraint 프로퍼티는 리지드바디가 이동할 수 있는 방향을 제한합니다.

좌표

  • x축: 빨간색
  • y축: 초록색
  • z축: 파란색

씬에서 부모가 없는 게임 오브젝트는 모두 씬의 원점(0, 0, 0)을 기준으로 배치됩니다.
부모가 있는 게임 오브젝트는 모두 부모를 기준으로 위치가 정해집니다.
하지만 게임 오브젝트는 회전 가능하기 때문에 자식의 상대 또는 로컬 위치는 부모의 회전된 좌표를 따릅니다.

Rigidbody Constraints가 나타내는 것이 바로 이 로컬 좌표(또는 축)입니다.

  • x축(빨간색): 캐릭터의 오른쪽
  • y축(초록색): 캐릭터의 위쪽
  • z축(파란색): 캐릭터의 앞쪽

캐릭터는 앞과 좌우로 움직여야 하기 때문에 x 또는 z 위치를 제한할 필요는 없습니다.
하지만 위아래로 움직이지는 않아야 하기 때문에 이 움직임을 중단하려면
Freeze Position Y 체크박스를 활성화합니다.

x축을 중심으로 회전한다면 위나 아래를 향한 채로 누워 있는 것처럼,
z축을 중심으로 회전한다면 옆쪽으로 누워 있는 것처럼 보일 것입니다.

JohnLemon이 위와 같은 방식으로 이동해서는 안 되므로 Freeze Rotation X 및 Z 체크박스를 활성화합니다.
또한 JohnLemon이 몸을 돌릴 수 있도록 해야 하므로 Freeze Position Y 체크박스를 활성화 상태로 유지합니다.

이제 Rigidbody 컴포넌트가 설정되어 캐릭터가 물리 시스템에 반응하게 됩니다.

콜라이더

하지만 씬에서 물리적인 존재감을 갖는 것은 아니기 때문에 무언가가 캐릭터에 부딪히거나 캐릭터가 무언가에 부딪칠 수는 없습니다.
씬에서 캐릭터가 물리적 존재감을 갖게 하려면 콜라이더가 필요합니다.

0개의 댓글