Unity에서 GameObject를 코드로 이동시키는 다양한 방법들과 각각의 특징에 대해 설명하세요.
Unity에서 GameObject를 이동시키는 방법은 크게 Transform 조작과 Physics 기반으로 나뉩니다.
Transform 방식은 transform.position, transform.Translate 등으로 직접적인 위치 변경이 가능하며 즉시 반영되지만 물리 법칙을 무시합니다.
Physics 방식은 Rigidbody.velocity, AddForce 등으로 물리 엔진을 통한 자연스러운 이동이 가능하지만 충돌과 중력 등의 영향을 받습니다.
Physics 기반은 연산 비용이 높지만, Transform 기반은 가벼운 반면 충돌 처리가 부족하기 때문에 용도에 맞는 적절한 선택이 중요합니다.
void Update()
{
// 절대 좌표 이동
transform.position += Vector3.forward * speed * Time.deltaTime;
}
void Update()
{
// 로컬 좌표계 기준 이동 (기본값)
transform.Translate(Vector3.forward * speed * Time.deltaTime);
// 월드 좌표계 기준 이동
transform.Translate(Vector3.forward * speed * Time.deltaTime, Space.World);
}
void Update()
{
// 목표점을 향해 일정한 속도로 이동
transform.position = Vector3.MoveTowards
(
transform.position,
target.position,
speed * Time.deltaTime
);
}
void Update()
{
// 부드럽게 목표점으로 이동 (점점 느려짐)
transform.position = Vector3.Lerp
(
transform.position,
target.position,
lerpSpeed * Time.deltaTime
);
}
void Update()
{
// 입력에 따른 이동
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
Vector3 movement = new Vector3(horizontal, 0, vertical) * speed;
rb.velocity = new Vector3(movement.x, rb.velocity.y, movement.z); // Y축 속도 유지
}
void Update()
{
// 순간적인 힘 적용
if (Input.GetKeyDown(KeyCode.Space))
{
rb.AddForce(Vector3.up * forceAmount * 10, ForceMode.Impulse);
}
}
ForceMode.Force: 질량 고려, 지속적인 힘 (기본 값)ForceMode.Acceleration: 질량 무시, 지속적 가속도ForceMode.Impulse: 질량 고려, 순간적 충격ForceMode.VelocityChange: 질량 무시, 즉시 속도 변경 void FixedUpdate()
{
// 물리 업데이트에서 사용
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
Vector3 movement = new Vector3(horizontal, 0, vertical);
Vector3 newPosition = rb.position + movement * speed * Time.fixedDeltaTime;
rb.MovePosition(newPosition);
}
void Update()
{
// 회전 입력
float rotation = Input.GetAxis("Horizontal");
rb.AddTorque(Vector3.up * rotation * torqueAmount);
// 앞으로 이동 (현재 바라보는 방향)
if (Input.GetKey(KeyCode.W))
{
rb.AddForce(transform.forward * 10f);
}
}
| 방법 | 물리 영향 | 충돌 감지 | 성능 | 사용 용도 |
|---|---|---|---|---|
| transform.position | X | X | 최고 | UI, 단순 이동 |
| transform.Translate | X | X | 최고 | 상대적 이동 |
| Vector3.MoveTowards | X | X | 높음 | 일정 속도 이동 |
| Vector3.Lerp | X | X | 높음 | 부드러운 이동 |
| Rigidbody.velocity | O | O | 보통 | 즉시 속도 변경 |
| Rigidbody.AddForce | O | O | 보통 | 현실적 물리 |
| Rigidbody.MovePosition | 부분적 | O | 보통 | 물리 기반 이동 |
| CharacterController | 부분적 | O | 보통 | 캐릭터 이동 |
| NavMeshAgent | X | 회피 | 낮음 | AI, 경로 찾기 |