바닥에 서 있기
Coddy Unity 여정의 물리와 게임플레이 섹션에 포함된 레슨. 63개 중 11번째.
모든 접촉에는 법선이 있습니다. 이는 길이가 1인 방향 벡터로, 접촉한 표면에 수직이며 그 표면에서 사용자 쪽 물체를 향해 바깥쪽을 가리킵니다. collision.GetContact(0)은 첫 번째 접촉 지점이고, 이 지점의 normal은 어느 쪽에 접촉했는지 알려줍니다. 평평한 땅에 서 있을 때는 (0, 1, 0)이고, 오른쪽 벽에 부딪혔을 때는 (-1, 0, 0)이며, 천장에 머리를 부딪혔을 때는 (0, -1, 0)입니다.
이 상자는 착지와 옆면 충돌을 구분해 줍니다.
void OnCollisionEnter(Collision collision)
{
Vector3 normal = collision.GetContact(0).normal;
if (normal.y > 0.5f)
{
Debug.Log("Landed on " + collision.gameObject.name);
}
else
{
Debug.Log("Bumped the side of " + collision.gameObject.name);
}
}검사는 정확히 1인지 확인하는 대신 normal.y > 0.5f를 사용합니다. 그래야 경사면도 땅으로 간주되기 때문입니다. 60도 경사면에서 y 값은 0.5이며, 이는 사람이 걸어 올라갈 수 있는 경사보다 더 가파릅니다. 지속되는 접촉을 처리하는 데 도움이 되는 메시지가 두 가지 더 있습니다. 접촉이 지속되는 동안 물리 업데이트 단계마다 OnCollisionStay가 실행되고, 접촉이 끝날 때 한 번 OnCollisionExit가 실행됩니다. 접촉이 끝나면 더 이상 닿아 있는 것이 없으므로 접촉 지점이 존재하지 않습니다. 따라서 그곳에서는 GetContact를 호출하지 마세요.
챌린지
쉬움플레이어는 걷고 점프할 수 있지만, 공중에서도 Space가 작동하므로 점프를 한 번씩 하며 하늘까지 올라갈 수 있고 벽 옆으로 뛰어내릴 수도 있습니다. (콜라이더에 마찰이 없는 재질이 적용되어 있어 벽에 붙는 대신 벽을 따라 미끄러져 내려옵니다.) 플레이어가 무언가 위에 서 있을 때만 점프하도록 만드세요.
bool grounded를 유지하세요. 플레이어가 접촉 법선이 위쪽을 향하는(y가 0.5 초과) 무언가에 닿아 있는 동안에는 true이고, 더 이상 닿지 않으면 false입니다.- Space를 눌렀고
grounded가 true일 때만 점프하세요. 공중에서 누른 입력은 무시하고 착지할 때까지 저장하지 않습니다.
Play를 눌러 두 번 점프하고 벽을 올라가 보세요. 그런 다음 Check를 누르세요.
직접 해보기
using UnityEngine;
public class Hopper : MonoBehaviour
{
public float speed = 4f;
public float jump = 6f;
private Rigidbody rb;
private bool jumpPressed;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
jumpPressed = true;
}
}
void FixedUpdate()
{
float h = Input.GetAxisRaw("Horizontal");
rb.linearVelocity = new Vector3(h * speed, rb.linearVelocity.y, 0);
if (jumpPressed)
{
rb.AddForce(Vector3.up * jump, ForceMode.Impulse);
jumpPressed = false;
}
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.