스크립트 함수와 메서드
이 문서에서는 스크립트 함수와 메서드를 사용하는 방법에 대한 기본적인 정보를 제공합니다.
기본 차이점
- 스크립트 함수는 다음과 같은 구문으로 생성합니다:
gml function name() { code; } - 메서드 변수는 다음과 같은 구문으로 생성합니다:
gml name = function() { code; }
스크립트에서는 첫 번째 구문을 사용하여 게임의 어디에서나 호출할 수 있는 전역 함수를 만듭니다. 스크립트 함수의 실행은 호출될 때 사용 중인 범위를 유지합니다.
두 번째 구문은 인스턴스나 생성자와 같은 함수들을 만들 때 사용해야 합니다. 이 구문은 함수가 생성한 구조체 또는 인스턴스와 바인딩된 메서드를 포함하는 변수를 생성하며, 실행 중 항상 해당 범위를 사용합니다.
직접 호출
스크립트 함수와 메서드는 괄호 ()를 사용하여 직접 호출할 수 있습니다. 다음은 실행 중인 함수처럼 호출하는 방법입니다:
// 함수 생성
function reset_x() { x = xstart; }
// 함수 호출
reset_x();
또한 script_execute() 함수를 사용하여 스크립트 함수를 실행할 수 있습니다.
간접 호출: 메서드
또한, 메서드에 대한 참조를 다른 변수에 저장하여 나중에 해당 변수를 통해 호출할 수 있습니다:
// 메서드 생성
reset_alpha = function() { image_alpha = 1; }
// 참조 전달 및 호출
temp_1 = reset_alpha;
temp_1();
참고: reset_alpha 뒤에 ()를 붙이지 않는 이유는 메서드 참조를 읽고 있기 때문입니다. temp_1을 호출하면 reset_alpha를 호출하게 되며, 이는 메서드 참조를 저장합니다.
이와 같은 방식으로 메서드 참조를 전달하는 것은 완전히 괜찮습니다. 그러나 스크립트 함수를 사용할 때는 주의해야 할 점이 있습니다.
간접 호출: 스크립트 함수
스크립트 함수에 대한 참조도 다른 변수에 저장할 수 있습니다:
// 함수 생성
function reset_x() { x = xstart; }
// 참조 저장
temp_1 = reset_x;
이제 temp_1을 다음과 같이 호출할 수 있습니다:
temp_1();
하지만 이 변수는 스크립트 함수를 참조하므로, 먼저 메서드로 변환한 후 호출해야 합니다. 이는 특히 매 프레임마다 호출할 경우 메모리 사용량 증가를 초래할 수 있습니다. 엔진이 새로운 메서드를 매 프레임마다 생성해야 하기 때문입니다.
해결 방법
스크립트 함수의 참조를 사용하여 script_execute()를 호출하면 메서드를 생성하지 않으므로 문제를 피할 수 있습니다.
또는 더 나은 해결책은, 참조를 전달할 때 스크립트 함수를 메서드로 변환하는 것입니다. 두 번째 솔루션을 구현한 코드는 다음과 같습니다:
temp_1 = method(undefined, reset_x);
이것은 reset_x 스크립트 함수로부터 새로운 메서드를 생성합니다. 이제 괄호를 사용하여 temp_1()을 호출하면 메모리 사용량이 증가하지 않으며, 메서드는 이미 생성되어 있습니다.
다시 말하지만, 이는 간접적으로 변수에 저장된 참조를 통해 스크립트 함수를 호출할 경우에만 해당되며, 직접 호출할 경우에는 이러한 문제가 발생하지 않습니다.
예제
| 유형 | 코드 | 설명 |
|---|---|---|
| 스크립트 함수 | gml function example() { return 42; } example(); |
전역 함수를 생성하고 호출합니다. |
| 메서드 | gml method_var = function() { x = 10; }; method_var(); |
메서드를 생성하고 호출합니다. |
| 간접 호출 | gml ref = method(undefined, example); ref(); |
샘플 스크립트 함수를 메서드로 변환 후 호출합니다. |
회사는 저작권을 소유합니다: © YoYo Games Ltd. 2024 All Rights Reserved