플랫폼 타기
Coddy Unity 여정의 실제 게임 만들기 섹션에 포함된 레슨. 60개 중 51번째.
CharacterController는 자신이 서 있는 물체에 실려 이동하지 않습니다. 움직이는 플랫폼 위에 있으면 제자리에 머물러 플랫폼이 아래에서 미끄러져 나갑니다. transform.position을 옮겨도 소용없습니다. 다음 Move가 물리 엔진이 마지막으로 감지한 위치에서 시작해 변경 사항을 되돌리기 때문입니다.
따라서 플레이어는 플랫폼의 이동량을 자신의 이동량에 더합니다. OnControllerColliderHit(ControllerColliderHit hit)는 Move가 접촉하는 각 콜라이더마다 실행됩니다. 아래쪽에서 발생한 충돌의 경우 hit.normal.y는 1에 가깝습니다. 상자를 같은 방식으로 운반하는 페리의 예:
private Ferry ferry;
void OnControllerColliderHit(ControllerColliderHit hit)
{
if (hit.normal.y > 0.7f && hit.gameObject.TryGetComponent(out Ferry f))
{
ferry = f;
}
}챌린지
중급플레이어가 움직이는 플랫폼을 타고 이동하게 만드세요.
Player에서private MovingPlatform platform;과OnControllerColliderHit을 추가하세요.hit.normal.y > 0.5f이고 오브젝트에MovingPlatform이 있으면 해당 오브젝트를platform에 저장하세요.Update()에서(move + velocity) * Time.deltaTime을Vector3 motion에 넣으세요.platform != null이면platform.delta를 더하고platform = null로 설정하세요.controller.Move(motion)을 호출하세요.
‘플레이’를 누르고 플랫폼 위로 점프하세요. 플랫폼이 플레이어를 실어 나릅니다. 그런 다음 ‘확인’을 누르세요.
직접 해보기
using UnityEngine;
using UnityEngine.InputSystem;
public class Player : MonoBehaviour
{
[SerializeField] private float speed = 5f;
[SerializeField] private float jumpHeight = 1.5f;
[SerializeField] private float gravity = -9.81f;
private CharacterController controller;
private InputAction moveAction;
private InputAction jumpAction;
private Vector3 velocity;
void Start()
{
controller = GetComponent<CharacterController>();
moveAction = InputSystem.actions.FindAction("Move");
jumpAction = InputSystem.actions.FindAction("Jump");
}
void Update()
{
if (controller.isGrounded && velocity.y < 0f)
{
velocity.y = -2f;
}
Vector2 input = moveAction.ReadValue<Vector2>();
Vector3 move = new Vector3(input.x, 0f, input.y) * speed;
if (jumpAction.WasPressedThisFrame() && controller.isGrounded)
{
velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity);
}
velocity.y += gravity * Time.deltaTime;
controller.Move((move + velocity) * Time.deltaTime);
}
}
실제 게임 만들기의 모든 레슨
직접 연습해 보세요: Unity 플레이그라운드