Unity에서 게임 오브젝트를 이동시키는 방법
이동은 주로 Transform 컴포넌트를 통해 수행
Transform.Translate 메서드 사용
Translate 메서드는 현재 좌표 기준으로 이동하는 데 사용
void Update() { float moveSpeed = 5f; // Translate 메서드를 사용하여 이동 transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime); }
특징
상대적인 이동: Translate 메서드는 현재 위치를 기준으로 상대적인 이동을 수행
즉시 이동: 변화가 즉시 발생하며, 물리 시뮬레이션이나 충돌 검사 없이 이동
간단한 이동: 단순한 상대적 이동에 적합하며, 특히 주기적인 이동이나 애니메이션에 유용함
이동 벡터 직접 변경
직접 Transform.position을 변경하여 이동
void Update() { float moveSpeed = 5f; // Transform.position 직접 변경 transform.position += Vector3.forward * moveSpeed * Time.deltaTime; }
특징
절대적인 이동: Transform.position을 직접 변경하여 절대적인 이동을 수행
즉시 이동: 변화가 즉시 발생하며, 물리 시뮬레이션이나 충돌 검사 없이 이동
간단한 이동: 단순한 절대적 이동에 사용되며, 특히 상대적인 이동이나 회전을 고려하지 않고 이동할 때 유용함
CharacterController 사용
CharacterController를 사용하여 좀 더 정교한 캐릭터 이동을 처리
using UnityEngine; public class PlayerController : MonoBehaviour { private CharacterController controller; public float speed = 6.0f; private Vector3 moveDirection = Vector3.zero; void Start() { controller = GetComponent<CharacterController>(); } void Update() { moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0.0f, Input.GetAxis("Vertical")); moveDirection = transform.TransformDirection(moveDirection); moveDirection *= speed; controller.Move(moveDirection * Time.deltaTime); } }
특징
물리 시뮬레이션: CharacterController를 사용하면 물리 시뮬레이션을 통해 이동
중력, 땅과의 충돌 등을 고려할 수 있음
유연한 이동: 플레이어 캐릭터와 같은 컨트롤러를 위한 더 유연한 이동을 제공
프레임과 독립적: CharacterController.Move는 FixedUpdate에서 호출되어 프레임 속도와 무관하게 실행됨
Rigidbody 사용
Rigidbody를 사용하면 물리 엔진이 적용되어 더 자연스러운 이동이 가능
using UnityEngine; public class PlayerController : MonoBehaviour { private Rigidbody rb; public float speed = 6.0f; void Start() { rb = GetComponent<Rigidbody>(); } void FixedUpdate() { float moveHorizontal = Input.GetAxis("Horizontal"); float moveVertical = Input.GetAxis("Vertical"); Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical); rb.AddForce(movement * speed); } }
특징
물리 시뮬레이션: Rigidbody를 사용하면 물리 시뮬레이션을 통해 이동하며, 중력과 같은 물리 효과를 적용할 수 있음
자연스러운 이동: 물리 엔진에 의해 제어되므로 자연스러운 이동이 가능하며, 물체 간 상호 작용에 유리
프레임과 독립적: Rigidbody의 이동은 FixedUpdate에서 호출되어 프레임 속도와 무관하게 실행됨
직접 트랜스폼을 변경하고 싶을 때
controller.enabled = false; // 캐릭터 컨트롤러 잠시 비활성화 transform.position = teleportTarget.position; // 순간이동 controller.enabled = true; // 캐릭터 컨트롤러 다시 활성화
캐릭터 컨트롤러를 비활성화하고 새로운 위치로 이동시킨 후 다시 활성화하여 순간이동을 구현