본문 바로가기

Unity/Ruby's Adventure

Unity] 루비의 모험 5. 월드 인터랙션 - 이동 제한

1) Rigidbody2D 컴포넌트를 보유한 게임 오브젝트에 대해서만 물리 연산을 수행한다.

2) Rigidbody 컴포넌트 - 3D용

3) 기본값, 중력 비활성화하기

Rigidbody2D 컴포넌트의 중력Gravity Scale Property의 값을 0으로 설정한다.

+) 탑다운(톱다운): 하늘에서 땅으로 수직으로 내려다보는 시점으로 주변의 상황을 전체를 한눈에 볼 수 있는 시점

4) 씬에 배치된 단일 프리팹 인스턴스를 변경함으로써 프리팹을 통해 생성된 또 다른 게임 오브젝트를 오버라이드할 수 있다. 만약 프리팹의 값을 변경한다고 해서, 오버라이드한 단일 프리팹 인스턴스의 값까지 변경되지 않는다.

게임 오브젝트의 인스펙터 헤더>Overrides로 변경사항과 변경 사항에서 다시 되돌아갈지(Revert All)과 프리팹까지 변경할지(Apply All)로 간단하게 변경할 있다.

5) 콜라이더(Colliders): 사각형, 원 등의 단순한 모양으로 되어있으며, 

물리 시스템이 게임 오브젝트의 대략적인 외형을 가늠하여 충돌 연산을 수행할 수 있도록 해줍니다.

(물리 시스템에게 게임 오브젝트의 어떤 부분이 솔리드인지 알려준다.)

6) 컴포넌트 추가하기에서 콜라이더(Colider)를 선택한다. 콜라이더를 통해 물리 시스템에 적용되는 루비의 형상(테두리)를 볼 수 있다.

Rigidboy 컴포넌트가 없더라도 Rigidboy컴포넌트가 있는 게임오브젝트와 상호작용(충돌 등)을 위해 Colider 컴포넌트를 추가한다.

7) 루비 회전 문제 해결하기 Constraints(제약, 압박)>Freeze Rotation 활성화

8) 물리 시스템은 콜라이더만 포함하고 있는 씬의 단순 복사본을 사용한다. 

사용자가 계속 루비를 상자 안으로 이동시키려고 하고 물리 시스템은 계속해서 루비를 뒤로 밀어내게 되는데,

 코드를 통해 명령한 내용과 물리 시스템의 수행 작업이 충돌하게 되면서 떨림 현상이 일어난다.

9) GameObject Transform이 아니라 Rigidbody를 이동시켜야 하며, 

물리 시스템이 Rigidbody 위치에 맞추어 게임 오브젝트 위치를 동기화해야 합니다.

모든 게임 오브젝트는 트랜스폼을 보유하고 있어서 모든 스크립트에서 트랜스폼 변수를 사용할 수 있다. 

하지만 모든 게임 오브젝트가 Rigidbody를 보유하고 있는 것은 아니므로 해당 변수를 직접 생성한다.

10) GetComponent(); 

스크립트가 부착된 게임 오브젝트에 존재하는 Rigidbody2D를 달라고 요구함.

Start함수 안에 넣어서 게임 시작 시 한 번만 실행되도록.

rigidbody2d.MovePosition(position);

Rigidbody를 원하는 위치로 이동하고, 이동 중 다른 콜라이더와 충돌하면 멈추게 됨.

11) Box Collider 2D> Edit Collider로 콜라이더의 사이즈를 조절한다

Tip) 캐릭터가 상자 뒤로 갈 수 있도록 하는 게 자연스럽기 때문에 상자의 하단 부분을 솔리드 상태로 만드는 것이 좋다. 마찬가지로 캐릭터가 충돌 전에 게임 오브젝트 위로 살짝 이동할 수 있어야 하기 때문에 콜라이더는 루비의 다리쪽에만 배치한다.

12) Tilemap Collider 2D 컴포넌트: 각 타일에 충돌정보를 저장하거나 타일맵 콜라이더가 충돌 설정된 모든 타일에 콜라이더를 생성한다.

Tilemap Colider 2D 컴포넌트를 추가했을때 자동으로 모든 타일이 충돌 설정된다.

13) 물리 시스템 연산이 무거워거나 콜라이더 사이의 미세한 틈에서 오류가 발생하는 등의 문제를 해결하기 위해 Composite Collider 2D 컴포넌트를 사용한다. 

이 컴포넌트는 오브젝트 콜라이더(또는 오브젝트의 자식에 있는 콜라이더)를 통합해 하나의 거대한 콜라이더를 만든다.

Rigidbody2D>Body Type>Static: 월드상에서 이동이 멈춥니다. 

또한 물리 시스템이 Rigidbody가 움직일 수 없다는 사실을 인지하여 연산을 최적화하는 데에도 도움이 된다. 

애초에 타일맵 자체가(현재에서는) 이동이 필요없는 하나의 고정된 타일이니까 static 사용!