Unity-#7.공간과 움직임

CHO WanGi·2024년 4월 8일

Unity

목록 보기
7/13

유니티 공간(Space)

3D 공간의 3D오브젝트는 위치를 표현한 값 = 좌표를 가짐.

좌표계

물체의 배치를 표현하는 기준과 체계
즉, 공간 내에서 어떤 방향으로 얼마만큼 이동하였는가

이렇게 씬에 표현되는 평행이동 툴의 화살표가 좌표계를 표현한 것

유니티의 공간은 총 3가지가 존재

  1. 전역공간
  2. 오브젝트 공간
  3. 지역 공간

전역 공간(global Space)

게임 월드의 중심이라는 절대 기준을 중심으로 얼마나 떨어져 있는가
게임 월드의 원점인 (0, 0 ,0)이 기준


씬창의 툴 핸들에서 지역(오브젝트)/전역 변환 가능

즉 전역공간에서 "앞쪽"으로 이동하는 것은
게임 오브젝트를 앞으로 당기는 것이 아닌, 게임월드 기준에서 앞쪽으로 이동한다는 의미

오브젝트 공간

오브젝트 자신 기준, 물체가 평행이동시 스스로의 방향 기준으로 평행 이동.

지역 공간

옵젝 자신이 아닌 부모 컴포넌트의 위치를 기준으로 한 지역 좌표계로 죄표를 측정.
모든 게임 오브젝트는 자신의 부모를 세상의 중심으로 생각하고 좌표를 측정함.

지역 공간 vs 오브젝트 공간

유니티는 이 둘을 편의상 합쳐서 부르고 있음.

  • 위치, 회전, 스케일값 측정 -> 부모 게임 오브젝트 기준 측정
  • 평행이동 -> 오브젝트 자신의 방향 기준으로 평행이동

Object 이동 및 회전 코드

변수 선언

    public Transform childTransform;

자식 오브젝트를 이동하기 위한 childTransform 변수 선언

위치와 회전 결정

    void Start()
    {
        transform.position = new Vector3(0,-1,0);
        childTransform.localPosition = new Vector3(0,2,0);

        transform.rotation = Quaternion.Euler(new Vector3(0, 0 ,30));
        childTransform.localRotation = Quaternion.Euler(new Vector3(0,60,0));
    }
  • Transform 타입
    전역 위치는 position, 지역 위치는 localPosition 을 통해 제공
    전역 회전도 rotation 지역 회전도 localRotation 을 통해서 제공함.

다만 회전값 생성시 Quaternion.Euler 메서드를 활용한다는 것 주의

upDate 메서드

키보드 입력을 받아서 평행이동과 회전을 구현

if(Input.GetKey(KeyCode.UpArrow))
        {
            transform.Translate(new Vector3(0 ,1, 0) * Time.deltaTime);
        }
        if(Input.GetKey(KeyCode.DownArrow))
        {
            transform.Translate(new Vector3(0 ,-1, 0) * Time.deltaTime);
        }
        if(Input.GetKey(KeyCode.LeftArrow))
        {
            transform.Rotate(new Vector3(0 ,0, 180) * Time.deltaTime);
            childTransform.Rotate(new Vector3(0,0,180) * Time.deltaTime);
        }
        if(Input.GetKey(KeyCode.RightArrow))
        {
            transform.Rotate(new Vector3(0 ,0, -180) * Time.deltaTime);
            childTransform.Rotate(new Vector3(0, 0,-180) * Time.deltaTime);
        }
  • Translate(vector3, space.world)
    입력으로 Vector3값을 받고, 이 메서드 실행시 입력받은 벡터값 만큼 상대적으로 더 이동
    지역공간 기준으로 이동이 이루어짐.
    두번째 파라미터에 지역/전역 공간 기준 설정 가능

  • Rotate(Vector3, space.world)
    마찬가지로 입력으로 Vectore3 값을 받아, 이 값만큼 오브젝트를 더 회전함.
    지역공간기준으로 회전 진행됨.

벡터 연산으로 평행이동 구현

벡터의 속기(shorthand)

자주 사용하는 벡터값은 빠르게 생성가능 (Syntax Sugar 느낌...)

  • Vector3.up
    new Vector(0,1,0) 과 동일

  • Vector3.down
    new Vector(0,-1,0) 과 동일

  • Vector3.forward
    new Vector(0,0,1) 과 동일

  • Vector3.back
    new Vector(0,0,-1) 과 동일

  • Vector3.right
    new Vector(1,0,0) 과 동일

  • Vector3.left
    new Vector(-1,0,0) 과 동일

Transform의 방향

트랜스폼 컴포넌트를 표현하는 Transform 타입은 자신의 앞,위,오른쪽를 나타내는 방향 벡터를 즉시 접근할 수 있는 변수들을 제공함

  • trnasform.forward
    자신의 앞쪽 가리키는 방향 벡터

  • trnasform.right
    자신의 오른쪽 가리키는 방향 벡터

  • trnasform.up
    자신의 위쪽 가리키는 방향 벡터

반대방향은 -1을 곱해서 사용 가능

벡터 연산을 활용한 평행이동

위에 Translate 메서드를 활용해서 평행이동 구현을 할 수도 있지만,
벡터연산을 활용하면 Transform의 Position 값을 직접 수정하여 평행이동 구현도 가능

  • 자신 앞쪽으로 평행이동
transform.Translate(new Vector3(0, 1, 0)):
transform.postition = transform.position + transform.up * 1;
  • 전역 공간 앞쪽으로 평행이동
transform.Translate(new Vector3(0, 1, 0), Space.World):
transform.postition = transform.position + Vector3.up * 1;
profile
제 Velog에 오신 모든 분들이 작더라도 인사이트를 얻어가셨으면 좋겠습니다 :)

0개의 댓글