Skip to content

Latest commit

 

History

History
144 lines (92 loc) · 7.72 KB

File metadata and controls

144 lines (92 loc) · 7.72 KB

CopyComponentsByRegex

概要

これは正規表現でマッチする、構造が同じ場所にあるコンポーネントを一括でコピーするUnityエディタ拡張です。

インストール(VCC)

VRChat Creator Companion (VCC) を使用する場合、以下の手順でインストールできます:

  1. Listingページ にアクセス
  2. 「Add to VCC」ボタンをクリックしてリポジトリを追加
  3. VCCでプロジェクトを開き、「Manage Project」から CopyComponentsByRegex を追加

インストール(UPM)

  1. Unityのメニューバーから Window -> Package Manager を開く
  2. Package Manager の左上にある + から Add package from git URL をクリック
  3. https://github.com/Taremin/CopyComponentsByRegex.git をコピー&ペーストして Add をクリック

インストール(ZIP)

このリポジトリのzipファイルをダウンロードして、解凍したものをアセット内にコピーします。

ZIPインストール時の注意

ここで注意するのは Editor フォルダも そのまま コピーすることです。

これはUnityの仕様で「Editorフォルダの中にあるスクリプトはエディターでのみ有効で、ゲーム実行時には無視される」というのがあるからです。 (参考: 特殊なフォルダー名 - Unity マニュアル)

Editor フォルダ内の *.cs ファイルのみをアセットにいれてしまうと、ゲーム実行時にも実行されてしまいエラーが発生します。

使い方

  1. ヒエラルキーでコピー元のオブジェクトを選択
  2. ヒエラルキーで右クリックしてコンテキストメニューから Copy Components By Regex をクリック
  3. Copy Components By Regex ウィンドウが開くので 正規表現 にコピーしたいコンポーネントとマッチする正規表現を書く (例: Dynamic BoneDynamic Bone Collider をコピーしたいなら Dynamic など)
  4. Copy Components By Regex ウィンドウの Copy ボタンを押す
  5. ヒエラルキーでコピー先のオブジェクトを選択
  6. Copy Components By Regex ウィンドウの Paste ボタンを押す

コンポーネント名の確認

正規表現を書く際に、オブジェクトに付いているコンポーネント名を確認したい場合は「コンポーネント一覧」の折りたたみを開いてください。 表示された一覧の「コピー」ボタンをクリックすると、そのコンポーネント名がクリップボードにコピーされます。

注意

コピー範囲外のコンポーネントへの参照

コピーするオブジェクトとコンポーネント内で完結しているオブジェクト参照(Dynamic Bone の root など)は自動的にコピー先のオブジェクトやコンポーネントに差し替えます。 逆に言えばコピーする範囲外のコンポーネントへの参照はそのままになっているため、注意してください。

オブジェクト構造の判定

構造の同一性はオブジェクトの名前で判断しているため、同じ親を持つ同名の子オブジェクトがある場合などで動作がおかしくなる可能性があります。 また、完全に構造が同一でなくても子の名前が同じならできるだけ辿ろうとするため、ボーンの増加などの場合もそのままコピーできます。

置換リスト機能

コピー元とコピー先でオブジェクト名が異なる場合(例:VRoid Studioの J_Bip_C_Head と標準的な Head)、置換リストを使用して名前の違いを吸収できます。

置換リストには2種類のルールがあります:

  1. 正規表現ルール: 任意の正規表現パターンで名前を変換

    • 例: J_Bip_C_(.+)$1 (VRMプレフィックスを削除)
  2. HumanoidBoneルール: Unity Humanoidリグのマッピング情報を動的に取得してマッチング

    • コピー元・コピー先の両方がHumanoidリグとして設定されている必要があります
    • 対応ボーングループ: すべて、頭、首、胸、脊椎、ヒップ、左腕、右腕、左脚、右脚、左手指、右手指

詳細は 置換リストガイド を参照してください。

Clothコンポーネントのコピー

Cloth コンポーネントのコピーは同じモデル同士で Cloth 部分の頂点数が同じならば、Constraints の単純なコピーが行われます。(高速) 頂点数が変わっていたり、大きく形状が変わっていた場合などは ClothコンポーネントのConstraintsを一番近い頂点からコピーする にチェックを入れて使用するとコピーできます。(少し遅い) 「一番近い頂点からコピーする」設定はコピー元とコピー先のそれぞれの頂点の座標を比較して行うのですが、Unity(5.6.3p1, 2017.4.15f1) の Cloth の追加時の頂点座標がおかしいため、あらかじめ Cloth をコピー先に追加しておいてください。

より詳しい説明

https://taremin.github.io/2018/06/12/4-CopyComponentsByRegex_%E3%81%AE%E7%B0%A1%E5%8D%98%E3%81%AA%E4%BD%BF%E3%81%84%E6%96%B9%E3%81%A8%E8%AA%AC%E6%98%8E/ により詳しい説明を書きましたので、もしよければそちらも参考にしてください。

テスト

必要環境

  • Unity 2019.2 以降

テストの実行方法

  1. Unity エディタで Window -> General -> Test Runner を開く
  2. EditMode タブを選択
  3. CopyComponentsByRegex.Tests アセンブリのテストが表示される
  4. Run All ボタンでテストを実行

コマンドラインからの実行

Unity Test Framework をコマンドラインから実行することも可能です:

Unity.exe -runTests -batchmode -projectPath <プロジェクトパス> -testPlatform EditMode -testResults results.xml

テスト内容

  • KDTreeTests: KD木アルゴリズムの近傍探索機能をテスト
  • CopyComponentsByRegexTests: 基本データ構造(TreeItem, ModificationEntry等)のテスト
  • IntegrationTests: 複雑なオブジェクト階層を使用した統合テスト
    • GetChildren、CopyWalkdown、MergeWalkdown などの主要機能
    • 正規表現マッチング、階層構造の再帰処理
    • HumanoidBone置換ルールによるマッチング(hips→siri等の異名ボーン対応)
  • NameMatcherTests: 名前マッチング機能のテスト
    • 正規表現ルールによる名前変換
    • HumanoidBone動的マッピングによるマッチング
    • 置換ルールを使用した子オブジェクト検索
  • ModificationReportPopupTests: 変更レポート表示機能のテスト
    • MergeWalkdownでの置換ルール適用
    • HumanoidBoneルールを使用したオブジェクト検索
  • BugReportExporterTests: バグレポートエクスポート機能のテスト
    • 階層構造のJSON出力
  • PathUtilityTests: パスユーティリティ機能のテスト
    • 相対パス・絶対パスの取得
    • パッケージパスの解決
  • LocalizationTests: 国際化機能のテスト
    • 言語切り替え
    • 言語間のキー整合性

ライセンス

MIT

利用ライブラリ

CopyComponentsByRegex では以下のコードを改変して利用しています。