これは正規表現でマッチする、構造が同じ場所にあるコンポーネントを一括でコピーするUnityエディタ拡張です。
VRChat Creator Companion (VCC) を使用する場合、以下の手順でインストールできます:
- Listingページ にアクセス
- 「Add to VCC」ボタンをクリックしてリポジトリを追加
- VCCでプロジェクトを開き、「Manage Project」から
CopyComponentsByRegexを追加
- Unityのメニューバーから
Window->Package Managerを開く - Package Manager の左上にある
+からAdd package from git URLをクリック https://github.com/Taremin/CopyComponentsByRegex.gitをコピー&ペーストしてAddをクリック
このリポジトリのzipファイルをダウンロードして、解凍したものをアセット内にコピーします。
ここで注意するのは Editor フォルダも そのまま コピーすることです。
これはUnityの仕様で「Editorフォルダの中にあるスクリプトはエディターでのみ有効で、ゲーム実行時には無視される」というのがあるからです。
(参考: 特殊なフォルダー名 - Unity マニュアル)
Editor フォルダ内の *.cs ファイルのみをアセットにいれてしまうと、ゲーム実行時にも実行されてしまいエラーが発生します。
- ヒエラルキーでコピー元のオブジェクトを選択
- ヒエラルキーで右クリックしてコンテキストメニューから
Copy Components By Regexをクリック Copy Components By Regexウィンドウが開くので正規表現にコピーしたいコンポーネントとマッチする正規表現を書く (例:Dynamic BoneとDynamic Bone ColliderをコピーしたいならDynamicなど)Copy Components By RegexウィンドウのCopyボタンを押す- ヒエラルキーでコピー先のオブジェクトを選択
Copy Components By RegexウィンドウのPasteボタンを押す
正規表現を書く際に、オブジェクトに付いているコンポーネント名を確認したい場合は「コンポーネント一覧」の折りたたみを開いてください。 表示された一覧の「コピー」ボタンをクリックすると、そのコンポーネント名がクリップボードにコピーされます。
コピーするオブジェクトとコンポーネント内で完結しているオブジェクト参照(Dynamic Bone の root など)は自動的にコピー先のオブジェクトやコンポーネントに差し替えます。
逆に言えばコピーする範囲外のコンポーネントへの参照はそのままになっているため、注意してください。
構造の同一性はオブジェクトの名前で判断しているため、同じ親を持つ同名の子オブジェクトがある場合などで動作がおかしくなる可能性があります。 また、完全に構造が同一でなくても子の名前が同じならできるだけ辿ろうとするため、ボーンの増加などの場合もそのままコピーできます。
コピー元とコピー先でオブジェクト名が異なる場合(例:VRoid Studioの J_Bip_C_Head と標準的な Head)、置換リストを使用して名前の違いを吸収できます。
置換リストには2種類のルールがあります:
-
正規表現ルール: 任意の正規表現パターンで名前を変換
- 例:
J_Bip_C_(.+)→$1(VRMプレフィックスを削除)
- 例:
-
HumanoidBoneルール: Unity Humanoidリグのマッピング情報を動的に取得してマッチング
- コピー元・コピー先の両方がHumanoidリグとして設定されている必要があります
- 対応ボーングループ: すべて、頭、首、胸、脊椎、ヒップ、左腕、右腕、左脚、右脚、左手指、右手指
詳細は 置換リストガイド を参照してください。
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 以降
- Unity エディタで
Window->General->Test Runnerを開く EditModeタブを選択CopyComponentsByRegex.Testsアセンブリのテストが表示される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: 国際化機能のテスト
- 言語切り替え
- 言語間のキー整合性
CopyComponentsByRegex では以下のコードを改変して利用しています。
- KDTree.cs - A Stark, September 2009. https://forum.unity.com/threads/point-nearest-neighbour-search-class.29923/