빠른 비교
transform.position = new Vector3(0f, 1f, 0f);
transform.localPosition = new Vector3(0f, 0f, 2f);갈리는 기준
position과 localPosition의 차이
position은 월드 좌표계 기준 위치이고, localPosition은 부모 오브젝트 기준 상대 위치입니다. 자식 오브젝트는 부모가 움직이면 월드 좌표가 함께 바뀌므로, 로컬과 월드를 구분해야 배치가 꼬이지 않습니다. UI, 무기 장착 위치, 카메라 리그처럼 부모-자식 구조가 많은 장면에서 특히 중요합니다.
회전과 스케일도 같은 원리
회전과 스케일도 같은 원리로 rotation/localRotation, lossyScale/localScale 개념을 함께 봐야 합니다. localRotation은 부모 기준 회전이고 rotation은 월드 기준 회전입니다. lossyScale은 월드 스케일을 읽기 전용으로 얻을 수 있고, 실제 설정은 localScale로 합니다.
부모에 붙일 때 주의할 점
SetParent로 오브젝트를 부모에 붙일 때는 localPosition과 localRotation을 명시적으로 초기화하는 것이 안전합니다. 부모가 달라지면 월드 좌표는 유지되더라도 로컬 값이 예상 밖으로 바뀔 수 있기 때문입니다.
[SerializeField] private Transform player;
private void Start()
{
transform.SetParent(player);
transform.localPosition = new Vector3(0f, 1.5f, 0.5f);
transform.localRotation = Quaternion.identity;
}선택 기준
| 상황 | 적합한 선택 |
|---|---|
| 씬 전체 기준 위치 설정 | transform.position |
| 부모 기준 상대 위치 설정 | transform.localPosition |
| 씬 전체 기준 회전 설정 | transform.rotation |
| 부모 기준 회전 설정 | transform.localRotation |
| 부모에 붙인 뒤 위치 초기화 | localPosition = Vector3.zero |
주의할 점
자식 오브젝트에 position을 쓰면 월드 원점 기준으로 이동해 부모 기준 배치가 어긋납니다.
// ❌ 자식에 position 사용 — 월드 원점으로 이동, 부모 기준 배치 어긋남
transform.position = Vector3.zero;
// ✅ 부모 기준으로 배치하려면 localPosition 사용
transform.localPosition = Vector3.zero; // 부모 위치와 동일
transform.localPosition = new Vector3(0f, 1f, 0.5f); // 부모 기준 상대 오프셋참고 링크
2 sources