UE4 x Atom Craft ロボット連携について

こんにちは!紅茶よりもコーヒー派、研究開発部の柴田です。

先日公開したばかりのADX2 LE for UE4 v1.28.01.00、皆さまもうダウンロードしていただけたでしょうか?

ADX2 LE for UE4 v1.28.01.00は、超大型新機能CRI Atom Craft ロボットに対応しています。
本記事では、UE4とAtom Craft ロボットの連携方法について紹介します。
「Atom Craft ロボットって何?」「UE4と何か関係あるの?」という方も、これを読めば今すぐ試してみたくなるはずです!

Atom Craft ロボットとは

「Atom Craft ロボット」は、AtomCraft の操作を自動化することができる機能です。
大量のサウンドデータの登録や、登録済みサウンドデータの設定変更のような作業は、
手動で行うと時間がかかる上に人為的ミスが発生しがちです。
Atom Craftロボット機能では、プログラミング言語Pythonによってこれら操作の自動化スクリプトを記述することが可能になります。
サウンドデザイナーの作業負担の軽減やデータ作成を簡略化し、ワークフローの改善に役立ちます!

UE4とAtom Craft ロボットを連携するには

Atom Craft ロボットにより、Pythonで自動化スクリプトを記述することが可能になります。
PythonといえばUE4に搭載されているPython Editor Script Pluginです!
このプラグインを使うことで、UE4 Editor上での操作をPythonスクリプトで自動化することができます。

UE4.26 より、Python Editor Script Plugin は Python 3.7に対応しました。
Atom Craft ロボットもPython 3.7に対応しています。
つまり、AtomCraftとUE4 Editorの操作を1つのPythonスクリプトで連携させることが可能なのです!

連携スクリプトのサンプル

ADX2 LE for UE4 v1.28.01.00には、UE4とAtomCraftのサンプルプロジェクトが同梱されています。
両プロジェクトを連携させるPythonスクリプトのサンプルfocus_cue_on_atomcraft.pyも、そこに含まれます。
ここでは、この連携スクリプトの動作内容と使い方について説明します。

サンプルスクリプトfocus_cue_on_atomcraft.pyの動作

サンプルスクリプトは以下のパスに配置されています。

cri/UE4/Sample/UE4Project/AtomBasicFeatures/Content/Python/focus_cue_on_atomcraft.py

本スクリプトを実行すると、UE4 Editor上で選択中のSoundAtomCueアセットに対応するキューを、
AtomCraftプロジェクト上でフォーカス状態にできます。

通常、UE4 Editor上で特定のSoundAtomCueアセットについて、その内部で参照しているキュー本体を参照・編集するには、
AtomCraftプロジェクトを開いて目的のキューを探す手間が必要です。
本サンプルスクリプトを使えば、この操作を単純化できます。

なお、本スクリプトを動作させるにはUE4 EditorとAtomCraftを同時に起動しておく必要があります。
また、AtomCraftのスクリプトサーバを起動状態にしておく必要もあります。詳細な使用手順を以下に述べます。

使い方 (AtomCraft 側の操作)

1. AtomCraft のサンプルプロジェクトを開く

ADX2 LE for UE4 v1.28.01.00 には、下記のパスにAtomCraftのサンプルプロジェクト “AtomBasicFeatures” が配置されています。

cri/UE4/Sample/AtomCraftProject/AtomBasicFeatures/AtomBasicFeatures.atmcproject

公式ダウンロードページから入手したLE版AtomCraft v3.44.20を起動して、このプロジェクトファイルを開いてください。

2. AtomCraft ロボットのスクリプトサーバーを起動する

起動したAtomCraftの「スクリプト」メニューから「サーバー」を選択し、「スクリプトサーバーを起動する」をクリックしてください。

使い方 (UE4 側の操作)

1. UE4のサンプルプロジェクトを開く

ADX2 LE for UE4 v1.28.01.00には、下記のパスにUE4のサンプルプロジェクト”AtomBasicFeatures”が配置されています。

cri/UE4/Sample/UE4Project/AtomBasicFeatures/AtomBasicFeatures.uproject

UE4.26用にこのプロジェクトをビルドして、UE4 Editorの上で開いてください。

2. UE4 Editor の Python による操作を有効化する

下記URLに従って、2つのプラグインを有効化してください。

3. Python スクリプト実行用のウィジェットを実行する

UE4プロジェクト内の下記パスにエディタユーティリティウィジェットが配置されていることを確認してください。

/Game/Utils/FocusCueOnAtomCraft

FocusCueOnAtomCraftアセット上で右クリックしてメニューを表示し、一番上の「エディタユーティリティウィジェットを実行」を選択してください。

これを実行すると、UE4 Editor上に次のようなタブが追加されます。

虫眼鏡ボタンを押すことでサンプルスクリプトfocus_cue_on_atomcraft.pyが実行されます。

4. サンプルスクリプトを実行する
適当なSoundAtomCueアセットを選択状態にして、虫眼鏡ボタンを押してください。
すると下画像のように、選択したアセットに対応するキューがAtomCraftプロジェクト側で赤色の枠によってフォーカスされます。

この画像左側ではUE4 Editor上でBallGame_BallCollided_Cueアセットを選択しています。
この状態で虫眼鏡ボタンを押した結果、画像右側のようにAtomCraft上でBallCollidedキューがフォーカスされます。

以上がサンプルスクリプトの動作と使い方の説明です。

自分のプロジェクトで使うには?

目的のUE4プロジェクトのContentディレクトリに、下記フォルダごとコピーしてください。

cri/UE4/Sample/UE4Project/AtomBasicFeatures/Content/Python

このPythonディレクトリの中には、サンプルスクリプトfocus_cue_on_atomcraft.pyの他にAtomCraftロボットのPythonモジュールが含まれています。
Atom Craft ロボットのPythonモジュールはADX2LEツールパッケージ内の下記パスにも配置されています。

cri/tools/ADX2LE/ver.3/robot/remote/Python

最新のAtomCraftツールを手に入れた際は、上記フォルダをUE4プロジェクト側のPythonフォルダへ統合することで最新のAtom Craft ロボット APIを使用可能になります。
ただしツール側のPythonフォルダには __init__.pyが配置されません。
手動で追加するか、サンプルUE4プロジェクトAtomBasicFeaturesからコピーする必要があります。ご注意ください。

実際のコード例

本記事で紹介したサンプルスクリプトのコードを以下に転載します。

# -*- coding: utf-8 -*-
#
# CRI Middleware SDK
# Copyright (c) CRI Middleware Co., Ltd.

import sys
import os.path
# CRI AtomCraft Python API
import cri.atomcraft.criatomcraft_api_lib as acconnect
import cri.atomcraft.debug as acdebug
import cri.atomcraft.project as acproject
import cri.atomcraft.preview as acpreview

# UE4 Python API
import unreal

# 破壊的
def pop_as_list(arrayobj):
    listobj = []
    listobj.append(arrayobj.pop())
    return listobj

def log_output(message):
    # AtomCraft と UE4 アウトプットログの両方にメッセージ出力
    acdebug.log(message)
    unreal.log(message)

def connect_atomcraft():
    # 通信ライブラリを初期化する
    val = acconnect.initialize()
    if val != 0:
        unreal.log("AtomCraft接続ライブラリの初期化に失敗")
        sys.exit()
    # 接続を開始する
    val = acconnect.connect("127.0.0.1", 9000)
    if val != 0:
        unreal.log("AtomCraftへの接続に失敗")
        acconnect.finalize()
        sys.exit()

def disconnect_atomcraft():    
    # 接続を終了し、ライブラリを終了する
    acconnect.disconnect()
    acconnect.finalize()

if __name__ == '__main__':
    unreal.log("AtomCraft スクリプトサーバに接続")
    connect_atomcraft()
    try:
        # 設定
        workunit_name = "WorkUnit_0"

        # 最後に選択した SoundAtomCue アセットを取得
        if unreal.EditorUtilityLibrary.get_selected_assets() == []:
            log_output("SoundAtomCue アセットを選択してください")

        ue4_last_selected_asset_on_editor = unreal.EditorUtilityLibrary.get_selected_assets().pop()
        unreal.log(ue4_last_selected_asset_on_editor.get_class().get_path_name())
        if not ue4_last_selected_asset_on_editor.get_class().get_path_name() == "/Script/CriWareRuntime.SoundAtomCue":
            raise ValueError("error!")

        # アセットのキュー名とキューシート名を取得
        cuesheet_name = ue4_last_selected_asset_on_editor.get_editor_property("CueSheet").get_editor_property("CueSheetName")
        cue_name = ue4_last_selected_asset_on_editor.get_editor_property("CueName")

        # ワークユニットを取得する
        result = acproject.get_workunit(workunit_name)
        if not result["succeed"]:
            log_output("ワークユニットの取得に失敗")
            raise ValueError("error!")
        workunit = result["data"]

        # キューシートを取得する
        result = acproject.find_object(workunit, "CueSheet", cuesheet_name)
        if not result["succeed"]:
            log_output("キューシートの取得に失敗")
            raise ValueError("error!")
        cuesheet = result["data"]

        # キューを取得する
        result = acproject.find_object(workunit, "Cue", cue_name)
        if not result["succeed"]:
            log_output("キューの取得に失敗")
            raise ValueError("error!")
        cue = result["data"]

        # AtomCraft 側でキューを選択
        acproject.select_object(cue)

    except:
        unreal.log("スクリプトの例外が発生しました")
        #unreal.log(traceback.format_exc()) # デバッグ用

    unreal.log("AtomCraft スクリプトサーバから切断")
    disconnect_atomcraft()

まとめ

本記事では、UE4とAtom Craft ロボットの連携方法を、サンプルスクリプトfocus_cue_on_atomcraft.pyを例として紹介しました。
なんとこのスクリプト、コメント行を覗けば僅か90行未満です。
今回は具体的にどのようなコードを書けばよいのか?という点については深く立ち入りませんでしたが、
気軽にサンプルスクリプトの中身を読んでみてください!

最後に、サンプルスクリプトの読解と改造を助ける参考文献を紹介します。

UE4とAtomCraftロボットの組み合わせが生む可能性は無限大です。
「これは!」という使い方を編み出した方は、技術ブログやSNSで広く共有していただけると嬉しいです!

…と、ここまでAtom Craft ロボット機能の説明を行いましたが、もう一つUE4ユーザの方にお知らせです!

UE4×ADX2 BeginnersBook公開

UE4でADX2を初めて触ってみるが何をしたら良いか分からない…
という方向けに、昨今のゲームサウンドに何が求められているのか、というところから
ミドルウェアを活用したサウンド実装まで一通り行える手順書「UE4×ADX2 BeginnersBook」を公開しました。

下記よりダウンロードできますので、チュートリアルと合わせてぜひご覧ください!
https://game.criware.jp/learn/tutorial/ue4/beginnersbook/

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です