For the complete documentation index, see llms.txt. This page is also available as Markdown.

변경 가능한 데이터

컴포넌트에서 읽기 전용 및 변경 가능한 데이터를 처리하는 방법을 알아봅니다

데이터를 참조할 때 컴포넌트, 변경 가능한 버전 또는 읽기 전용(불변) 버전을 가져올 수 있습니다.

항상 읽기 전용 버전으로 다루는 것이 좋습니다. 이렇게 하면 동일한 데이터의 변경 가능한 버전을 항상 다루는 것과 비교했을 때, 씬 성능이 매우 크게 향상될 수 있습니다.

이 .get() 컴포넌트의 함수는 읽기 전용(불변) 버전을 반환합니다. 값은 읽을 수만 있고, 해당 속성은 변경할 수 없습니다.

이 .getMutable() 함수는 컴포넌트의 값을 변경할 수 있는 버전을 반환합니다. 컴포넌트를 변경할 계획이 있을 때만 변경 가능한 버전을 사용하고, 그렇지 않으면 항상 get().

// 읽기 전용(불변) 버전을 가져옵니다
const immutableTransform = Transform.get(myEntity)

// 다음은 작동하지 않습니다:
// immutableTransform.position.y = 2

const mutableTransform = Transform.getMutable(myEntity)

// 다음 줄은 엔티티의 위치를 실제로 변경합니다
mutableTransform.position.y = 2

권장되는 방법은 값을 확인하기 위해 읽기 전용 컴포넌트를 순회하고, 변경이 필요할 때만 개별 컴포넌트의 변경 가능한 버전을 가져오는 것입니다.

// 하드코딩된 최대 높이
const MAX_HEIGHT = 10

// 시스템을 정의합니다
function HeightLimitSystem(dt: number) {
	// Transform 컴포넌트가 있는 모든 엔티티를 순회합니다
	for (const [entity] of engine.getEntitiesWith(Transform)) {
		// 읽기 전용 값을 가져옵니다
		const currentHeight = Transform.get(entity).position.y

		// 값을 비교합니다
		if (currentHeight > MAX_HEIGHT) {
			// 변경을 위해 변경 가능한 버전을 가져옵니다
			const mutableTransform = Transform.getMutable(entity)

			// 트랜스폼을 변경합니다
			mutableTransform.position.y = MAX_HEIGHT
		}
	}
}

// 시스템을 엔진에 추가합니다
engine.addSystem(HeightLimitSystem)

위 예시에서, 시스템은 엔티티의 읽기 전용 값을 확인합니다 Transform 컴포넌트를 확인합니다. 매 틱마다 위치의 y 하드코딩된 최대 높이보다 높은지 확인합니다. 트랜스폼의 높이가 이 한도를 넘는 경우에만 Transform의 변경 가능한 버전을 가져옵니다. 이는 씬에 추가 작업처럼 보일 수 있지만, 게임 루프의 매 틱마다 값을 확인하고 변경은 가끔만 하는 씬에서는 엄청난 성능 향상을 가져옵니다.

이 관행은 다음의 원칙을 따릅니다 데이터 지향 프로그래밍. 또한 그것이 가져오는 개선 효과가 매우 크기 때문에 게임 업계에서 점차 업계 표준 관행으로 채택되고 있습니다.

마지막 업데이트