이벤트와 스크립트 간 통신
게임에서는 한 스크립트가 다른 스크립트에게 일을 알려야 할 때가 많습니다. 별을 먹은 스크립트가 점수 스크립트에게 알리고, 시간이 다 된 스크립트가 버튼을 보이게 하는 식입니다. 이 페이지는 그 세 가지 방법을 설명합니다.
아래 코드는 2026-10-29 Launch한 게임에서 같은 코드로 스크립트를 만들어 엔티티에 붙여 실행했습니다(각 1회). 스크립트 파일로 만드는 절차는 새 스크립트 만들고 붙이기와 같습니다.
세 가지 방법
| 방법 | 쓰는 때 | 장점과 단점 |
|---|---|---|
게임 전체 이벤트(this.app.fire·on) | 누가 받는지 몰라도 될 때. 점수, 게임 끝 | 보내는 쪽이 받는 쪽을 몰라도 됩니다. 이벤트 이름을 잘못 쓰면 아무 일도 안 일어나고 오류도 없습니다 |
엔티티 이벤트(entity.fire·on) | 특정 엔티티에게만 알릴 때 | 범위가 좁아 헷갈리지 않습니다. 받을 엔티티를 찾아야 합니다 |
직접 부르기(entity.script.이름.함수()) | 상대가 정해져 있고 바로 결과가 필요할 때 | 가장 단순합니다. 두 스크립트가 서로를 알아야 해서 고치기 어려워집니다 |
게임 전체 이벤트
보내는 쪽(별):
Star.prototype.initialize = function () {
this.entity.collision.once('triggerenter', function (other) {
this.app.fire('star:collected', 1);
this.entity.enabled = false;
}, this);
};
받는 쪽(점수):
Score.prototype.initialize = function () {
this.score = 0;
this.app.on('star:collected', this.onStar, this);
this.on('destroy', function () {
this.app.off('star:collected', this.onStar, this);
}, this);
};
Score.prototype.onStar = function (amount) {
this.score += amount;
this.entity.element.text = '점수 ' + this.score;
};
실측에서 떨어지는 Box가 트리거 StarT를 지나자 점수가 1이 되고, Text의 글자가 점수 1로 바뀌고, StarT가 꺼졌습니다. 그 뒤 점수 스크립트를 지우고 같은 이벤트를 다시 보내자 점수가 그대로 1이었습니다. destroy에서 off로 연결을 푼 결과입니다.
- 이벤트 이름은 문자열입니다.
star:collected처럼무엇:어떻게로 지으면 찾기 쉽습니다. fire의 두 번째 값부터 받는 함수에 그대로 넘어갑니다.this.app.on으로 연결했으면 엔티티가 지워질 때off로 풉니다(스크립트 구조와 라이프사이클).- 점수 글자에 한글을 쓰면 글꼴에 그 글자가 있어야 합니다(점수·안내 글자 바꾸기).
엔티티 이벤트
엔티티도 같은 fire·on을 가집니다. 충돌 이벤트(collisionstart)와 버튼 이벤트(click)도 이 방식입니다. 실측에서 this.entity.collision.on('collisionstart', …)(충돌 이벤트 받기)과 this.entity.button.on('click', …)(버튼 만들기)은 실행해 확인했습니다.
var door = this.app.root.findByName('Door');
door.fire('open');
받는 쪽은 door.on('open', function () { … })로 받습니다. 실측에서 Plane에 on('open')을 걸고 fire('open')을 보내자 받았습니다.
다른 엔티티 찾기
| 방법 | 코드 | 메모 |
|---|---|---|
| 이름으로 | this.app.root.findByName('Ball') | 같은 이름이 여럿이면 처음 것 하나. Launch한 게임에서 실행해 확인했습니다 |
| 꼬리표로 | this.app.root.findByTag('star') | 목록을 돌려줍니다. 엔티티의 Tags에 꼬리표를 붙여 둡니다. 실측에서 star 꼬리표를 붙인 Box가 찾아졌습니다 |
| 속성으로 받기 | attributes.add('target', { type: 'entity' }) | 에디터에서 끌어다 놓습니다. 이름이 바뀌어도 끊기지 않습니다 |
AI가 만든 게임에서는 엔티티 이름이 판마다 다를 수 있습니다. 이름으로 찾는 코드를 고칠 때는 HIERARCHY의 실제 이름과 맞는지 먼저 봅니다.