물리를 위한 FixedUpdate
Coddy Unity 여정의 물리와 게임플레이 섹션에 포함된 레슨. 63개 중 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를 반환합니다.
챌린지
쉬움얼어붙은 호수 위의 썰매는 두 가지 동작이 모두 잘못된 메서드에 있습니다. 화살표 키로 Update()에서 썰매를 밀기 때문에, 컴퓨터가 빠를수록 더 강하게 밀립니다. FixedUpdate()에서 충격량을 가해 점프하기 때문에, 스페이스바를 눌러도 아무 일도 일어나지 않을 때가 있습니다.
- 화살표 키로 미는 동작을
FixedUpdate()로 옮기세요. Update()에서 스페이스바 입력을hopPressed라는bool에 저장하세요.FixedUpdate()에서는 이 값이 설정되어 있으면 점프한 다음 값을 초기화하세요.
Play를 누르고 두 동작을 모두 시도한 다음 Check를 누르세요.
직접 해보기
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);
}
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.