ほげたつブログ

プログラムとアニメーションをかじって生きてる

UE4 Python を VSCode でリモートデバッグする

UE4 の Control Rig をポチポチ触ってると Python でツール化したい作業が増えてきますが、少しでも複雑な事をやろうとすると Python スクリプト実行時にデバッガが欲しくなるため、VSCode でリモートデバッグする方法について書いておきます。

はじめに

VSCode でリモートデバッグしたい場合は ptvsd を使用します。筆者は Python 編集環境として主に VSCode を使っているので Maya プラグイン作成時等でも ptvsd を使っています。

検証環境は Windows10 64bit / UE4.26.0 です。

ptvsd をダウンロード

以下より zip ファイルをダウンロードします。展開場所は UE4 プロジェクト直下などでいいでしょう。

pypi.org

f:id:hogetatu:20201206224319p:plain


UE4 Python を有効化

まずはプラグインを有効化します。

f:id:hogetatu:20201206224601p:plain


プラグインを有効化したら Developer Mode を有効にしましょう。これで [UE4 プロジェクトパス]\Intermediate\PythonStub\unreal.py が出力されるので、コード補完等で便利に使えます。

f:id:hogetatu:20201206224735p:plain


デバッガにアタッチするスクリプトを作成

[UE4 プロジェクトパス]\Content\Python 以下に attach_to_debugger.py というファイルを作成します。UE4 は初期状態で [UE4 プロジェクトパス]\Content\Python に対してパスを設定するので、ここに配置しておけば簡単に呼び出せます。

attach_to_debugger.py

# coding: utf-8
import os
import sys

def attach_to_debugger(host, port):
    try:
        ptvsd_path = "{}/../../ptvsd-4.3.2/src".format(os.path.dirname(__file__))
        if not ptvsd_path in sys.path:
            sys.path.append(ptvsd_path)

        import ptvsd
        ptvsd.enable_attach(address=(host, port))
        ptvsd.wait_for_attach()
        print("[ptvsd] debugger is attached. %s:%s" % (host, port))

    except:
        import traceback
        traceback.print_exc()

attach_to_debugger('127.0.0.1', 60058)

 

VSCode でリモートデバッグ設定を作成

デバッグタブから create a launch.json file します。ここでは VSCode の Workspace 設定ファイル (XXX.code-workspace) に追加する手順を記載します。

f:id:hogetatu:20201206233412p:plain


Workspace -> Python -> Remote Attach -> アタッチ先アドレス (127.0.0.1) を入力 -> アタッチ先ポート番号 (60058) を入力 ※ポート番号は空いていればどこでもいいです

f:id:hogetatu:20201206233728p:plainf:id:hogetatu:20201206233732p:plainf:id:hogetatu:20201206233738p:plainf:id:hogetatu:20201206233742p:plainf:id:hogetatu:20201206233749p:plain


これにより Workspace 設定ファイル に下記設定が追加されます。remoteRoot は "${workspaceFolder}" に変更して下さい。これで Pythonデバッグする準備は整いました。

{
    "folders": [
        {
            "path": "."
        }
    ],
    "launch": {
        "version": "0.2.0",
        "configurations": [
            {
                "name": "Python: アタッチ",
                "type": "python",
                "request": "attach",
                "connect": {
                    "host": "127.0.0.1",
                    "port": 60058
                },
                "pathMappings": [
                    {
                        "localRoot": "${workspaceFolder}",
                        "remoteRoot": "${workspaceFolder}"
                    }
                ]
            }
        ]
    }
}

 

リモートデバッグに接続する

リモートデバッグに接続するために作成した attach_to_debugger.py を UE4 から実行します。コンソールコマンドに「py attach_to_debugger.py」と入力して Enter を押して下さい。

f:id:hogetatu:20201206235642p:plain


この設定では接続を待つのでエディタが停止します。VS Code 側で F5 を押し、リモートデバッグを開始します。正常に接続できたらエディタが再開します。

試しに test.py というファイルを作成し、ブレークポイントを設定してみます。その状態でコンソールコマンドに「py test.py」と入力して実行するとブレークポイントで停止することが確認できます。

f:id:hogetatu:20201207001250p:plain


おわりに

本当はエディタ起動時に実行される init_unreal.py で ptvsd.enable_attach し、任意のタイミングでデバッグ接続というフローにしたかったのですが、ptvsd.wait_for_attach で待つようにしてからじゃないと接続できなかったので現状は attach_to_debugger.py を実行するようにしています。Maya とかでは起動時に enable_attach して問題無く動作しています。解決方法を知っている方がいれば Twitter とかで教えて下さい。

(おまけ)PyCharm でリモートデバッグ

PyCharm でデバッグしたい場合はこちらの記事が参考になると思います。

qiita.com