このページでは、Unreal Editor で Python の使用を開始する方法について説明します。
Python を使用する理由
近年、Python は、特にメディアおよびエンターテイメント業界において、制作パイプラインや 3D アプリケーション間の相互運用における事実上の標準言語となりました。 さまざまなアプリケーションでサポートされるようになったことが主な理由です。 制作パイプラインが複雑さを増し、使用するアプリケーションの数も増加していく中で、共通のスクリプト言語を持つことにより大規模なアセット管理システムの構築および維持が容易になります。
こうした外部事情や他のアプリケーションとの作業の必要性を考慮しない場合でも、Unreal Editor 内でのワークフローの自動化を計画しているならば Python は優れた選択肢と言えます。 プログラミングの経験がなくても Python は比較的習得しやすく、PySide などのモジュールを通じて、全機能を提供する複雑なユーザー インターフェースを作成することができます。さらに、コミュニティ向けにその他多くの有用なモジュールが無料で提供されており、ユーザーの作業負担を軽減できます。
Unreal Editor では、Python を使用して次のような作業を行うことができます。
大規模なアセット管理パイプラインの構築や、組織で使用している他の 3D アプリケーションと Unreal Editor を結び付けるためのワークフローの作成。
スタティック メッシュの詳細度 (LOD) の生成のように、時間がかかるアセット管理タスクの Unreal Editor における自動化。
レベル内でコンテンツをプロシージャルにレイアウト。
Python でデベロッパー自身が作成した UI から Unreal Editor を制御。
Python を使用するようプロジェクトを設定する
Unreal Editor における Python のサポートは、Python Editor Script Plugin により提供されています。 エディタで Python スクリプトを実行する前に、現在のプロジェクトでこのプラグインを有効にする必要があります。
現時点では、プロジェクトごとにこのプラグインを有効にする必要があります。
プラグインを有効にするには、次の手順を実行します。
プロジェクトを開き、メイン メニューから [Edit (編集)] > [Plugins (プラグイン)] を選択します。
[Plugins (プラグイン)] ウィンドウの [Scripting (スクリプティング)] セクションに移動します。
右側のパネルにある [Python Editor Script Plugin] を見つけて、その [Enabled (有効)] ボックスをオンにします。また、多くの一般的なエディターのタスク向けに簡素化された API を提供する Editor Scripting Utilities プラグインも有効にする必要があります。 詳細については、Scripting and Automating the Editor (エディタのスクリプティングと自動化) を参照してください。
エディタを再起動します。
Python 3.11.8
Python Editor Script Plugin には埋め込みバージョンの Python 3.11.8 が含まれています。
Python を別にコンピュータにインストールする必要はありません。
Unreal は Python 3.11.8 を使用しますデフォルトでは、現在の VFX リファレンス プラットフォーム の重要な部分であるためです。
異なるバージョンの Python を使用するには、オペレーティング システムで UE_PYTHON_DIR 環境変数を設定して、埋め込むインストール場所を指定し、Unreal Engine をソースからリビルド します。
Python コードを Unreal Editor で実行する方法
Unreal Editor では、Python スクリプトをいくつかの異なる方法で実行することができます。それぞれの方法は、多少異なる使用状況を想定してデザインされています。 ユーザー自身のニーズに合わせて最適な方法を選択してください。
ブループリントとは異なり、Python 環境は Unreal Editor でのみ使用できます。Unreal Engine でプロジェクトが実行されている場合 (Play In Editor、Standalone Game、クック済み実行可能ファイルなど) は利用できません。 つまり、エディターのスクリプティングや自動化、アセット制作パイプラインの構築には Python を自由に使用できますが、現時点ではゲームプレイ用のスクリプト言語としては使用できません。
出力ログ内の Python コンソール
Unreal Editor のコンソール入力バーを切り替えると、Unreal のコンソール コマンドの代わりに Python コードを使用することができます。
これは、上の例のように [Output Log (出力ログ)] パネルで実行するか、~ を押してコンソール入力バーを表示して実行できます。
コンソールが Python モードの場合は次の操作を実行できます。
コマンド ウィンドウでインタラクティブな Python コンソールを使用する場合と全く同様に、一連の Python コードをこのコンソールに入力し、エディタで各行を即時実行させる。 これは Python コードを行ごとに実行する唯一の方法です。以下に紹介するその他すべての方法では、指定したスクリプト ファイルを実行します。
各行を区切るには Shift+Enter を使用するか、テキスト エディターからコピーした複数行のブロックを貼り付けて、一度に複数行のコードを実行できます。
コンソールにファイル名を入力して Python スクリプト ファイルを実行する。 Python スクリプトで追加のコマンドライン引数が必要な場合は、これらをスクリプト名の後に含めます。
Python のビルトイン print 関数による出力も、 [Output Log (出力ログ)] パネルにリダイレクトされます。
py コンソール コマンド
コンソールが Cmd モードの場合、py コマンドを使用すると、前述の Python コンソールに入力した場合と同様に、残りの行を Python コードとして実行できます。
例えば、このコードでは指定したスクリプト ファイルが実行されます。
コマンドライン
py "C:\MyScripts\my_script.py"エディター起動時にこのコマンドを ExecCmd コマンドライン パラメーターの値として実行することは推奨されません。 実行すると、エディタ環境の準備が整う前、例えばスタートアップのレベルが完全にロードされる前にスクリプトが実行されます。 より適切なオプションについて、以下のセクションを参照してください。
[File] メニュー
Unreal Editor のメイン ウィンドウにある [File (ファイル)] メニューには、Python スクリプト ファイルの実行に使用できる新しいオプションが用意されています。
実行したことのない新しいスクリプト ファイルをコンピューター上で参照するには、[Execute Python Script (Python スクリプトを実行)] を使用します。
以前実行したことがあるスクリプトを再実行するには、[Recent Python scripts (最近の Python スクリプト)] リストを使用します。 当該のファイルがディスクから再び読み取られるため、以前に実行した後にスクリプトを変更した場合は、新しい内容が実行されます。
コマンドライン
Unreal Editor をコマンドラインまたはスクリプトから起動する場合は、Python スクリプト ファイルをコマンドライン引数で指定します。 Python スクリプトで追加のコマンドライン引数が必要な場合は、これらをスクリプト名の後に含めます。
コマンドラインから Python スクリプトを実行するには 2 つの方法があります。 いずれの方法でも、エディタは Python スクリプトの実行直後に終了します。
オプション 1:フル エディタ この方法では、フルの Unreal Editor が起動し、指定したプロジェクトを開いてデフォルトのスタートアップ レベルをロードします。すべてのものがロードされて準備ができると、Python スクリプトが実行されます。 この方法は、プロジェクト内やロードに時間がかかるレベル内のコンテンツとのインタラクションが必要なスクリプトの場合に適しています。
コマンドラインに ExecutePythonScript 引数を追加し、その値を実行する Python スクリプトのパスとファイル名に設定します。 たとえば、次のようになります。
コマンドライン
> UnrealEditor-Cmd.exe "C:\projects\MyProject.uproject" -ExecutePythonScript="c:\my_script.py"上記の方法では、プロジェクトで Editor Scripting Utilities プラグインを有効にしておく必要があります。 コマンドラインで指定した Unreal Engine プロジェクトで、Python スクリプト プラグインをあらかじめ有効にしておく必要があります。
オプション 2:コマンドレット この方法は高速に実行でき、エディタ UI を開かずにヘッドレス モードでスクリプトを実行することもできます。
UnrealEditor-Cmd.exe のコマンドラインに次の引数を追加します。-run=pythonscript -script=<script_file_or_code> を使用します。 <script_file_or_code> は、次のいずれかの値を取ります。
実行する Python スクリプトのパスとファイル名。
実行する Python ステートメントとコマンド。 必要に応じて、文字列の改行をエスケープするために文字列で
\nを使用できます。
たとえば、次のようになります。
コマンドライン
> UnrealEditor-Cmd.exe "C:\projects\MyProject.uproject" -run=pythonscript -script="c:\\my_script.py"または:
コマンドライン
> UnrealEditor-Cmd.exe "C:\projects\MyProject.uproject" -run=pythonscript -script="a=5 \nb=10 \nc=a+b \nf=open('D:\myfile.txt','w+') \nf.write(str(c)) \nf.close()"このコマンドレットではレベルを自動的にロードしないため、スクリプトを記述する際に、最初に行う処理として次の行を追加します。
コマンドライン
unreal.get_editor_subsystem(unreal.LevelEditorSubsystem).load_level("/Game/maps/UVlayoutTest.UVlayoutTest")コマンドラインで指定した Unreal Engine プロジェクトで、Python スクリプト プラグインをあらかじめ有効にしておく必要があります。
「init_unreal.py」ファイル
エディターが init_unreal.py というスクリプト ファイルを、設定済みのパスで検出した場合(後述の「Unreal Editor の Python パス」を参照)、自動的にそのスクリプトを即座に実行します。
これは、プロジェクトまたはプラグインで作業をしており、そのコンテンツで作業している全員がエディタの起動時に同じ初期化コードを実行する必要があることがわかっている場合に適した方法です。 その場合は初期化コードをこの名前でスクリプト内に含め、作業のプロジェクトまたはプラグインの「Content/Python」フォルダに保存します。
スタートアップ スクリプト
[Project Settings] では、そのプロジェクトを開く際に常に実行する Python スクリプトを指定できます。 これらのスクリプトは、デフォルトのスタートアップ レベルが完全にロードされた後にエディタによって実行されます。
[Edit (編集)] > [Project Settings (プロジェクト設定)...] を選択します。 [Plugins (プラグイン)] のリストから[Python] を選択します。 スクリプトをStartup Scripts (スタートアップ スクリプト) 設定に追加します。
完了したら Unreal Editor を再起動します。 次回エディタでプロジェクトをロードする際に、新しく追加したスタートアップ スクリプトが実行されます。
エディタ専用のブループリント
Python スクリプト プラグインでは、ブループリント グラフの評価中に、Python コードのスニペットまたはファイルの実行に使用できるブループリント ビジュアル スクリプティングに新しいノードを公開します。
Python の実行ノードは、エディタ ユーティリティ ウィジェットやエディタ ユーティリティ ブループリントのようなエディタ専用のブループリント クラスのみで使用可能です。 ブループリントを使ったエディターのスクリプティングを参照してください。 このメソッドは、アクタから直接派生させたクラスなど、ランタイム時に使用可能なブループリント クラスでは使用できません。
[Blueprint (ブループリント)] パレットの [Python] > [Execution (実行)] セクションには次のノードが表示されます。
Python スクリプトを実行 | 渡すか、または Python Command 入力に入力するリテラル Python コードを実行します。 これはブループリントから Python を呼び出すための推奨される方法で、Python で新しい BlueprintFunctionLibrary(BPFL) タイプを作成する方法に取って代わるものです。
このノードではファイルを実行することができません。 実行できるのは Python コードのみです。 | |
Python コマンドを実行 | 渡した、または Python Script 入力欄に入力したリテラルの Python コードやファイルを実行します。 ノードは入力に基づき、それがリテラル コードかファイル名かを判断しようとします。 -Python コードまたはファイルの実行に成功すると、Return Value 出力は「True」となり、失敗した場合は「False」となります。 False の場合は、[Output Log (出力ログ)] でエラーを確認できます。 | |
Python コマンドの実行 (高度) | 渡した、または Python Script 入力欄に入力したリテラルの Python コードやファイルを実行します。 このノードは Python コマンドの実行に似ていますが、いくつかの追加入力および出力があり、特定の状況で役立つ場合があります。
|
Unreal Editor における Python 環境とパス
相対パスで Python スクリプトを実行する場合、またはスクリプト内で import コマンドを使用して別のスクリプト モジュールをインポートする場合、実行またはインポートするスクリプトは、Python 環境の sys.path 変数にリストされている任意のパスに配置できます。
Unreal エディターでは、この sys.path リストに以下のパスを自動的に追加します。
プロジェクトのフォルダー内にある「Content/Python」サブフォルダ。
Unreal Engine のメイン インストール フォルダにある、「Content/Python」サブフォルダ。
有効化されている各プラグインのフォルダーにある「Content/Python」サブフォルダ。
ユーザーディレクトリ内にある「Documents/UnrealEngine/Python」フォルダ。 たとえば、Windows 10 では、これは
「C:/Users/ユーザー名/Documents/UnrealEngine/Python」に相当します。
このリストには、以下のいずれかの方法で独自のパスを追加することもできます。
プロジェクト設定を使用します。 [Edit (編集)] > [Project Settings (プロジェクト設定)...] を選択します。 [Plugins (プラグイン)] のリストから[Python] を選択します。 次に、[Additional Paths (追加パス)] 設定にパスを追加します。 完了したら Unreal Editor を再起動します。
オペレーティング システムで、
UE_PYTHONPATH(エディタの分離されたインタープリタ環境オプションを無効にしている場合はPYTHONPATH) 環境変数にパスを追加し、その後 Unreal Editor を再起動します。Python スクリプト内または Python コンソールで、
「sys.path」リストに直接パスを追加します。
詳細については、「Python sys.pathに関するドキュメント」を参照してください。
Unreal Engine に組み込まれている Python インタープリターは、デフォルトで分離モードで実行されます。 分離モードを無効にするには、[Edit] > [Project Settings] > [Plugins] > [Python] > [Isolate Interpreter Environment (インタープリタ環境を分離)] を選択します。
詳細については、「Python のコマンドライン -I オプションに関するドキュメント」を参照してください。
UE_PYTHONPATH 環境変数は常にエンジンによって解析され、選択した分離モード オプションにかかわらず、そのコンテンツは sys.path に追加されます。 UE_PYTHONPATH は PYTHONPATH 変数と同じ役割を持ちますが、サードパーティのソフトウェアによる変更は避けてください。
Unreal Editor の Python API について
Python Editor Script Plugin では、Unreal Editor、プロジェクトに含まれるアセット、レベル内のコンテンツとのインタラクションに使用可能な数多くのクラスおよび関数が公開されます。 この API はすべて unreal モジュールに含まれています。 この API にアクセスするには、エディタの Python 環境内で実行する Python スクリプトの冒頭にこのモジュールをインポートします。
import unrealunreal モジュールでは、エディター環境内で C++ からブループリントに公開されるものは、ほぼすべて利用可能です。 このモジュールは事前には生成されず、エディタのブループリントで使用可能なものすべてを自動的に反映します。 Unreal Editor で新たにプラグインを有効にすると、このプラグインでブループリントに対して公開されるものはすべて Python でも使用できるようになります。 プロジェクトで作成してブループリントに公開する C++ コードについても同様です。
Python API では、Python デベロッパーの負担を減らすべく、Unreal のネイティブ API を可能な限り扱いやすい方法で公開します。 たとえば、次のようになります。
Python タイプとネイティブ タイプ間でのシンプルなデータ タイプの変換は、必要に応じて透過的に行われます。
Python のリスト (list)、セット (set)、または辞書 (dict) を渡す際に、それが自動的に Unreal の配列 (array)、セット (set)、またはマップ (map) に変換されます。 API 関数によって返されたリスト、セット、または辞書を取得すると、実際には Unreal クラスのインスタンスを取得しますが、この API はベースとなる Python のリスト、セット、または辞書タイプと完全に一貫しています。Python クラスでは、それが表すネイティブ タイプと同じ継承階層が維持されます。 これは、例えばビルトインの Python 関数
isinstance()type (型)およびtype()を使用して、オブジェクトが特定のクラスから派生しているか、または一致しているかを確認できることを意味します。この API は、C++ およびブループリントに対して適用される Unreal の命名規則と Python の命名規則の間で、良好なバランスを取るよう設計されています。 Python API のクラスおよびオブジェクトは、ブループリントでも同じ名前を維持します。 通常、これはプレフィックスを除いたネイティブタイプと同じ名前です (例:
UまたはT)。 関数およびプロパティ名は、小文字のsnake_caseとして自動的に公開されます。 たとえば、通常はunreal.StaticMeshActor.get_actor_transform()などの関数を呼び出します。 列挙型の値の名前は、大文字のSNAKE_CASEとして自動的に公開されます。公開されたすべての関数では、順序付けされたパラメータまたは名前付けされたパラメータ (順序は問わず) を受け入れることができます。 例えば、次の 2 つの関数呼び出しは同じことを表しています。
C++unreal.get_editor_subsystem(unreal.StaticMeshEditorSubsystem).join_static_mesh_actors(list_of_actors, my_options) unreal.get_editor_subsystem(unreal.StaticMeshEditorSubsystem).join_static_mesh_actors(join_options=my_options, actors_to_join=list_of_actors)
API リファレンス
Unreal Python API によって公開されるすべてのクラスおよび関数の詳細については、次の API リファレンスで参照できます。
Unreal Editor Python API リファレンス
この API リファレンスは、プラグインによって Python に公開可能なクラスおよび関数の完全なリストではありません。 API リファレンスに記載されていない追加のプラグインをインストールし、そのスクリプティング機能がどのように Python に公開されるかを調べる必要がある場合は、必要なプラグインのドキュメントを含む、独自のローカル版 API リファレンスを作成してください。 この手順については、Unreal Engine のインストール フォルダ内の「Engine\Plugins\Experimental\PythonScriptPlugin\SphinxDocs」にある「readme」ファイルを参照してください。
Python API を使用するためのベスト プラクティス
このセクションでは、Python API を使用する際に留意すべき重要事項をいくつか紹介します。
アセットを使用して作業する
プロジェクトでアセットの作業を行う場合は、必ず Unreal Python API の関数を使用してください。 ディスク上のアセット ファイルに対して、Python にビルトインされているファイル管理モジュールは絶対に直接使用しないでください。 例えば、アセットを異なるフォルダに移動する場合、os.rename や shutil.move などの Python 関数は使用しないでください。 Unreal プロジェクトおよびアセットには内部コンテンツの参照が含まれているため、このルールに準拠しない場合はそれらが破損する可能性があります。
代わりに、Editor Scripting Utilities プラグインで提供される unreal.EditorAssetLibrary API、または Unreal Python API に組み込まれている unreal.AssetTools クラスを使用することを推奨します。
エディタのプロパティを変更する
Python を使用して、プロジェクトのオブジェクトにアクセスしたり、これらのオブジェクトの多くの設定プロパティをプログラムで設定したりできます。 例えば、Python スクリプトでは現在のレベルでスタティック メッシュ アクタにアクセスして、アクタがダメージを受けるかどうかや、ゲーム内でアクタを非表示にするかどうかなどのプロパティを設定できます。 また、スタティック メッシュ コンポーネントを取得して、そのライトマス設定やリンク先のスタティック メッシュ アセットなど、コンポーネント上でプロパティを設定することができます。
これらのプロパティは、次の 2 つの方法で Python に公開することができます。
BlueprintReadOnly または BlueprintReadWrite フラグの付いたアイテムは、オブジェクトのシンプルなプロパティとして公開されます。
これらのプロパティは、Python オブジェクトのプロパティにアクセスするのと同じように、読み取りおよび変更が可能です。ViewAnywhere または EditAnywhere フラグを持つアイテムは、「エディタ プロパティ」として公開されます。
これらの値の読み取りおよび書き込みには、すべてのオブジェクトで公開されている関数set_editor_property()およびget_editor_property()を使用します。
各クラスの API リファレンスで、クラス説明の直後にエディタ プロパティのリストが記載されています。 これらの値はすべて、set_editor_property() 関数と get_editor_property() 関数を使って設定および取得することができます。 オブジェクトの設定プロパティを設定または取得する必要がある場合は、まず初めにこのリストに目的のプロパティが記載されているかを確認します。
通常、オブジェクト プロパティとエディタ プロパティの両方として公開されている値を読み取る必要がある場合、このプロパティに直接アクセスすることにより得られる結果は、
get_editor_property()関数を呼び出して得られる結果と同じです。 ただし、get_editor_property()関数は、多くの場合、Python オブジェクトで直接公開されていないプロパティにもアクセスします。オブジェクト プロパティとエディタ プロパティの両方として公開されている値を設定する必要がある場合は、オブジェクトの値を直接設定するのではなく、通常は
set_editor_property()関数を使用して設定してください。 UI でプロパティを調整すると、多くの場合エディタはバックグラウンドで追加の処理(編集前後の変更)を実行します。 通常、これらの処理はユーザーの選択に基づいたものであり、エディタの UI とゲーム内でのオブジェクトの状態の同期を維持します。 Python オブジェクトでこれらのプロパティを直接変更すると、このエディタ コードは自動的には実行されなくなります。 一方、プロパティの状態を設定するためにset_editor_property()を呼び出すと、エディター UI の 詳細パネル詳細パネル詳細パネル詳細パネル [Details] パネルで設定を変更した場合と同様に、編集前後のコードがトリガーされます。
たとえば、メディア プレーヤー オブジェクトには、Play on Open (開いたときに再生) の設定があります。
これは unreal.MediaPlayer クラスの play_on_open クラスメンバーとして公開されます。
import unreal
obj = unreal.MediaPlayer()
# Modifying a property directly can have different results
# than changing settings in the Editor UI.
# Generally you'll want to avoid setting these values directly, like this:
obj.play_on_open = True
# This way of accessing the property will have exactly the same
# result as changing the setting in the Editor UI:
obj.set_editor_property("play_on_open", True)
# Both ways of reading the value are equivalent.
可能な場合は Unreal タイプを使用する
演算操作や 3D 座標の操作のためのクラスなど、Unreal Python API で利用可能なユーティリティが必要な場合は、ユーザー独自の実装ではなく、Unreal ユーティリティを使用することを推奨します。 Unreal のバージョンは、エンジン環境において最高のパフォーマンスを発揮するよう最適化されています。
例えば、3D 空間の座標を操作する必要がある場合は、unreal.Vector クラスを使用してください。
import unreal
v1 = unreal.Vector()
v1.x = 10
v2 = unreal.Vector(10, 20, 30)
v3 = (v1 + v2) * 2
print(v3)ログおよびフィードバック
unreal オブジェクトは、エンジンおよびエディターのすべてのサブシステムで使用される同じメッセージングシステムを介して、ログ、警告、およびエラーメッセージを送信できる関数を公開しています。 スクリプトを使ってユーザーにメッセージを送信する必要がある場合は、この標準化されたログ フレームワークを使用することを推奨します。
unreal.log()を情報メッセージの出力に使用します。 利便性を図るため、Pythonprint()関数も内部的にunreal.log()を経由するよう実装され内部的に処理されます。潜在的な問題をユーザーに警告するには、unreal.log_warning()を使用します。unreal.log_error()は、スクリプトが想定通りに実行されない深刻な問題に使用します。
これらのメッセージは、他のサブシステムから送信されたメッセージとともに、[Output Log] パネルに表示されます。
アンドゥとリドゥのサポート
スクリプトでは、Unreal Editor にビルトインされている Undo (アンドゥ) / Redo (リドゥ) システムをフル活用することができます。
定義する各トランザクションには、Python の操作をいくつでも含めることができます。 これらのトランザクションを使用することで、大規模な操作や多数の異なるオブジェクトの操作を Undo / Redo 履歴に一つのエントリとしてまとめて記録することができます。 複数のオブジェクトに対して特定の変更を加えることを意図したスクリプトの場合、通常は、各変更を異なるエントリとして Undo / Redo 履歴に記録するのではなく、すべてのオブジェクトに対するすべての変更を元に戻す一つのエントリとして記録することを推奨します。
トランザクションを定義するには、unreal.ScopedEditorTransaction スコープを使用します。 例えば、次のコードを実行するとします。
import unreal
obj = unreal.MediaPlayer()
with unreal.ScopedEditorTransaction("My Transaction Test") as trans:
obj.set_editor_property("play_on_open", False)
obj.set_editor_property("vertical_field_of_view", 80)エディタの [Undo History (元に戻す操作の履歴)] パネルに、そのトランザクションが名前付きで表示されます。
一般的なルールとして、スコープ済みのトランザクションには、エディタの UI でも元に戻すことが可能な操作を含めることができます。 ただし、エディタの操作すべてを元に戻せるわけではありません。 例えば、エディタ UI でモデルのインポートを元に戻すことはできないため、unreal.ScopedEditorTransaction 内でモデルのインポートを試みても、期待どおりには機能しない場合があります。
遅い操作の進捗ダイアログ
多数のアセットまたはアクタに対する処理を一つの操作で行うスクリプトの場合は、処理に時間がかかることがあります。 Python スクリプトが実行されている間は、Unreal Editor の画面でユーザーによるインタラクションがブロックされます。 大規模なタスクの進捗状況に関する情報をユーザーに提供し、エディタがフリーズまたはハングしているように見えるのを避けるために、unreal.ScopedSlowTask スコープを使用できます。
たとえば、次のようになります。
import unreal
total_frames = 100
text_label = "Working!"
with unreal.ScopedSlowTask(total_frames, text_label) as slow_task:
slow_task.make_dialog(True) # Makes the dialog visible, if it isn't already
for i in range(total_frames):
if slow_task.should_cancel(): # True if the user has pressed Cancel in the UI
break
slow_task.enter_progress_frame(1) # Advance progress by one frame.
# You can also update the dialog text in this call, if you want.