0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ADX2ロボット機能で大量波形から任意の波形をコピーする

Last updated at Posted at 2021-02-04

#はじめに
ゲームで利用しているボイスとかすごい数があって管理が結構大変なのですが、

例えば一部ですが、
image.png

こんな感じで、プログラムから扱いやすいように数字だけの波形(マテリアル)がずらっと入っていたりします。

#ケース
image.png

これは、とあるやりとりででてきたのですが、
この1万弱のボイスの中から上のファイルを抽出する・・・
ちょっとやばい。(まぁ、アクセスしやすいようにある程度フォルダ分けたりはしているけど)

こんな時にADX2ロボット機能が便利。

#UI

これは、ADX2上で動かす用途なので、
右側に改行区切りのファイル名(マテリアル名)拡張子無しを入力し、
出力フォルダを指定します。(フォルダはあらかじめ作っておく)

image.png

#スクリプト

検索して
マテリアルのソースパスからファイルをコピーする
という処理を数だけまわしています。

ファイルコピーにはshutilを使いました。

CopyWaveFile.py
# --Description:[tatmos]指定したマテリアルの波形を別フォルダへコピーする
import sys
import cri.atomcraft.project
import cri.atomcraft.project as acproject
import cri.atomcraft.debug as acdebug
import shutil

# --BeginUserVariable
"""
SEARCH_NAME:
  type:string
  comment:改行区切りのファイル名(拡張子なし)
OUTPUT_PATH:
  type:string
  comment:出力先のフォルダ名
"""
SEARCH_NAME = '''100035170
100035180
120580380
130260070
140590020
140590030
150170130
150190300
160295130
160320000
160320035
330080020
330080030'''
OUTPUT_PATH = "C:/MyDearest/github/ADX2Robot/Output"
# --EndUserVariable

# 選択しているマテリアルルートフォルダを得る
searchRoot = acproject.get_selected_objects("MaterialSubFolder")["data"]
if not searchRoot :
    acdebug.warning("検索するマテリアルルートフォルダを選択してください。")
    sys.exit()

# オブジェクトパス表示
acdebug.log("Target Path:\"{0}\"".format(acproject.get_object_path(searchRoot[0])["data"] ))

# マテリアル一覧を得る
Materials = acproject.find_objects(searchRoot[0], "Material")["data"]

print("Material Num :{0}".format(len(Materials)))

# 文字列を改行で分割
searchNameList = SEARCH_NAME.splitlines()
print(searchNameList)

# マテリアルを探す
for material in Materials:
    material_name = acproject.get_value(material, "Name")["data"]
    #探す
    for searchName in searchNameList:
        #見つけたら
        if material_name.replace('.wav', '') == searchName:
            srcPath = acproject.get_value(material, "SrcFileAbsolutePath")["data"]
            acdebug.log("Target Path:\"{0}\"".format(srcPath))
            #コピー
            dstPath = OUTPUT_PATH + "/" +material_name
            shutil.copyfile(srcPath, dstPath)

#あとがき
このスクリプトを書くのに45分くらいかかっているから、 
16個のファイルをフォルダを探って探すくらいなら手でやった方が速いとは思うけど(1個1分かけても16分で終わる)。 
ちょくちょくこういうのあると思うので。
あと、手でやると番号読み違いとかコピペミスとかありそうだとかあるけど、そういうのも無問題。

また来ても、次回は瞬間で返せるはず
これで、何百とオーダーが来ても一瞬です。すばらしい。
image.png

テ、テスト・・・

あと似たような機能を作るときに、一度こういうの作っておけば、応用がきく。(ファイルの存在チェックとか)

#注意点

  • パス区切り文字に注意 \バックスラッシュだとスクリプトがおかしくなります。/に置き換えています。
  • 改行付きの文字定義も ptyhonだと扱いがちょっと工夫が必要で、初回は、ダブルクォーテーションにして、ユーザー定義の適用ボタンを押してから、‘‘‘に置き換えています。 (これくらいならユーザー定義使わずソースを書き換えてしまうのが速いかもですが)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?