2019. 8. 17. 20:40ㆍ유니티
Bounds 구조체를 생성할 때 인자가 없는 빈 생성자, 인자가 있는 생성자, Encapsulate를 사용했을 때 어떻게 되는지 궁금하여 분석하게 되었고 정리를 하고자 합니다.
이 글을 읽기 전에 유니티 문서 - Bounds를 한 번 읽어보면서 어떤 변수와 함수가 있는지 살펴보는 것이 좋습니다.
빈 생성자
빈 생성자로 Bounds를 할당했을 때 로그에 어떤 값이 찍히는지 살펴보았습니다.
using UnityEngine;
public class Example : MonoBehaviour
{
void Start()
{
Bounds bounds = new Bounds();
Debug.Log("bounds : " + bounds);
Debug.Log("min : " + bounds.min);
Debug.Log("max : " + bounds.max);
Debug.Log("size : " + bounds.size);
}
}
|
음... 단순히 이 것만으로는 Center, Extents, min, max, size가 무엇을 하는지 정확하게 알 수가 없었습니다.
위의 변수들이 가지는 의미를 알아보기 위하여 다음 과같은 방법들로 시도하여 알아보았습니다.
생성자 인수를 대입
빈 생성자로는 어떤 값을 가지는지 알 수가 없어서 인수를 대입해보기로 하였습니다.
using UnityEngine;
public class Example : MonoBehaviour
{
void Start()
{
Bounds bounds = new Bounds(Vector3.zero, Vector3.one);
Debug.Log("bounds : " + bounds);
Debug.Log("min : " + bounds.min);
Debug.Log("max : " + bounds.max);
Debug.Log("size : " + bounds.size);
}
}
|
인수가 있는 생성자로 Bounds를 살펴보니 중심점을 기준으로 지정한 크기의 절반을 상, 하, 좌, 우로 확장하는 것을 알 수 있습니다. 즉 min ~ max 범위를 가지며 Center를 기준으로 Extents만큼 상, 하, 좌, 우로 확장하며 size를 가지는 것을 알 수가 있습니다.
Encapsulate
Encapsulate를 사용하면 Bounds를 재설정할 수 있습니다. 단 Encapsulate를 사용할 때 기존의 Bounds의 min보다 크거나 같고 max보다 작거나 같을 경우 재설정할 수 없습니다.(min <= value <= max일 경우 value는 적용되지 않습니다.) 즉 min보다 적거나 max보다 큰 값이면 재설정할 수 있습니다.
여기서 빈 생성자를 통해서 Encapsulate한 것과 인수를 통해서 생성한 뒤 Encapsulate를 한 Bounds 요소들을 비교를 해보았습니다.
using UnityEngine;
public class Example : MonoBehaviour
{
void Start()
{
Bounds bounds = GetBounds();
bounds.Encapsulate(Vector3.one * 2f);
Debug.Log("빈 생성자 Bounds");
Output(bounds);
bounds = GetBounds(Vector3.zero, Vector3.one);
//생성할 때 크기를 1로 설정했으므로 그보다 더 큰 값을 대입해야합니다.
bounds.Encapsulate(Vector3.one * 2f);
Debug.Log("인수를 지정한 Bounds");
Output(bounds);
}
private Bounds GetBounds(Vector3 center = new Vector3(), Vector3 size = new Vector3())
{
return new Bounds(center, size);
}
private void Output(Bounds bounds)
{
Debug.Log("bounds : " + bounds);
Debug.Log("min : " + bounds.min);
Debug.Log("max : " + bounds.max);
Debug.Log("size : " + bounds.size);
Debug.Log("===================");
}
}
|
빈 생성자와 인수를 지정해서 할당의 차이점을 살펴보면 Center가 Vector3.zero를 기준으로 설정되는가 안되는가의 차이점입니다.
빈 생성자를 생성했을 때 중심점이 Vector3.zero로부터 시작되고 인수를 지정해서 할당했을 때에는 중심과 크기를 동시에 지정하기 때문에 Center가 Vector3.zero라도 크기와의 계산을 통해서 Center를 다시 설정하는 방식으로 되어있기 때문입니다.
Expand
Encapsulate의 경우 min, max 사이일 경우 Bound를 설정할 수 없다는 제약이 있습니다. 이 제약과 상관없이 Bound를 설정할 수 있는 함수가 Expand입니다.
이 함수에 인자 값을 대입하면 대입한 값에 0.5f(절반)을 곱한 다음 extents와 합산 연산을 합니다. 늘릴 경우에는 양수를, 줄일 경우에는 음수를 대입하면 됩니다. 다시 언급하지만 지정한 값으로 설정하는 것이 아니라 지정한 값을 합산 연산을 하는 것이므로 Encapsulate와 사용 용도가 다릅니다.
using UnityEngine;
public class Example : MonoBehaviour
{
void Start()
{
Bounds bounds = GetBounds(Vector3.zero, Vector3.one);
Output(bounds);
//내부에서 0.5f로 계산하여 extends에 더합니다.
bounds.Expand(1f);
Output(bounds);
}
private Bounds GetBounds(Vector3 center = new Vector3(), Vector3 size = new Vector3())
{
return new Bounds(center, size);
}
private void Output(Bounds bounds)
{
Debug.Log("bounds : " + bounds);
Debug.Log("min : " + bounds.min);
Debug.Log("max : " + bounds.max);
Debug.Log("size : " + bounds.size);
Debug.Log("===================");
}
}
|
'유니티' 카테고리의 다른 글
Immediate Mode GUI(IMGUI) (0) | 2019.08.20 |
---|---|
카메라 흔들기(Camera Shake) (0) | 2019.07.27 |
싱글톤 (0) | 2019.07.27 |