유니티 게임 내 공간의 종류, 게임 오브젝트의 위치와 회전을 결정하는 좌표계 C#공간제어
Pivot/ Center
디폴트 값은 Pivot이며,
Center는 3D모델 중앙을 기준점으로 모델링하는 반면, Pivot은 3D모델 바닥 중앙을 기준점으로 모델링 한다.
전역공간모드
전역공간모드(Global)로 하면 평행이동 툴의 화살표가 큐브의 회전을 무시하고 게임 월드를 기준으로 나타난다.
모델이 기준이 아닌 게임월드의 x, y, z를 기준으로 하는 것이다.
오브젝트 공간모드
오브젝트 공간모드(Local)은 오브젝트의 방향을 기준 삼는 것 이다
오른쪽 이미지를 보면 위(글로벌) 아래(로컬)공간모드의 차이점을 볼 수 있다.
옆 그림을 보면 정육각형과 구가 있다.
정육각형을 구의 부모로 상속해서 설정하면 지역 공간이 형성되어 구는 정육각형에 종속되어 모델링된다.
쉽게 이해하면 정육각형은 태양이고, 구는 지구인 셈이다. 지구가 태양에 종속되어 공전하는 것 처럼 구 또한 정육각형을 기준으로 설정된다.
구는 정육각형을 기준으로 자유롭게 설정 가능하지만 정육각형이 움직일 경우 같이 움직이게 된다.
스크립트 분석
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Move : MonoBehaviour
{
public Transform childTransform;
//변수 선언 : 움직일 자식 게임 오브젝트의 트랜스폼
//Cude 게임 오브젝트의 트랜스폼 컴포넌트를 할당한 변수
void Start()//가장 처음 실행되는 메소드
{
childTransform.position = new Vector3(0, -1, 0);
//chf가 참조하는 컴포넌트(부모) 위치를 0,-1, 0 으로 변경
childTransform.localPosition = new Vector3(0,2,0);
//자식의 지역위치를 0,2,0 로 변경
transform.rotation = Quaternion.Euleer(new Vector(0,0,30));
//자신(부모)의 전역회전을 0,0,30 으로 변경
childTransform.localRotation = Quaternion.Euler(new Vector3(0,60,0));
//자식의 지역회전을 0,60,0으로 변경
}
/* Transform에서 전역 위치는 Position, 지역 위치는 localPosition으로 제공한다.
또한 전역 회전은 Rotation, 지역회전은 localRotation으로 제공한다.
회전값 생성 : Quaternion.Euler()메소드 사용
*/
void 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.Rotation(new Vector3(0, 0, 100) * Time.deltaTime);
childTransform.Rotate(new Vector3(0, 100, 0) * Time.deltaTime);
}
if (Input.GetKey(KeyCode.RightArrow))
{
transform.Rotation(new Vector3(0,0,-100)*Time.deltaTime);
childTransform.Rotate(new Vector3(0, -100, 0) * Time.deltaTime);
}
}
}
childTransform.position = new Vector3(0, -1, 0);
위 코드에서, childTransform은 참조 타입이고 new Vector3는 구조체로 값 타입이다.
당연히 불가능하다. 하지만 childTransform이라는 변수는 Transform 타입을 할당한 변수이며, transform 컴포넌트의 “.position” 은 Vector3를 속성으로 가진다. 즉 childTransform.position은 값 타입이다. 참조 타입의 속성이 값 타입인 경우 문제가 발생하지 않는다.