키네마틱 바디
Coddy Unity 여정의 물리와 게임플레이 섹션에 포함된 레슨. 63개 중 6번째.
움직이는 플랫폼, 승강기, 문은 단단한 물체처럼 충돌해야 하지만, 그 위에 무엇이 올라오더라도 떨어지거나 밀려나서는 안 됩니다. 이런 물체를 키네마틱 바디라고 합니다. rb.isKinematic = true로 설정하면 중력, 힘, 충돌에 의해 더 이상 움직이지 않습니다. 콜라이더는 여전히 충돌 판정에 포함되므로, 동적 바디(물리 시뮬레이션에 의해 움직이는 바디)는 벽에 부딪히듯 이 바디에 부딪히고 바닥에 서듯 그 위에 설 수 있습니다. 키네마틱 바디는 rb.MovePosition을 사용해 직접 움직입니다.
이 승강기는 top에 도달할 때까지 lift m/s의 속도로 올라갑니다. MovePosition은 이 스텝이 끝난 뒤의 위치를 인수로 받으므로, 코드에서는 Time.fixedDeltaTime을 사용해 한 스텝 동안 이동할 거리를 더합니다.
void Start()
{
rb = GetComponent<Rigidbody>();
rb.isKinematic = true;
}
void FixedUpdate()
{
if (rb.position.y < top)
{
rb.MovePosition(rb.position + Vector3.up * lift * Time.fixedDeltaTime);
}
}transform.position을 설정하면 안 되는 이유는 무엇일까요? 그렇게 하면 물체가 순간이동하고, 물리 엔진은 물체가 움직였다는 사실을 알지 못합니다. 그러면 미끄러지는 플랫폼 위의 상자는 플랫폼을 따라가지 않고 뒤에 남게 됩니다. MovePosition은 해당 스텝 동안 바디가 새 위치로 이동했다고 물리 엔진에 알려 주므로, 바디가 접촉하는 물체가 적절히 함께 움직이고 밀려납니다. 키네마틱 바디에는 AddForce가 아무 효과도 없으며, 키네마틱 바디는 정적 콜라이더나 서로 간에 충돌하지 않습니다. 동적 바디만 키네마틱 바디와 부딪힙니다.
챌린지
쉬움바지선은 용암 위에 떠 있고, 화살표를 누르면 speed m/s(Inspector에서 2) 속도로 x축을 따라 좌우로 움직여야 합니다. 현재 바지선의 Rigidbody는 일반 Rigidbody이므로 용암 속으로 떨어집니다.
- 게임이 시작되면 바지선을 키네마틱으로 만들어 공중에 떠 있게 하고, 바지선에 부딪히는 어떤 물체도 바지선을 밀어내지 못하게 하세요.
- 원시 Horizontal 축 입력을 사용해
FixedUpdate()에서MovePosition으로 바지선을 움직이세요.
Play를 눌러 바지선을 움직인 다음 Check를 누르세요.
직접 해보기
using UnityEngine;
public class Barge : MonoBehaviour
{
public float speed = 2f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
// 바지선을 키네마틱으로 설정합니다
}
void FixedUpdate()
{
// 화살표 키로 x축을 따라 미끄러지듯 움직입니다
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.