vs codeでCocosCreatorプラグインのメインプロセスとレンダープロセスをデバッグする方法を調査してみた

# 準備作業
前回の記事
https://qiita.com/chooaya/items/d2ed0caa31c336973226
では、resourcesフォルダの下の元々のapp.asarを削除せずそのままにしました。
CocosCreator.exeから起動するとき、既に解凍済みのappフォルダからソースを読み込みますが、起動が若干重くなる気がします(私の気のせいかもしれません)。
下図はそれぞれapp.asarから読み込んだ状態と解凍済みのappフォルダから読み込んだ状態となっています。

app.asarからの場合:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228366/e4610ebd-fd06-9dba-e8c5-6bd428c9eb3b.png)

解凍済みのappフォルダからの場合:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228366/89c7b4a4-14c9-79a5-41c1-f54fc828ae4e.png)


app.asarがある状態で予期せぬ問題が発生したらまずいので、とりあえずこのファイル別の場所に退避しましょう。

cocos creatorのresourcesが下記状態になっていることを前提に話を進めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228366/94994c9f-3ff9-aa0a-5b47-46995ad35d5e.png)


# cocos creatorのpluginの作成とvisual studio codeを利用したpluginのデバッグ

### pluginの作成
CocosCreator.exeクリックでcocos creatorを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228366/ef490d76-f119-63e8-1124-94ae620d3aff.png)
出てきた画面で「New Project」タブを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228366/9a262a20-ce1e-cfd9-ff20-3fd6e471926d.png)
「Hello TypeScript」を選択し、下図のパス入力のところに作りたいプロジェクトの名前を入れましょう。私の場合は「TestPlugin01」。入力終わったら、右下の「Create」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228366/941ba1d6-0280-3fd6-7618-01c4359d8741.png)
するとエディタが起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228366/2132b893-ab7c-4852-eb44-2e52a8f953ab.png)

ここでゲームを作成できますが、今回作るのはプラグインなので、まずは下図のように、メニューからExtension→Create a new extension→For current project(For current project folder)の流れで選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228366/13ebb127-e10f-9316-359a-7651c12c67e9.png)

「For current project(For current project folder)」クリックで出てきたダイアログのファイル名にプラグインの名前をいれ、「Create Extension」を押せば、pluginの雛形が完成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228366/80d6a5aa-470a-4b38-6537-c35f3211e5b4.png)

以下は私が適当につけた名前myfirstpluginで進めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228366/90399c8f-9c6f-2b01-e70d-a1afa216e7de.png)

今回作成したプロジェクトTestPlugin01のpackagesフォルダの下に、さきほど作成したmyfirstpluginが生成されたことがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228366/cd94bc2f-3929-cca8-7b05-3e7a20e76547.png)


### vscode拡張機能のインストールとpluginデバッグ用設定ファイルの作成
visual studio codeを開きます。(vscode内のターミナルでnode npm nvmなど実行するとき、アクセス権限が聞かれることがあるので、管理者権限でvscodeを起動しました。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228366/658462f4-7070-175a-41ef-b2dc3261adcc.png)
プロジェクトTestPlugin01のあるフォルダを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228366/3001b8e9-f7c4-0cff-6e0c-816c6cd0fe5d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228366/683833e9-b5d5-cd51-db51-121cad10ba37.png)
開けたら以下の表示になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228366/c1c1b200-e360-310c-3f2d-d4847143bb25.png)


visual studio codeに拡張機能「Debugger for Chrome」をインストールします。既にインストールされているなら、スキップで大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228366/49872b8e-f80b-8d41-fefe-9fec8f395ed7.png)
次はDebugのアイコンをクリックし、Debugの設定をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228366/fbce823e-417f-c838-e1ef-0d299d45f51e.png)
歯車アイコンをクリックし、出てきた一覧からNode.jsを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228366/181fb562-e1e1-5399-9a32-2957ce38c51f.png)
デバッグの設定用ファイルが自動的に生成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228366/f50cb84b-6557-524c-3f01-4eba6da0bb3b.png)
こちらのlaunch.jsonの内容を以下の設定に変えましょう。
設定について https://qiita.com/wataradio/items/6005f8257ae43914de04 を参考にしています。

```json:launch.json
{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Electron Plugin: Main",
            "type": "node",
            "request": "launch",
            "cwd": "${workspaceRoot}",
            "runtimeExecutable": "electron",
            "runtimeArgs": [
                "--remote-debugging-port=9223"
            ],
            "args": [
                "C:\\CocosCreator\\resources\\app",
                "${workspaceRoot}"
            ],
            "windows": {
                "runtimeExecutable": "electron.cmd"
            },
            "console":"integratedTerminal",
        },
        {
            "name": "Electron Plugin: Renderer",
            "type": "chrome",
            "request": "attach",
            "port": 9223,
            "webRoot": "${workspaceRoot}",
            "timeout": 30000
        }
    ],
    "compounds": [
        {
            "name": "Electron: All",
            "configurations": [
                "Electron Plugin: Main",
                "Electron Plugin: Renderer"
            ]
        }
    ]
}
```

上記の設定の中で、唯一自分の環境に合わせて変える必要があるのは、argsの一行目のところになります。
設定するのはapp.asarの解凍済みのappフォルダのフルパスなので、もしCocosCreatorのインストール先が違う場合、そのインストール先に合わせてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228366/623cfa8c-98ac-6562-c976-b696acdb60c5.png)


### pluginのデバッグ
デバッグアイコンをクリックしてデバッグビューを表示し、'Electron: All'コンフィグレーションを選択してF5キーを押すか緑の再生ボタンをクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228366/b9e3fc30-888b-2bee-27b2-35c888cca56e.png)
すると、デバッグ処理が走り、vscodeのCALL STACKに
Electron Plugin: Main
Electron Plugin: Renderer
がRUNNING状態ということがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228366/1b98c666-032a-3254-8e02-d08118522224.png)
エラーがなければ、最終的にエディタ画面が表示されますが、CALL STACKのところは
Electron Plugin: Mainだけになってしまっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228366/caa11255-149f-3dcc-ab0a-3ee69e5cdfe1.png)
これについて把握し切れていないですが、このエディタ画面以外にダッシュボードなどの画面が一連の実行処理で自動的に閉じたことの影響ではないかと推測しています。
なので、もう一度コンフィグレーションのところからElectron Plugin: Rendererを選択し、緑の再生ボタンをクリックしてください。
もし下の二つの画面のように一覧が出てきたら、名前が「Cocos Creator」のものを選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228366/6f1fef29-c187-208e-ae2e-826d4c88d2de.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228366/be23767b-d714-1dac-68ba-8957b9e9bf04.png)
成功したらElectron Plugin: RendererがCALL STACKに追加表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228366/a32c0b35-529e-d23b-fbd7-72b01f0e5156.png)

### ブレークポイントを設定し、実際にデバッグしてみる
https://docs.cocos2d-x.org/creator/manual/en/extension/scene-script.html
こちらのページを参考に、レンダープロセスで使えるスクリプトを作成し、そのファイル名をpluginのpackage.jsonに登録します。
追加するファイル名とその内容は下記のようです。

```javascript:Scene-walker.js
module.exports = {
    'Get-canvas-children': function (event) {
        var canvas = cc.find ('Canvas');
        Editor.log ('children length:' + canvas.children.length);
        if (event.reply) {
            event.reply (canvas.children.length);
        }
    }
};
```
階層はpackage.jsonと同じにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228366/e0c20a6d-3011-f63e-1281-771a470d2613.png)

"scene-script": "scene-walker.js"をpackage.jsonに追加します。

```json:package.json
{
  "name": "myfirstplugin",
  "version": "0.0.1",
  "description": "The package template for getting started.",
  "author": "Cocos Creator",
  "main": "main.js",
  "main-menu": {
    "i18n:MAIN_MENU.package.title/myfirstplugin/open": {
      "message": "myfirstplugin:open"
    },
    "i18n:MAIN_MENU.package.title/myfirstplugin/hello": {
      "message": "myfirstplugin:say-hello"
    }
  },
  "panel": {
    "main": "panel/index.js",
    "type": "dockable",
    "title": "myfirstplugin",
    "width": 400,
    "height": 300
  },
  "scene-script": "scene-walker.js"
}
```

package.jsonと同じ階層にあるmain.jsを以下のように修正します。

```javascript:main.js
'use strict';

module.exports = {
  load () {
    // execute when package loaded
  },

  unload () {
    // execute when package unloaded
  },

  // register your ipc messages here
  messages: {
    'open' () {
      // open entry panel registered in package.json
      Editor.Panel.open('myfirstplugin');
    },
    'say-hello' () {
      Editor.log('Hello World!');
      // send ipc message to panel
      Editor.Ipc.sendToPanel('myfirstplugin', 'myfirstplugin:hello');

      // 追加する処理:Scene-walker.jsのGet-canvas-children処理を呼び出します。
      Editor.Scene.callSceneScript ('myfirstplugin', 'Get-canvas-children', function (length) {
        console.log ('get-canvas-children callback: length - ' + length);
      });
    },
    'clicked' () {
      Editor.log('Button clicked!');
    }
  },
};
```

上記作業が終わったら、メインプロセス側のmain.jsとレンダープロセス側のscene-walker.jsにそれぞれブレークポイントを付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228366/642c37a6-ddd7-a25e-98e4-ada4526c5b37.png)

エディタのメニューからExtension→myfirstplugin→helloを選択しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228366/af702123-43e6-5f0d-b9e2-4c95cd174bd2.png)
そうするとまずはメインプロセスのブレークポイントで処理が止まります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228366/8a8271d6-c58e-715a-8a5e-08542749a295.png)
Continueボタンを押すと、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228366/3610a2e5-d3c8-1ae6-8613-f0b809db05ce.png)
次はレンダープロセスのブレークポイントで止まります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228366/4ac0ad22-8965-2db7-53b8-027274d390cf.png)


これでpluginの両方のプロセスをデバッグすることができました。

参考資料:
https://qiita.com/wataradio/items/6005f8257ae43914de04
https://docs.cocos2d-x.org/creator/manual/en/extension/scene-script.html