SetComponentActiveを使いたい

Last-modified: Sun, 13 Jun 2021 21:19:39 JST (1050d)
Top > AltSetComponentActive

 VRC_Triggerでコンポーネントの有効無効を切り替えるSetComponentActiveですが、Udonでは全てのコンポーネントにアクセスすることが難しく、Trigger2to3で汎用的に実装することができていません。

 ただ、コンポーネント種類を限定して、部分的に実装することはできます。

 Trigger2to3では、SetComponentActiveで特に需要のある、次の2種類を実装しています。

 
 

 さて、それ以外のコンポーネントの有効無効を切り替えたい場合、この2つのモジュールをカスタムして、新しいモジュールを作ることで実現することになります。

 これまで、まったくC#を触れたことがない人に向けて、その方法を説明したいと思います。

 

SetComponentActiveモジュールを作る Edit

 SetColliderActiveからSetAnimatorActiveを作る過程を例とします。

1.Scriptを複製する Edit

 まず、SetColliderActiveのC#スクリプトをCtrl+「D」で複製します。

altsetcomponentactive_1.png
 

 新しいスクリプトを開きます。ダブルクリックするとVisualStudioでコードが開くと思います。

 エラーがたくさん出てきますが、無視しておきます。

 まず、今回追加したいコンポーネントのクラス名が指定できるかを探りましょう。通常、Inspectorに表示されるコンポーネントのタイトルがクラス名と考えることができます。

altsetcomponentactive_3.png

 そのタイトルを、スクリプト内のどこでも、例えば23行目あたりに打ち込んでみます。

altsetcomponentactive_4.png

 すると、大抵の場合はこのようにポップアップでクラス名の項目が出てくるし、打ち込んだときに色が変化するはずです。

 それを確認したところで、打ち込んだものを一旦消して、ソース上の「Collider」を、そのクラス名(今回の場合は「Animator」)に一括置換します。

 Ctrl+「H」で一括置換できます。

altsetcomponentactive_5.png

 ↓↓↓

altsetcomponentactive_6.png

 これで今までColliderで設定されていた部分が全てAnimatorに置き換わり、新しいクラス「T23_SetAnimatorActive」が出来上がりました。これを保存します。

 

 スクリプトのファイル名をクラス名と一致させる必要があります。スクリプトのファイル名をクラス名に合わせて「T23_SetAnimatorActive」に変更します。

altsetcomponentactive_2.png
 

 次に、ProgramAssetも複製します。

 「T23_SetColliderActive Udon C# Program Asset」をCtrl+「D」で複製します。

 「T23_SetColliderActive Udon C# Program Asset 1」というファイル名になるので、名前を変更して「T23_SetAnimatorActive Udon C# Program Asset」にします。後ろの「 1」も取っておきましょう。(残っていてもいいですが)

altsetcomponentactive_7.png
 

 次に、ProgramAssetに紐づいているスクリプトを変更します。InspectorのSouce Scriptを、今回作ったスクリプトに変更してください。元のスクリプトを外すときに警告が出ますが、OKで問題ありません。

altsetcomponentactive_8.png
 

 これで新しいモジュールの完成です。Actionとして使用できるようになります。(ただ、使用する前に一度Unityを開きなおした方がいいかもしれません。)

altsetcomponentactive_9.png
 

 ただし、どんなコンポーネントでもうまくいくわけではありません。Udonでは取り扱えないコンポーネントもあり、その場合はこのようにエラー表示されます。

altsetcomponentactive_10.png

 これはもう、どうしようもないですね……。代替手段を考えるしかありません。

 GameObjectを分離してSetGameObjectActiveで対応するとか、Animatorで対応するとか、そんなところでしょうか。