키네마틱 바디
Coddy Unity 여정의 물리와 게임플레이 섹션에 포함된 레슨. 71개 중 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가 아무 효과도 없으며, 키네마틱 바디는 정적 콜라이더나 서로 간에도 충돌하지 않습니다. 동적 바디만 키네마틱 바디와 충돌합니다.
챌린지
쉬움바지선을 용암 위에 매달고 화살표로 움직이세요.
Start()에서rb.isKinematic = true;로 설정하세요.FixedUpdate()에서float h = Input.GetAxisRaw("Horizontal");를 읽고rb.MovePosition(rb.position + Vector3.right * h * speed * Time.fixedDeltaTime);를 호출하세요.
‘플레이’를 누르고 움직여 보세요. 바지선은 공중에 매달리고 드론은 튕겨 나갑니다. 그런 다음 ‘확인’을 누르세요.
직접 해보기
using UnityEngine;
public class Barge : MonoBehaviour
{
public float speed = 2f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
// 바지선을 키네마틱으로 설정합니다
}
void FixedUpdate()
{
// 방향키로 x축을 따라 바지선을 이동시킵니다
}
}
물리와 게임플레이의 모든 레슨
직접 연습해 보세요: Unity 플레이그라운드