스크립트 구조와 라이프사이클
스크립트의 함수는 정해진 때에 엔진이 부릅니다. 이 페이지는 함수마다 언제 불리는지와, 함수 안에서 쓰는 this가 무엇을 가리키는지 설명합니다.
뼈대
// 1. 스크립트 종류를 만듭니다. 이름은 SCRIPT 칸에 표시됩니다
var Spin = ow.createScript('spin');
// 2. 속성: SCRIPT 칸에서 바꿀 수 있는 값
Spin.attributes.add('speed', { type: 'number', default: 90 });
// 3. 시작할 때 한 번
Spin.prototype.initialize = function () {
this.turned = 0;
};
// 4. 매 프레임
Spin.prototype.update = function (dt) {
this.entity.rotate(0, this.speed * dt, 0);
this.turned += this.speed * dt;
};
2026-10-29 Launch한 게임에서 이 코드로 스크립트를 만들어 엔티티에 붙여 실행했습니다. 1초 뒤 turned가 90.0, 엔티티의 Y 회전이 90.0이었습니다. speed(초당 90도)에 dt를 곱해 프레임 수와 상관없이 1초에 90도 돕니다.
불리는 때
| 함수 | 불리는 때 | 주로 하는 일 |
|---|---|---|
initialize | 스크립트가 붙은 엔티티가 처음 활성화될 때 한 번. 새 파일 주석은 "엔티티마다 1회 실행됩니다"입니다 | 변수 준비, 이벤트 연결(on) |
postInitialize | 모든 스크립트의 initialize가 끝난 뒤 한 번 | 다른 엔티티의 스크립트가 준비된 뒤에 할 일 |
update(dt) | 매 프레임. dt는 지난 프레임 이후 흐른 초 | 움직임, 입력 확인, 시간 재기 |
postUpdate(dt) | 모든 update가 끝난 뒤 매 프레임 | 카메라 따라가기처럼 다른 엔티티가 움직인 다음에 할 일 |
swap(old) | 실행 중에 코드를 고쳐 다시 불러올 때 | 이전 상태를 새 스크립트로 옮기기. 새 파일에는 주석으로 들어 있습니다 |
실측에서 네 함수는 initialize → postInitialize → update → postUpdate 순서로 처음 불렸습니다(1회).
움직임에는 꼭 dt를 곱합니다. 곱하지 않으면 화면 갱신이 빠른 기기에서 더 빨리 움직입니다.
this가 가리키는 것
| 코드 | 가리키는 것 |
|---|---|
this.entity | 스크립트가 붙은 엔티티. this.entity.collision, this.entity.sound처럼 붙은 컴포넌트에 닿습니다 |
this.app | 게임 전체. 입력(this.app.keyboard), 씬의 맨 위(this.app.root), 에셋 목록(this.app.assets)에 닿습니다 |
this.속성이름 | 속성 값. attributes.add('speed', …)로 선언했으면 this.speed |
이벤트와 정리
스크립트와 엔티티도 이벤트를 보냅니다.
this.on('enable', …),this.on('disable', …): 스크립트가 켜지고 꺼질 때.this.on('destroy', …): 엔티티가 지워질 때.this.app.on으로 연결한 이벤트는 여기서off로 풉니다. 풀지 않으면 지운 엔티티의 함수가 계속 불릴 수 있습니다.
실측에서 스크립트의 enabled를 false로 바꾸자 disable, 다시 true로 바꾸자 enable이 왔습니다. 엔티티를 destroy()로 지우자 disable이 먼저 오고 destroy가 이어서 왔습니다(1회).
스크립트 이름
ow.createScript의 이름 가운데 엔진이 예약한 것은 쓸 수 없습니다. 실측에서 ow.createScript('move')는 Script name 'move' is reserved, please rename the script 오류를 냈습니다. 이 오류가 나면 sideMove처럼 이름을 바꿉니다.
2026-10-30에 Launch한 게임에서 이름을 하나씩 넣어 본 결과, 다음 33개가 예약 이름이었습니다: system, entity, create, destroy, swap, move, data, scripts, _scripts, _scriptsIndex, _scriptsData, enabled, _oldState, onEnable, onDisable, onPostStateChange, _onSetEnabled, _checkState, _onBeforeRemove, _onInitializeAttributes, _onInitialize, _onPostInitialize, _onUpdate, _onPostUpdate, _callbacks, _callbackActive, has, get, on, off, fire, once, hasEvent. 반면 update, initialize, jump, player, name, app, camera, input, sound, render, collision처럼 함수·컴포넌트 이름과 같은 것은 쓸 수 있었습니다.
여러 스크립트의 순서
- 한 엔티티에 스크립트가 여럿이면 SCRIPT 칸의 위에서 아래 순서로 불립니다. 칸 왼쪽의 손잡이로 순서를 바꿉니다. 2026-10-30 실측에서
lifeB를 위,lifeA를 아래에 붙이자 Binitialize→ Ainitialize→ Bupdate→ Aupdate순서로 불렸고, 이후 프레임에도 B, A 순서였습니다(1회). - 파일을 불러오는 순서는 SETTINGS의 SCRIPTS LOADING ORDER에 있습니다. 다른 파일의 전역 변수를 쓰는 경우에만 신경 씁니다.