Unity transform.localScale
유니티에서 부모 컨테이너 오브젝트에 대한 상대적 크기를 저장하는 변수, transform.localScale
유니티에서 게임 오브젝트들은 서로를 포함할 수 있으며 한 오브젝트 안에 다른 오브젝트를 포함한 경우에는 부모 오브젝트, 자식 오브젝트로 구분하여 설명할 수 있다. 부모-자식 관계를 설정하면 부모의 position, scale 속성은 자식의 상대적 위치와 상대적 크기에 영향을 미치게 된다.
예를 들어, 부모-자식 관계로 설정된 부모 오브젝트를 Scene 뷰에서 드래그하여 위치를 변경하면 자식 오브젝트도 상대적 위치로 변경되는 것을 볼 수 있고 Scene 뷰에서 부모의 크기를 변경하면 자식도 상대적인 크기로 변경되는 것을 볼 수가 있다.
부모-자식 관계를 설정하는 방법
- 유니티 에디터의 Hierarchy 뷰에서 특정 오브젝트를 드래그하여 다른 오브젝트에 드롭한다. 포함하는 오브젝트가 부모 오브젝트가 된다
- 스크립트에서 transform.parent = GameObject.Find("Cube").transform;
transform.localScale 변수는 Vector3 형 참조변수이며 부모의 크기(Scale)에 대한 비를 저장하고 있으며 부모-자식 관계가 설정된지 않은 경우에는 자신의 크기를 저장하게 된다. 예를 들어, Cube 한개를 생성하고 Inspector 뷰에서 Scale 을 5, 5, 5 로 설정하고 아직 부모-자식 관계를 설정하지 않은 상태라면 다음의 코드를 Cube에 드래그하여 포함하고 실행해 보면..... 5, 5, 5 를 출력한다
[부모-자식 관계가 없는 상태에서 localScale 변수는 현재 오브젝트의 크기를 나타낸다]
float x = transform.localScale.x;
float y = transform.localScale.y;
float z = transform.localScale.z;
print(x+", "+y+", "+z); // 5, 5, 5
다음에는 부모 오브젝트로 사용할 또 하나의 Cube를 생성하고 그 크기를 50, 50, 50 으로 설정한다. 앞서 생성한 Cube를 자식으로 설정할 것이므로 Hierarchy 뷰에서 드래그하여 부모 오브젝트로 드롭하여 관계를 설정한다. 관계를 설정하는 순간 오른쪽 Hierarchy 뷰의 Scale 속성은 0.1, 0.1, 0.1 으로 설정되는 것을 볼 수 있고, 실행하면 위의 코드가 출력하는 내용도 0.1, 0.1, 0.1 으로 동일한 것을 확인할 수 있다
[부모의 크기가 50,50,50 이고 자식의 크기는 5, 5, 5 일 경우 자식의 localScale 속성이 나타내는 값]
float x = transform.localScale.x;
float y = transform.localScale.y;
float z = transform.localScale.z;
print(x+", "+y+", "+z); // 0.1, 0.1, 0.1
위의 테스트 결과를 보면 localScale 라는 속성은 부모의 크기에 대한 상대적 크기(비)를 나타내고 있다는 것을 확인할 수 있다
스크립트에서도 오브젝트들 간의 부모-자식 관계를 설정하고 테스트하면 동일한 결과가 출력된다
일단, Hierarchy 뷰에서 설정했던 부모-자식 관계를 해제하여 원래대로 복원한 후에 아래의 스크립트를 통해 localScale을 확인해 본다
[자식 오브젝트에 포함된 스크립트에서 다음의 내용을 테스트한다면...]
transform.parent = GameObject.Find ("Cube").transform; // 부모-자식 관계 설정
transform.localScale = new Vector3 (1f, 1f, 1f); // localScale은 부모의 크기에 대한 비를 나타낸다(1:동일크기, 2: 2배크기)
float x = transform.localScale.x;
float y = transform.localScale.y;
float z = transform.localScale.z;
print(x+", "+y+", "+z); // 1, 1, 1 --> 부모의 크기와 동일한 비(부모, 자식 오브젝트의 크기가 동일하다)
transform.parent = GameObject.Find ("Cube").transform;
transform.localScale += new Vector3 (0.5f, 0.5f, 0.5f);
float x = transform.localScale.x;
float y = transform.localScale.y;
float z = transform.localScale.z;
print(x+", "+y+", "+z); // 0.6, 0.6, 0.6 --> 자식 오브젝트의 원래 크기는 0.1 이었는데, 0.5를 더해서 0.6 으로 커졌다