물리를 위한 FixedUpdate
Coddy Unity 여정의 물리와 게임플레이 섹션에 포함된 레슨. 71개 중 4번째.
Unity는 프레임 속도와 관계없이 0.02초(Time.fixedDeltaTime)씩 고정된 물리 단계로 물체를 움직입니다. 초당 50회입니다. FixedUpdate()는 각 단계 바로 전에 실행됩니다. Update()는 그려지는 프레임마다 한 번 실행되며, 초당 30회, 60회 또는 144회 실행될 수 있습니다. 초당 144회일 때는 대부분의 프레임에서 물리 단계가 전혀 없고, 느린 컴퓨터에서는 한 프레임 동안 물리 단계가 두 번 실행될 수도 있습니다.
여기서 두 가지 규칙을 알 수 있습니다. Update()에서 힘을 더하면 프레임마다 한 번씩 더해지므로, 빠른 컴퓨터일수록 더 강하게 밀게 됩니다. 시간에 걸쳐 작용하는 힘은 FixedUpdate()에 넣으세요. 그리고 GetKeyDown은 한 프레임 동안만 true입니다. 그 프레임에 물리 단계가 없으면 FixedUpdate()는 입력을 감지하지 못하고 키 입력은 사라집니다. 따라서 Update()에서 입력을 읽고, bool에 저장한 다음, FixedUpdate()에서 처리하세요. 이 보트는 일정한 바람에 밀리며 클릭하면 옆으로 질주합니다.
private bool dashQueued;
void Update()
{
if (Input.GetMouseButtonDown(0))
{
dashQueued = true; // 클릭을 기억해 둔다
}
}
void FixedUpdate()
{
rb.AddForce(Vector3.forward * wind); // 매 단계마다 일정하게 밀어준다
if (dashQueued)
{
rb.AddForce(Vector3.right * 4f, ForceMode.Impulse);
dashQueued = false; // 클릭 한 번에 대시 한 번
}
}사용한 뒤 bool을 초기화하는 것도 중요합니다. true인 채로 두면 매 단계마다 질주하게 됩니다. 개구리의 점프처럼 단일 충격량은 Update()에서 바로 더할 수도 있습니다. bool을 사용하면 모든 힘을 한곳에 모아, 함께 작용하는 힘 옆에서 처리할 수 있습니다. 누르고 있는 키(GetKey, GetAxis)는 순간이 아니라 상태를 나타내므로 FixedUpdate()에서 바로 읽을 수 있습니다. FixedUpdate() 안에서 Time.deltaTime은 단계의 시간인 0.02를 반환합니다.
챌린지
쉬움썰매의 두 가지 작업을 올바른 메서드에 넣으세요.
- 두 화살표
if블록을Update()에서FixedUpdate()로 옮기세요. private bool hopPressed;를 추가하세요.Update()에서Input.GetKeyDown(KeyCode.Space)일 때 이 값을true로 설정하세요.FixedUpdate()에서hopPressed가 설정되어 있으면 충격량을 더한 다음, 이 값을false로 설정하세요.
‘플레이’를 누르세요. 화살표 키를 누르면 고르게 밀리고, 스페이스 키를 누를 때마다 점프합니다. 그런 다음 ‘확인’을 누르세요.
직접 해보기
using UnityEngine;
public class Sled : MonoBehaviour
{
public float push = 6f;
public float hop = 5f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (Input.GetKey(KeyCode.RightArrow))
{
rb.AddForce(Vector3.right * push);
}
if (Input.GetKey(KeyCode.LeftArrow))
{
rb.AddForce(Vector3.left * push);
}
}
void FixedUpdate()
{
if (Input.GetKeyDown(KeyCode.Space))
{
rb.AddForce(Vector3.up * hop, ForceMode.Impulse);
}
}
}
물리와 게임플레이의 모든 레슨
직접 연습해 보세요: Unity 플레이그라운드