PlayCanvas로 샌디를 걷게 하는 게임을 만든다☆(제6회) ~다른 엔티티의 이벤트를 데리러~

이렇게 만들고 있습니다.



htps : // p ぁ y 칸 v. 아 s/b/아 PwxqY/
※본 해설보다 개발이 진행되고 있는 일도 있으므로 양해 바랍니다.

하나의 엔티티의 충돌 판정을 UI용의 엔티티에 전하는 방법은?



예를 들어 골 포스트 붉은 원통이 있습니다.


이것을 터치하면 대화 상자가 나타납니다.


PlayCanvas는 각 엔티티에 스크립트를 갖게 프로그래밍되지만 원통과 UI는 다른 엔티티입니다.

어떻게 엔티티간에 상호 작용할 수 있습니까?

대답은 사용자 매뉴얼 > 스크립팅 > 통신에 있었습니다.
htps : //로 ゔぇぺぺr.ぁ y 칸ゔ ぁ s. 코 m / 자 / 우세 r 마누아 l / sc 리 p 찐 g / 코무니 카치온 /

커뮤니케이션이란 좀처럼 듣지 않는 표현일지도 모르지만, 다른 엔티티의 이벤트를 집어 오는 것이라고 생각해 주세요.

스크립트 간의 통신은
  • 스크립트 속성에서 참조하는 엔터티에서만 가져온 이벤트
  • 메인 애플리케이션 (this.app)을 중앙 허브로 사용하여 모든 엔티티에서 가져온 애플리케이션 이벤트

  • 2 종류가 있습니다.
    아무래도 후자가 편리합니다 (웃음)

    엔티티에 샌디가 충돌했을 때에 UI 부품에 충돌 판정을 전달하도록, 어플리케이션 이벤트를 사용해 프로그래밍해 갑니다.

    충돌 판정



    다음 스크립트를 작성합니다.

    hitSandy.js
    var HitSandy = pc.createScript('hitSandy');
    
    // initialize code called once per entity
    HitSandy.prototype.initialize = function() {
        this.entity.collision.on('triggerenter', this.onTriggerEnter, this);
    };
    
    // update code called every frame
    HitSandy.prototype.update = function(dt) {
    
    };
    
    HitSandy.prototype.onTriggerEnter = function(entity) {
        this.app.fire('hitSandy:hit', this.entity.name, entity.name);
    };
    

    이 스크립트가 적용되고 있는 엔티티의 당 판정에, 무엇인가 강체가 충돌했을 때에 「hitSandy:hit」라고 하는 이벤트를 발화하도록(듯이) 했습니다.

    덧붙여서 「hitSandy:hit」이벤트를 받은 측은 충돌한 2개의 엔티티의 이름을 받을 수 있습니다.

    이 스크립트를 PlayCanvas로 샌디를 걷게 하는 게임을 만들자☆(제4회)에서 만든 templates 디렉토리의 "start""goal"엔티티에 적용하십시오.

    (예)


    충돌 판정을 UI로 표시



    이벤트의 통지를 받는 스크립트의 초기화 함수로 이벤트의 수취와, 이벤트를 받았을 때의 이벤트 핸들러를 작성.
    이 경우, 당 판정의 충돌을 검지하면 「onSandyHit」함수를 호출한다.
    충돌 이벤트로부터는 충돌한 2개의 엔티티의 이름도 도착해, 「onSandyHit」함수에서는 name1, name2의 인수가 그것을 받게 되어 있습니다.

    ui.js
    // initialize code called once per entity
    Ui.prototype.initialize = function() {
    ・・・
        // initializeメソッドに以下を追加
        // listen for the player:move event
        this.app.on('hitSandy:hit', this.onSandyHit);
    
        // remove player:move event listeners when script destroyed
        this.on('destroy', function() {
            this.app.off('hitSandy:hit', this,onSandyHit);
        });
    }
    
    //onSandyHitメソッドを新規追加
    Ui.prototype.onSandyHit = function(name1,name2) {
        // 第1引数は衝突された側のエンティティの名前、第2引数は衝突したエンティティの名前
        // メッセージを作成。
        var caption = "";
        var message = "";
        if(name1=="start"){
            caption = "START";
            message = name2 + " start!!";
        }else if(name1 == "goal"){
            caption = "GOAL";
            message = name2 + " reach the goal!!";
        }
    
        // ダイアログにメッセージを載せる
        var disp_dialog = document.getElementsByClassName('pos_top_center')[0];
        disp_dialog.style.display = "block";
        disp_dialog.getElementsByClassName('caption')[0].innerHTML = caption;
        disp_dialog.getElementsByClassName('message')[0].innerHTML = message;
    
    };
    

    이제 Launch 해 봅시다.

    START


    GOAL

    좋은 웹페이지 즐겨찾기