CRI ADX2(AtomCraft)
ロボット編11 find_objects関数を使用してみよう

このチュートリアルでは、find_objects関数を使った複数のオブジェクトの一括取得について説明します。
これまで、CRI Atom Craftを操作するための様々な関数を紹介してきましたが、 どの関数も1回の呼び出しで1つのオブジェクトを取得する関数でした。
find_objects関数は、1回の呼び出しで複数のオブジェクト取得ができるとても便利な関数です。
是非このチュートリアルで、find_objects関数の使い方を覚えましょう。

これからワークユニット内の全てのウェーブフォームリージョンに、一括でボイスリミットグループを設定するスクリプトを書いていきます。

本チュートリアルは、チュートリアル「プロジェクトの作成と波形ファイルをキューに登録」で作成したプロジェクトを使用します。
プロジェクトを開いていない場合は、プロジェクトを開くか、「プロジェクトの作成と波形ファイルをキューに登録」にて作成したスクリプトを実行してから、チュートリアルを進めましょう。

スクリプトファイルの準備

スクリプトメニューで「スクリプトリスト...」を選択し、スクリプトリストからのスクリプト実行ウィンドウ表示します。
スクリプトリストウィンドウの新規作成ボタンを押して、以下の名前でスクリプトファイルを作成しましょう。

スクリプトの保存先 スクリプトファイル名
tutorials [CRI] tutorial05-2_use_find_object.py

スクリプトの説明

作成したスクリプトをダブルクリックして、スクリプトエディターからのスクリプト実行で開きます。
スクリプトリストからのスクリプト実行ウィンドウでスクリプトの内容が一覧できるように、スクリプトの説明を次のように記述しましょう。

# --Description:[チュートリアル]find_objects関数を使う&ウェーブフォームリージョンにボイスリミットグループを一括設定

モジュールのインポート

スクリプトの説明が記述できたら、スクリプトで CRI Atom Craftを操作するため、次のモジュールをインポートします。

import sys
import cri.atomcraft.debug as acdebug
import cri.atomcraft.project as acproject

プロジェクト操作のためにProjectモジュール 、ログ出力のためにDebugモジュールをインポートします。

設定するボイスリミットグループを取得

ウェーブフォームリージョンに設定するボイスリミットグループを取得します。
ボイスリミットグループの取得には、「ゲームデータ(ACF, ACB)の出力」チュートリアルでのターゲットコンフィグの取得と同じように次の関数を使います。

関数名 説明
get_global_folder 全体設定フォルダー直下の各オブジェクトフォルダーを取得します
get_child_object 親オブジェクトを指定して、子オブジェクトを取得します

これらの関数を使って、ボイスリミットグループの取得をスクリプトで記述すると次のようになります。

# ボイスリミットグループフォルダーを取得
voicelimit_group_folder  = acproject.get_global_folder("VoiceLimitGroupFolder")["data"]

# ボイスリミットグループ「VoiceLimitGroup_0」を取得
voicelimit_group = acproject.get_child_object(voicelimit_group_folder, "VoiceLimitGroup", "VoiceLimitGroup_0")["data"]

同時発音数を管理するためのボイスリミットグループはget_global_folder関数を使って、全体設定にあるボイスリミットグループフォルダーから取得します。
ボイスリミットグループフォルダーを取得後、get_child_objectを使ってボイスリミットグループフォルダー直下のボイスリミットループ「VoiceLimitGroup_0」を取得してvoicelimit_group変数に格納しています。

ボイスリミットグループを設定するウェーブフォームリージョンを取得

続いて次の関数を使って、ワークユニット以下の全てのウェーブフォームリージョンを取得します。

関数名 説明
get_workunit ワークユニットを取得します
find_objects 再帰検索を行い一致したオブジェクトをリスト形式で取得します

これらの関数を使って、ウェーブフォームリージョンの取得をスクリプトで記述すると次のようになります。

# ワークユニットを取得
workunit = acproject.get_workunit("WorkUnit_Tutorial")["data"]

# find_objects を使って、キューシートに含まれるウェーブフォームリージョンのリストを取得
waveformRegions = acproject.find_objects(workunit, "WaveformRegion")["data"]

find_objects による複数ウェーブフォームリージョン取得の解説

find_objects関数を使用して、ワークユニット以下の全てのウェーブフォームリージョンをリスト形式で取得しています。
find_objects関数には、「検索のルートとなるオブジェクト」、「取得するオブジェクトタイプ」を指定します。
ワークユニット以下の全ウェーブフォームリージョンの取得なので、 workunit変数、"WaveformRegion" (ウェーブフォームリージョンのタイプ名)を指定して、取得したリストをwaveformRegions変数に格納しています。

各ウェーブフォームリージョンにボイスリミットグループを設定

先ほど取得したウェーブフォームリージョンのリストから1つずつフウェーブフォームリージョンを取り出し、ボイスリミットグループを設定します。
ウェーブフォームリージョンのリストからウェーブフォームリージョンのを取り出しには for 制御文を使います。

# for を使って、ウェーブフォームリージョンリストからウェーブフォームリージョンを一つずつ取り出し
for region in waveformRegions:
    # ウェーブフォームリージョンにボイスリミットグループを設定
    acproject.set_value(region, "VoiceLimitGroup", voicelimit_group)

acdebug.log("[チュートリアル]find_objects関数を使う&ウェーブフォームリージョンにボイスリミットグループを一括設定 が完了しました")

スクリプトの保存と実行

これで本チュートリアルのスクリプト記述は終了です。
スクリプトを保存し、実行します。
スクリプトが正常に実行されると以下のように、ワークユニット内の全てのウェーブフォームリージョンにボイスリミットグループ「VoiceLimitGroup_0」が設定されます。