Unity 강의 정리 5-2장: C# 프로그래밍 [중급] (1/2) : 평행이동과 좌표계 + 부모 자식 관계🎮

나무에물주기·2023년 8월 17일
1

Unity

목록 보기
11/21
post-thumbnail

인프런에 있는 레트로의 유니티 C# 게임 프로그래밍 에센스 강의를 듣고 정리하는 글입니다!

유니티에서의 평행이동과 좌표계, 부모-자식 관계 🌐


1. 오브젝트 생성과 Transform 컴포넌트 🧩

유니티에서 큐브 오브젝트를 만들 때, Transform 컴포넌트는 3차원 벡터(Vector3)를 사용하여 오브젝트의 위치, 회전, 크기를 정의한다.

  • 위치(Position): 오브젝트의 3차원 공간 내 절대 위치를 나타낸다.
  • 회전(Rotation): 오브젝트의 축을 중심으로 한 회전 각도를 나타낸다.
  • 크기(Scale): 오브젝트의 각 차원별 확장 비율을 나타낸다.
using System.Collections;
using UnityEngine;

public class Mover : MonoBehaviour
{
    void Start()
    {
        Vector3 targetPosition = new Vector3(1, 0, 0); // x축을 따라 1만큼의 위치로 이동
        transform.position = targetPosition; // 현재 오브젝트의 위치를 지정된 Vector3(1, 0, 0)로 설정한다.
    }
}

위 코드에서 transform.position은 오브젝트의 위치를 제어하는 프로퍼티로, 3D 공간에서의 절대 좌표를 설정할 수 있다.


2. 벡터를 이용한 평행이동: 오브젝트 이동의 기초 🚀

평행이동은 오브젝트를 3D 공간에서 한 위치에서 다른 위치로 이동시키는 과정이다. 이는 오브젝트의 현재 위치 벡터에 이동하려는 벡터를 더하여 수행된다.

using System.Collections;
using UnityEngine;

public class Mover : MonoBehaviour
{
    public Vector3 move = new Vector3(-5, -5,- 5); // 상대적인 평행이동을 나타내는 벡터

    void Start()
    {
        transform.position += move; // 현재 위치에 move 벡터를 더해 평행이동
    }
}

위 코드는 move 벡터의 값을 현재 오브젝트의 위치에 더하므로, 오브젝트는 지정된 방향과 거리로 평행이동한다. 이는 오브젝트의 위치를 상대적으로 변경하므로, 다른 오브젝트나 환경에 대한 영향을 미치지 않는다.


3. Translate 함수를 활용한 평행이동 구현 📌

유니티에서는 Translate 메서드를 사용하여 오브젝트를 평행 이동할 수 있다. 이 메서드는 오브젝트의 현재 위치에 지정된 벡터를 더하는 방식으로 작동하며, 직관적인 인터페이스를 제공한다.

using System.Collections;
using UnityEngine;

public class Mover : MonoBehaviour
{
    public Vector3 move = new Vector3(-5, -5, -5); 

    void Start()
    {
        transform.Translate(move); // move 벡터만큼 오브젝트를 평행 이동
    }
}

Translate 메서드는 벡터 덧셈과 동일한 결과를 제공하지만, 코드를 더 간결하고 읽기 쉽게 만든다. 추가적으로, Time.deltaTime을 사용하여 프레임 간의 시간 차이를 고려한 부드러운 이동을 구현할 수 있다.

public class Mover : MonoBehaviour
{
    public Vector3 move = new Vector3(1, 0, 1); 

    void Update()
    {
        if(Input.GetKey(KeyCode.Space))
        {
            Move();
        }
    }

    void Move()
    {
        transform.Translate(move * Time.deltaTime); // deltaTime을 곱하여 프레임 간 이동을 부드럽게 만든다.
    }
}

4. Local과 Global 좌표계: 위치 제어

유니티에서 오브젝트의 위치는 Global(전역) 좌표계와 Local(지역) 좌표계를 사용하여 표현할 수 있다.

  • Global 좌표계: 3D 공간 내의 절대 위치를 나타내며, 모든 오브젝트는 동일한 기준으로 위치한다.
  • Local 좌표계: 부모 오브젝트에 대한 상대적인 위치를 나타내며, 부모 오브젝트의 변화에 영향을 받는다.

Global 좌표계에서 위치를 설정하려면 transform.position을 사용하고, Local 좌표계에서 위치를 설정하려면 transform.localPosition을 사용한다.

transform.position = new Vector3(0, 0, 0); // Global 좌표계를 사용하여 절대 위치로 초기화
transform.localPosition = new Vector3(0, 0, 0); // Local 좌표계를 사용하여 부모에 대한 상대 위치로 초기화

Global 좌표계는 오브젝트의 세계 내 절대 위치를 제어하는 데 사용되며, Local 좌표계는 부모-자식 관계에서 자식 오브젝트의 상대 위치를 제어하는 데 사용된다.


5. Global 좌표계에서의 평행이동: Space.World 활용 🌐

유니티에서 transform.Translate 메서드를 사용할 때, 평행이동의 방향을 전역(Global) 좌표계에 따라 설정하고 싶을 때가 있다. 기본적으로 Translate는 지역(Local) 좌표계를 기준으로 작동한다. 전역 좌표계를 기준으로 평행이동하려면 Space.World 인자를 사용하면 된다.

public class Mover : MonoBehaviour
{
    public Vector3 move = new Vector3(1, 0, 0);

    void Update()
    {
        transform.Translate(move * Time.deltaTime, Space.World); // 전역 좌표계 기준으로 평행이동
    }
}

Space.World를 사용하면, 오브젝트의 지역 회전이 평행이동에 영향을 주지 않으므로, 오브젝트가 어떻게 회전되든 일정한 방향으로 평행이동하게 된다.


6. 계층 구조상에서 Local 좌표계🌞🌛

유니티에서 오브젝트는 부모-자식 관계를 형성할 수 있다. 자식 오브젝트의 위치, 회전, 크기는 부모 오브젝트의 지역(Local) 좌표계에 의해 영향을 받는다.

예를 들어, 큐브 오브젝트의 회전 값을 (60, 60, 60)으로 지정하고, 이 오브젝트의 '구' 모양 자식 오브젝트를 2개 만들자. 자식 오브젝트의 이름은 각각 Moon, Sun으로 하고 위치는 각각 (3, 0, 0), (0, 0, 3)으로 설정한다.

transform.position = new Vector3(0, 0, 0); // 부모 오브젝트의 전역 위치 초기화
transform.localPosition = new Vector3(0, 0, 0); // 자식 오브젝트의 지역 위치 초기화

이 구조에서 부모 오브젝트가 회전하면 자식 오브젝트도 함께 회전한다. 이는 자식 오브젝트가 부모의 지역 좌표계 내에서 존재하므로, 부모의 변화가 자식에게 전달되기 때문이다.


7. Local과 Global 좌표계 추가 설명

유니티에서 오브젝트의 위치를 제어할 때 Local 좌표계는 오브젝트의 부모에 대한 상대적인 위치를 나타내며, Global 좌표계는 전체 게임 세계에 대한 절대적인 위치를 나타낸다.

Local 좌표계

transform.localPosition = new Vector3(0, 0, 0); // 오브젝트의 지역 위치를 초기화

localPosition은 부모 오브젝트에 대한 상대적인 위치를 나타낸다. 부모가 회전하거나 이동하면 자식 오브젝트의 localPosition은 변하지 않지만, 전역 좌표계에서의 실제 위치는 변한다.

Global 좌표계

transform.position = new Vector3(0, 0, 0); // 오브젝트의 전역 위치를 초기화

position은 게임 세계 내에서 오브젝트의 절대 위치를 나타낸다. 부모 오브젝트의 변화가 자식 오브젝트의 전역 위치에 영향을 줄 수 있지만, position 속성은 항상 전역 좌표계를 기준으로 한다.


정리 🎓

이 글에서는 유니티에서의 평행이동, 좌표계, 부모-자식 관계에 대해 매우 상세하게 탐구했다. 이러한 개념은 3D 게임 개발의 기본이며, 복잡한 오브젝트 상호 작용과 씬 구성을 가능하게 한다.

  • Vector3를 사용하여 3차원 공간에서 오브젝트를 제어한다.
  • 평행이동은 오브젝트의 위치를 상대적으로 변경하며, Translate 메서드를 사용할 수 있다.
  • Local과 Global 좌표계는 오브젝트의 상대적 및 절대 위치를 제어한다.
  • 부모-자식 관계를 이해하고 사용하면, 복잡한 오브젝트 계층을 효과적으로 구성할 수 있다.
profile
개인 공부를 정리함니다

0개의 댓글