개발일지/Unity

[Unity]이동, 회전

초코보 2026. 5. 26. 16:09

[position]

게임 오브젝트 위치 정보.

//(x, y, z)위치로 순간이동
transform.position = new Vector3(x, y, z)
//현재 위치에 (0,0,1)값을 더하며 이동
transform.position += Vector3.forward

 

[Translate]

현 오브젝트의 Transform 위치를 이동시키는 메서드.

현 위치에서 지정한 방향과 거리만큼 이동한다.

transform.Translate(이동값);
transform.Translate(이동값, 기준공간);
using UnityEngine;

public class CTranslate : MonoBehaviour
{
    private float moveSpeed = 5.0f; //moveSpeed = 5.0의 속도로 이동
    void Update()
    {
    	//[자동 이동]
        //[1]
        transform.Translate(Vector3.forward);
        //[2]
        transform.Translate(Vector3.forward * moveSpeed);
        //[3]
        transform.Translate(Vector3.forward * Time.deltaTime); //Time.deltaTime: 프레임 보정
        
        //[입력 이동]
        //[1] 이동키 할당
        float horizontal = Input.GetAxisRaw("Horizontal"); //string("축의 이름")
        float vertical = Input.GetAxisRaw("Vertical");
        //[2] 이동 인스턴스 생성
        Vector3 move = new Vector3(horizontal, 0, vertical); //WS x축 |AD z축 이동 |y축 사용X
        
        //[3]대각선 균일화
        move = move.normalized; //normalized: 대각선도 동일 속도만큼 이동하도록 만듬
        
        //[4]
        transform.Translate(move * moveSpeed * Time.deltaTime); //입력 방향으로 moveSpeed만큼 이동

        //기준공간: Space.() (콤마 뒤에 오버로딩 - Space.World, Space.Self)
        transform.Translate(move * moveSpeed * Time.deltaTime, Space.Self);

 

[함께 보면 좋은 내용]

더보기

[Debug.Log()]

실행 시 Console란에 Log를 출력해준다(코드 배포 전 제거)

 

[Vector3]

3차원 공간(x, y, z)의 위치, 방향, 이동 거리를 나타낼때 사용하는 구조체

right - left (x축) | up - down(y축) | forward - back(z축)

 

[Time.deltaTime]

FPS가 달라도 같은 값을 이동하도록 프레임을 보정한다. (1 * (1 / 프레임) = 프레임당 시간 보정)

 

[GetAxis(" "), GetAxisRaw(" ")]

유니티의 InputSystem이나 Project Setting의 Active Input Handling 시스템 등을 이용.

사용자가 할당 키 입력 시 작동한다.

GetAxis : -1.0f부터 1.0f까지의 범위 값을 반환(부드러운 이동)

GetAxisRaw : -1, 0, 1 중 하나가 반환(빠른 반응)

horizontal: (A, D) | vertical (W, S)

[키 할당]

Vector3 move = new Vector3(x, y, z)

 

[GetKey(KeyCode.키)]

if문과 함께 사용. 해당 키 입력 시 if문 안의 내용을 실행.

 

[ .normalized]

피타고라스의 원리로 인해, 대각선 이동 시 루트2(약 1.4)의 거리를 이동하게 된다(더 빠른 이동속도)

Vector3의 방향을 정규화 하여, 균일한 속도로 이동하게 한다.

 

[Space.World]

기준 공간 - 월드 좌표 기준 이동

[Space.Self]

기준 공간 - 오브젝트 회전 방향 기준 이동


 

 

[rotate]

회전. 물체가 바라보는 방향을 바꾼다(오일러 타입)

현재 회전 값에 새로운 회전 값을 누적해서 더한다.

transform.Rotate(회전값);
transform.Rotate(회전값, 기준공간);

 

[eulerAngles]

오브젝트 회전을 사람이 보기 쉬운 각도 값으로 표현한다(4차원 쿼터니언 -> 3차원 오일러)

쿼터니언(XYZW)은 회전 보간 안정, 회전 보정, 짐벌락 현상 방지 등 3D에서 가장 표현하기 쉬우나, 사람이 보기 힘들다.
때문에 오일러 각으로 표기한다. (직접 수정하면 안된다. 메서드 값을 수정해야 한다.)
짐벌락 현상: 3차원 공간에서 물체 회전 시, 두 회전 축이 겹쳐 회전 자유도 상실. 특정 각도의 두 축이 겹쳐 보인다.
//Rotate가 회전값 더하기라면, eulerAngles는 회전 값을 직접 설정한다.
transform.eulerAngles = new Vector3(x, y, z);
using UnityEngine;

public class RotateBasic : MonoBehaviour
{
    private float rotateSpeed = 50.0f; //회전스피드

    private void Start()
    {
        transform.eulerAngles = new Vector3(0.0f, 90.0f, 0.0f); //y축을 90도로 초기화
    }

    void Update()
    {
        if (Input.GetKey(KeyCode.Space)) //KeyCode.키 : 해당 키를 누르는 동안 진행
        {
        transform.Rotate(Vector3.up * rotateSpeed * Time.deltaTime, Space.World); //up: y축을 50.0f만큼 회전(월드 기준)
        }
    }
}

 

[Rotation]

오브젝트 회전값. 유니티가 회전을 저장하는 전용 타입(쿼터니언 타입)

[Quaternion.Euler]

현재 오일러(3차원)회전 값을 쿼터니언 식으로 변환

transform.rotation = Quaternion.Euler(x,y,z);

 

[LookAt]

현 오브젝트의 앞방향이 타겟을 향하게 한다.

transform.LookAt(transform target);
using UnityEngine;

public class CLookAt : MonoBehaviour
{
    public Transform target; //인스펙터 표시
    void Update()
    {
        transform.LookAt(target); //앞부분이 타겟을 향한다
    }
}

인스펙터에 target이 될 오브젝트 드래그

 

[RotateAround]

현 오브젝트가 타겟 위치를 중심으로 회전(공전)한다.

ex) 카메라가 플레이어 중심 공전, 아이템이 특정 오브젝트 중심 공전 등의 상황에 사용

transform.RotateAround(Vector3 point, Vector3 axis, float angle); //(회전 중심점, 회전 축, n도 회전)
transform.RotateAround(target.position, Vector3.up, 30.0f); //(target을 중심으로, y축을, 30도 회전)
using UnityEngine;

public class CRotateAround : MonoBehaviour
{
    public Transform target; //인스펙터 표시
    private float rotateSpeed = 50.0f; //회전값

    void Update()
    {
    	//(타겟 위치, y축으로 50도 회전 (프레임 보정)
        transform.RotateAround(target.position, Vector3.up, rotateSpeed * Time.deltaTime); 
    }
}

 

[LookRotation]

현 오브젝트 위치에서 타겟 위치를 바라보는 방향 벡터(쿼터니언 회전값)를 만들어준다.

현 위치에서 목표까지 가는 방향을 나타낼 때 사용한다

(타겟의 크기까지 포함하기 때문에)방향만 필요하면 노멀라이즈를 함께 사용한다.

Quaternion.LookRotation(Vector3 forward, Vector3 upwards) //(앞방향을 삼을 벡터, 위쪽 기준)
//내 현재 위치에서 타겟의 위치로 향하는 방향을 계산하고, 내 앞방향(forward)이 그 방향을 향하도록 회전한다.
using UnityEngine;

public class CLookRotation : MonoBehaviour
{
    public Transform target; //인스펙터 표시

    void Update()
    {
        //내 위치에서 타겟 위치로 향하는 방향 벡터(dir)를 구하는 공식
        //target.position : 목표 위치
        //transform.position : 내 위치
        Vector3 dir = target.position - transform.position;
        //ex) 플레이어 위치 (0,0,0) / 타겟 위치 (10,0,0)
        //타겟 포지션(타겟 위치) - 트랜스폼 포지션(내 위치) : dir = (10,0,0)

        if (dir == Vector3.zero) return; //만약 dir 값이 (0,0,0)이면 하지마라

        Quaternion lookRotation = Quaternion.LookRotation(dir, Vector3.up);

        transform.rotation = lookRotation;
    }
}

 

[LookAt vs LookRotation]

둘 다 대상을 바라보게 하는 건 동일하나,
LookAt은 바로 바라보게 한다(즉시 회전)

ex) 터렛과 같은 부자연스러운 회전
LookRotation은 바라보는 회전값만 만든다.(부드러운 회전)

ex) 미사일 유도, 보스AI와 같은 회전 직접 컨트롤

'개발일지 > Unity' 카테고리의 다른 글

[Unity] Find, Coroutine  (0) 2026.05.28
[Unity]Ray복습, UI, OverLap, Check  (0) 2026.05.27
[Unity] Prefabs, RayCast  (0) 2026.05.26
[Unity]Rigidbody, Collider  (0) 2026.05.26
[Unity]컴포넌트, 라이프 사이클  (0) 2026.05.20