Unity Chapter 5-2. C# 프로그래밍 [중급] (1/2) : 평행 이동
카테고리: Unity Lesson 1
태그: C Sharp Math Unity Game Engine
인프런에 있는 이제민님의 레트로의 유니티 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만큼 평행이동함
- 벡터로 평행이동할시 디폴트로 Local 좌표계를 따라 평행 이동하게 된다.
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 좌표계
- 큐브 오브젝트의 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.position
은 Global좌표를 뜻한다.
transform.localPosition = new Vector3(0, 0, 0);
transform.localPosition
은 local좌표를 뜻한다. 부모 오브젝트로부터 상대적 거리
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기