Unity Chapter 5-2. C# 프로그래밍 [중급] (1/2) : 평행 이동

Date:     Updated:

카테고리:

태그:

인프런에 있는 이제민님의 레트로의 유니티 C# 게임 프로그래밍 에센스 강의를 듣고 정리한 필기입니다. 😀
🌜 [레트로의 유니티 C# 게임 프로그래밍 에센스] 강의 들으러 가기!


Chapter 5. C# 프로그래밍 : 중급 (1/2)

🔔 평행이동과 좌표계 + 부모 자식 관계

  • 유니티에서 큐브 오브젝트를 만들고 📜Mover.cs 스크립트를 붙이도록 하자.
  • Transform 컴포넌트는 Vector3를 사용한다. 3차원.

📜Mover.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Mover : MonoBehaviour
{
    void Start()
    {
        Vector3 targetPosition = new Vector3(1, 0, 0); // 위치를 나타내는 절대 좌표로서의 Vector3

        transform.position = targetPosition; // 이 오브젝트의 위치를 Vector3(1, 0, 0)로 이동시킨다.
    }

    void Update()
    {
        
    }
}
  • Start함수 안에 구현했으니 위 스크립트를 붙이고 게임을 실행하면 큐브가 (1, 0, 0) 위치로 이동할 것이다.

평행이동

평행 이동은 벡터의 덧셈과 관련있다.

벡터의 덧셈으로 평행이동 시키기

📜Mover.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Mover : MonoBehaviour
{
    public Vector3 move = new Vector3(-5, -5,- 5); // 상대적으로 어느 방향으로 얼만큼 이동할 것인지를 나타내는 "벡터"로서의 Vector3

    void Start()
    {
        transform.position += move;
    }

    void Update()
    {
        
    }
}
  • public Vector3 move
    • 상대적으로 어느 방향으로 얼만큼 이동할 것인지를 나타내는 “벡터”로서의 Vector3
    • public이라 유니티에서 값 수정 가능
  • transform.position += move;
    • 현재 위치 + move 벡터 👉 도착지 위치
    • 게임을 시작하면 벡터만큼 더해주어 오브젝트의 위치를 평행이동 시킨다.
      • 오브젝트의 원래 출발위치와는 상관이 없다.

함수를 이용하여 평행 이동하기 : Translate

📜Mover.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

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

    void Start()
    {
        transform.Translate(move);
    }

    void Update()
    {
        
    }
}
  • transform.Translate(move));
    • 매개변수로 받은 Vector3만큼 평행이동 시킨다.
    • move 벡터만큼 오브젝트가 평행이동함

아래와 같이 짜볼 수도 있다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

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);
    }
}

평행이동 하는 부분을 void Move()라는 함수를 만들어 따로 두었고 1프레임 당 move만큼이 아닌 1초당 move만큼 움직이도록 하기 위해 TIme.deltaTime을 곱해주었다. Update함수 안에 구현하여 스페이스바를 누를때마다 평행이동 하도록 구현함. 게임을 실행시키면 스페이스바를 누르는 동안에는 (1, 0, 1)벡터만큼 오브젝트가 평행이동을 할 것이다.

좌표계 : Local, Global의 차이

  • Local : 부모와 나 자신의 위치를 기준으로 한, 즉 상대적인 좌표계
  • Global : 게임 월드를 기준으로 하는 절대적인 좌표계
  • 오브젝트를 살짝 회전해보면 Local축과 Global축 다른거 바로 알 수 있다. 오브젝트를 회전하면 Local축도 같이 회전하는 반면 Global축은 변함 없다.
  • 평행이동 하면 Local 좌표계를 기준으로 평행이동한다.
    • 벡터로 평행이동할시 디폴트로 Local 좌표계를 따라 평행 이동하게 된다.
      • vec3(1, 1, 1)를 평행이동하게되면 Local좌표계의 x방향으로 1만큼, y방향으로 1만큼, z방향으로 1만큼 평행이동함

Global에 따라 평행이동 하게 하려면 : Space.World

transform.Translate(move * Time.deltaTime, Space.World);
  • Translate 함수 매개변수로 Space.World를 넘기면 Global 좌표계를 기준으로 평행이동한다.
  • 매개변수 디폴트 값은 Space.self (Local)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

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, Space.World);
    }
}

부모-자식 관계 : Local 좌표계

image

  • 큐브 오브젝트의 Rotation 값을 (60, 60, 60)으로 지정해주자.
  • 이 오브젝트의 ‘구’모양의 자식 오브젝트를 2개 만들어 보자
    • Hierarchy창에서 큐브 오브젝트 우클 - #D Object - Sphere 2번 해주기
    • 이름은 각각 Moon, Sun으로 해주자.
    • 위치는 각각 (3, 0, 0), (0, 0, 3)으로 해주었고
  • 부모 오브젝트가 없는 독립적인 오브젝트들의 Transform은 Global 좌표계를 기준으로 한다.
  • 자식 오브젝트의 Transform은 부모 오브젝트 기준의 Local 좌표이다.
    • 자식 오브젝트의 position이 (3, 0, 0)이면 부모 오브젝트로부터 (3, 0, 0)만큼 떨어져있다는 얘기다.
    • 자식 오브젝트를 부모로 부터 잠시 빼보면 Global 좌표계 값을 알 수 있다.
      • 부모가 없는 독립적인 오브젝트들의 Transform은 Global 좌표계를 따르기 때문에.
    • 부모 오브젝트를 평행이동시켜도 자식 오브젝트의 transform.position값은 변함없다! 왜냐면 자식 오브젝트도 같이 평행이동 되기 때문에 부모로부터의 거리가 차이가 없어서.

Local과 Global 구분해서 코드 짜기

transform.position = new Vector3(0, 0, 0); // 평행이동 아님. 절대 위치좌표로 초기화.

transform.positionGlobal좌표를 뜻한다.

transform.localPosition = new Vector3(0, 0, 0); 

transform.localPositionlocal좌표를 뜻한다. 부모 오브젝트로부터 상대적 거리



🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Unity Lesson 1 카테고리 내 다른 글 보러가기

댓글 남기기