3D 공간의 3D오브젝트는 위치를 표현한 값 = 좌표를 가짐.
물체의 배치를 표현하는 기준과 체계
즉, 공간 내에서 어떤 방향으로 얼마만큼 이동하였는가

이렇게 씬에 표현되는 평행이동 툴의 화살표가 좌표계를 표현한 것
유니티의 공간은 총 3가지가 존재
게임 월드의 중심이라는 절대 기준을 중심으로 얼마나 떨어져 있는가
게임 월드의 원점인 (0, 0 ,0)이 기준

씬창의 툴 핸들에서 지역(오브젝트)/전역 변환 가능
즉 전역공간에서 "앞쪽"으로 이동하는 것은
게임 오브젝트를 앞으로 당기는 것이 아닌, 게임월드 기준에서 앞쪽으로 이동한다는 의미
오브젝트 자신 기준, 물체가 평행이동시 스스로의 방향 기준으로 평행 이동.
옵젝 자신이 아닌 부모 컴포넌트의 위치를 기준으로 한 지역 좌표계로 죄표를 측정.
모든 게임 오브젝트는 자신의 부모를 세상의 중심으로 생각하고 좌표를 측정함.
유니티는 이 둘을 편의상 합쳐서 부르고 있음.
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));
}
다만 회전값 생성시 Quaternion.Euler 메서드를 활용한다는 것 주의
키보드 입력을 받아서 평행이동과 회전을 구현
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 값을 받아, 이 값만큼 오브젝트를 더 회전함.
지역공간기준으로 회전 진행됨.
자주 사용하는 벡터값은 빠르게 생성가능 (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 타입은 자신의 앞,위,오른쪽를 나타내는 방향 벡터를 즉시 접근할 수 있는 변수들을 제공함
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;