Cocos Creatorモジュール化スクリプト(公式ドキュメントより抜粋)

11784 ワード

モジュール化スクリプト
Cocos Creatorでは、コードを複数のスクリプトファイルに分割し、相互に呼び出すことができます.これを実現するには、Cocos Creatorでモジュールを定義して使用する方法を理解する必要があります.この手順はモジュール化と略称されます.
モジュール化が何ができるか分からない場合は、モジュール化は次のようになります.
  • C/C++のinclude
  • C#のusing
  • JavaとPythonのimport
  • HTMLの
  • モジュール化により、Cocos Creatorで他のスクリプトファイルを参照できます.
  • 他のファイルからエクスポートされたパラメータ
  • にアクセス
  • 他のファイルのエクスポートを呼び出す方法
  • 他のファイルを使用してエクスポートするタイプ
  • 他のComponent
  • の使用または継承
    Cocos CreatorのJavaScript使用とNode.jsはほぼ同じCommonJS規格でモジュール化を実現し、簡単に言えば:
  • 個々のスクリプトファイルごとにモジュール
  • が構成される.
  • 各モジュールは、個別の役割ドメイン
  • である.
  • は、同期requireの方法で他のモジュール
  • を参照する.
  • module.exportsは、導出変数
  • として設定.
    もしあなたがまだよく分からないなら、大丈夫です.以下で詳しく説明します.
    本明細書では、「モジュール」と「スクリプト」の2つの用語は等価である.すべてのコメントはステップアップされたもので、最初は理解する必要はありません.モジュールの定義にかかわらず、すべてのユーザーコードは最終的にCocos CreatorによってオリジナルのJavaScriptにコンパイルされ、ブラウザで直接実行できます.
    リファレンスモジュール
    require
    Cocos Creatorが提供するインタフェースに加えて、すべてのユーザー定義モジュールはrequireを呼び出してアクセスする必要があります.たとえば、Rotate.jsで定義されたコンポーネントがあります.
    // Rotate.js
    
    cc.Class({
       extends: cc.Component,
       // ...
    });

    別のスクリプトにアクセスするには、次のようにします.
    var Rotate = require("Rotate");
    requireは、モジュールによってエクスポートされたオブジェクトを返します.通常、結果はすぐに変数(var Rotate)に保存されます.requireに入力された文字列は、パスも接尾辞も含まれず、大文字と小文字が敏感なモジュールのファイル名です.
    requireの完全な例
    次に、Rotateを使用してサブクラスを派生し、スクリプトSinRotate.jsを新規作成できます.
    // SinRotate.js
    
    var Rotate = require("Rotate");
    
    var SinRotate = cc.Class({
        extends: Rotate,
        update: function (dt) {
            this.rotation += this.speed * Math.sin(dt);
        }
    });

    ここでは,Rotateから継承されたSinRotateという新しいコンポーネントを定義し,updateメソッドを書き換えた.
    同じコンポーネントは、require("SinRotate")を使用する限り、他のスクリプトによってアクセスされてもよい.
    コメント:
  • requireは、スクリプトの任意の時点で呼び出すことができる.
  • ゲームの開始時にすべてのスクリプトが自動的にrequireされ、各モジュール内で定義されたコードが1回実行されるため、その後もrequireに何度も返されても、常に同じインスタンスが返されます.
  • デバッグの場合、Developer ToolsのConsoleでrequireプロジェクトの任意のモジュールをいつでも使用できます.

  • モジュールの定義
    コンポーネントの定義
    各個別のスクリプトファイルは、前に作成したスクリプトRotate.jsなどのモジュールです.
    // Rotate.js
    
    var Rotate = cc.Class({
        extends: cc.Component,
        properties: {
            speed: 1
        },
        update: function () {
            this.transform.rotation += this.speed;
        }
    });

    スクリプトにコンポーネントを宣言すると、Cocos Creatorはデフォルトでエクスポートし、他のスクリプトは直接requireというモジュールでこのコンポーネントを使用することができます.
    一般的なJavaScriptモジュールの定義
    モジュールではコンポーネントを定義するだけでなく、実際には任意のJavaScriptオブジェクトをエクスポートすることができます.スクリプトconfig.jsがあると仮定
    // config.js
    
    var cfg = {
        moveSpeed: 10,
        version: "0.15",
        showTutorial: true,
    
        load: function () {
            // ...
        }
    };
    cfg.load();

    別のスクリプトでconfigオブジェクトにアクセスする場合は、次の手順に従います.
    // player.js
    
    var config = require("config");
    cc.log("speed is", config.moveSpeed);
    cfgがエクスポートされなかったため、「TypeError:Cannot read property'moveSpeed'of null」とエラーが表示されます.requireは実際にターゲットスクリプト内のmodule.exports変数を取得するため、config.jsの最後のmodule.exports = configを設定する必要があります.
    // config.js - v2
    
    var cfg = {
        moveSpeed: 10,
        version: "0.15",
        showTutorial: true,
    
        load: function () {
            // ...
        }
    };
    cfg.load();
    
    module.exports = cfg;

    これによりplayer.jsは「speed is 10」を正しく出力することができる.
    では、なぜComponentを定義するときにexportsを設定しなくてもいいのでしょうか.ComponentはCocos Creatorの特殊なタイプであるため、スクリプトによってComponentが定義されているのにexportsが宣言されていない場合、Cocos Creatorはexportsを自動的にComponentに設定します.
    コメント:
  • moduleに追加した他の変数は導出できない.すなわち、exportsは他の変数名に置き換えることができず、システムはexportsという変数しか読み取れない.

  • その他の例
    変数のエクスポート
  • module.exportsデフォルトは空のオブジェクト({})で、新しいフィールドを直接追加できます.
  • // foobar.js:
    
    module.exports.foo = function () {
        cc.log("foo");
    };
    module.exports.bar = function () {
        cc.log("bar");
    };
    // test.js:
    
    var foobar = require("foobar");
    foobar.foo();    // "foo"
    foobar.bar();    // "bar"
  • module.exportsの値は、任意のJavaScriptタイプであってもよい.
  • // foobar.js:
    
    module.exports = {
        FOO: function () {
            this.type = "foo";
        },
        bar: "bar"
    };
    // test.js:
    
    var foobar = require("foobar");
    var foo = new foobar.FOO();
    cc.log(foo.type);      // "foo"
    cc.log(foobar.bar);    // "bar"

    プライベート変数のカプセル化
    各スクリプトは個別の役割ドメインであり、スクリプト内でvarで定義されたローカル変数を使用すると、モジュール外部からアクセスできません.モジュール内のプライベート変数を簡単にカプセル化できます.
    // foobar.js:
    
    var dirty = false;
    module.exports = {
        setDirty: function () {
            dirty = true;
        },
        isDirty: function () {
            return dirty;
        },
    };
    // test1.js:
    
    var foo = require("foobar");
    cc.log(typeof foo.dirty);        // "undefined"
    foo.setDirty();
    // test2.js:
    
    var foo = require("foobar");
    cc.log(foo.isDirty());           // true

    循環参照
    属性遅延定義を参照してください
    サードパーティモジュールリファレンス
    サードパーティモジュールリファレンスドキュメントを参照してください