가장 인기 있는 게임 개발 플랫폼 중 하나인 Unity는 유연하고 최적화된 다양한 기능을 제공합니다. 그러나 이러한 유연성을 통해 특정 복잡성을 이해할 필요가 있습니다. 많은 신규 사용자들을 곤혹스럽게 하는 특징 중 하나는 Transform.position 속성의 x 구성 요소(y 또는 z)를 직접 수정할 수 없다는 것입니다.
불변 벡터
Unity에서 transform.position 속성은 월드스페이스에서 GameObject의 위치를 나타내는 Vector3 객체를 반환합니다. 그러나 Vector3 구조는 불변입니다. 불변의 객체나 구조는 만들어진 후에 상태나 값을 수정할 수 없습니다.
즉, transform.position에서 Vector3을 가져오면 실제 위치 데이터에 대한 참조가 아닌 위치의 복사본을 얻게 됩니다. 따라서 이 Vector3의 구성 요소 하나만 변경하면 원래 데이터에 영향을 미치지 않습니다. 대신 C#에서 허용하지 않는 복사본을 수정하려고 합니다.
단일 구성 요소를 변경하는 방법
구성 요소를 직접 변경할 수는 없지만 Unity는 이 문제를 해결하는 쉬운 방법을 제공합니다. 다음은 변환 위치의 단일 구성 요소를 효과적으로 수정하는 방법입니다:
Vector3 newPosition = transform.position; // Get a copy of the position
newPosition.x = 5; // Modify the copy
transform.position = newPosition; // Assign the modified copy back
이 접근 방식에서는 변환 위치의 복사본을 유지하기 위해 임시 Vector3 변수를 만듭니다. 이 복사본을 수정한 다음 수정된 벡터를 transform.position에 다시 할당합니다.
디자인 결정
Unity가 번거로워 보이는 이 설정을 선택한 이유는 무엇인지 궁금할 것입니다. 답은 Vector3의 본질과 Unity가 안전과 성능을 위해 한 기본적인 선택에 있습니다:
Vector3은 구조체입니다. C#에서 Vector3 유형은 값 유형인 구조체로 정의됩니다. 이것은 당신이 Vector3을 사용할 때 그것의 값에 대한 참조가 아닌 실제 값을 사용한다는 것을 의미합니다. 따라서 transform.position을 검색할 때 당신은 위치에 대한 참조가 아니라 위치의 복사본을 얻는 것입니다.
안전성: Vector3를 불변으로 만들면 의도하지 않은 수정을 방지할 수 있습니다. Vector3 개체가 변형 가능하면 받은 모든 함수가 실수로 수정할 수 있으므로 추적하기 어려운 버그가 발생할 수 있습니다.
성능: 값 유형(구조체와 같은)을 사용하면 특히 게임 엔진과 같은 데이터 집약적인 환경에서 참조 유형보다 성능 이점을 얻을 수 있습니다. 데이터를 로컬로 유지함으로써 캐시 친화적이므로 종종 더 효율적인 실행이 가능합니다.
결론
Vector3를 불변으로 만들기로 한 Unity의 결정은 처음에는 직관에 반하는 것처럼 보일 수 있지만, 코드 안전을 유지하고 성능 최적화를 보장하는 이중적인 목적에 부합합니다. 일단 이 패턴에 익숙해지면, 그것은 제2의 천성이 되고, 안정적이고 최적화된 게임 엔진의 이점은 사소한 불편함을 훨씬 능가합니다.
'Unity' 카테고리의 다른 글
스크립트를 통해 게임 오브젝트에 컴포넌트 추가하기 (0) | 2023.09.21 |
---|---|
Setting : Resolution and Presentation (0) | 2023.09.20 |
Destroy 와 DestroyImmediate (0) | 2023.08.25 |
Animation : Blend Tree (0) | 2023.08.24 |
SerializeField 이해하기 (0) | 2023.08.10 |