LoginSignup
2
2

More than 1 year has passed since last update.

AvatarをセットアップするEditorを作る(Expression編)|VRC用の拡張Editorを作ってみよう(4)

Last updated at Posted at 2021-11-26

この記事は前回の続きになります
VRC用の拡張Editorを作ってみよう(3)

目次

1.準備
2.ExpressionMenuとParameterのメソッドを作る
3.メソッドの中にコードを書く
4.ボタンで追加できるようにする
5.動作確認
6.次回

1.準備

Expressionを入れるフォルダーを作る

最初にExpressionを入れるためのフォルダーを作っておきましょう
Editorなどの隣にわかりやすく名前を付けたうえでフォルダーを作成します
今回はExpressionと付けました
Expression.png
できました
フォルダーのパスもコピーしておきましょう

EditorにExpressionフォルダーの変数を作る

フォルダーを作った時にコピーしたパスを変数に入れていきます
今回もOnGUIの上に書いていきます
privateString型の変数を作ります
名前は分かりやすい名前で付けます
今回はprivate string exPathにでもしましょうか
exPathが宣言できると、その中に先ほどコピーしたパスを代入します
出来るとこのようになります

private string exPath = "Assets/test/Expression";

これで変数ができました

ExpressionParameterを扱えるようにする

ExpressionParameterを扱えるようにするためにusingを使用します
以下二つを追加してください

using ExpressionParameters = VRC.SDK3.Avatars.ScriptableObjects.VRCExpressionParameters;
using ExpressionParameter = VRC.SDK3.Avatars.ScriptableObjects.VRCExpressionParameters.Parameter;

これで扱えるようになりました(SDK漁ってる時に見つけたから説明できないし知らない)

2.ExpressionMenuとParameterのメソッドを作る

ExpressionMenuのメソッドを作る

まずはMenuの方から作っていきましょう
前回作成したSetupFXLayer()の下に作ります
privateな値を返さないメソッドを作ります
名前は分かりやすいように付けます
今回はSetupExMenuにしました
コードはこうなります

private void SetupExMenu()
{

}

これでExMenuのメソッドができましたね

ExpressionParameterのメソッドを作る

次にParameterを作ります
SetupMenuの下に書いていきます
privateな値を返さないメソッドを作ります
名前は分かりやすいように付けます
今回はSetupExParamにしました
コードはこうなります

private void SetupExParam()
{

}

これでExParamのメソッドもできましたね

3.メソッドの中にコードを書く

SetupMenuのコードを書く

Menuからコードを書いていきます
まずはメニューを作成します
VRCExpressionsMenu型の変数を宣言します
名前は分かりやすい名前を付けます
今回はexpressionMenuにしました
宣言ができたらCreateInstanceを使ってVRCExpressionsMenuを新しく作成します
使い方はこうです

CreateInstance<"タイプ">();

タイプの中にVRCExpressionsMenuを書きます
これでVRCExpressionMenuのインスタンスが新しく作成されます
それを変数expressionMenuに代入します
コードはこうなります

VRCExpressionsMenu expressionMenu = CreateInstance<VRCExpressionsMenu>();

これで新しいVRCExpressionsMenuの代入ができました
新しいインスタンスをAssetsに.assetとして作っていきます
Assetsにファイルを作成するにはAssetDatabase.CreateAssetを使います
使い方はこんな感じです

AssetDatabase.CreateAsset("作るオブジェクト", "フォルダのパス");

作るオブジェクトはVRCExpressionsMenuを代入したexpressionMenuで、
フォルダのパスは最初に作ったexPathを使います
exPathのままだとファイルを作れないのでアバターの名前を付けて拡張子など指定していきましょう
言葉で説明するより書いた方が早いですね
コードはこうなります

AssetDatabase.CreateAsset(expressionMenu, exPath + "/" + avatar.name + "ExMenu.asset");

exPath + "/"から先は変えても大丈夫ですが[.asset]は忘れないでくださいね
これでファイルの作成ができました

最後に今作ったファイルをアバターへ入れます
expressionsMenuにファイルを入れるためには
avatar.GetComponent()の後に.expressionsMenuと書きます
その中に入れるファイルは前回使用したAssetDatabase.LoadAssetAtPathを使って取得します
ファイルパスはファイルを作成した時に書いた物を使います
コードはこうなりました

avatar.GetComponent<VRCAvatarDescriptor>().expressionsMenu = AssetDatabase.LoadAssetAtPath(exPath + "/" + avatar.name + "ExMenu.asset", typeof(VRCExpressionsMenu)) as VRCExpressionsMenu;

キャストは忘れないでくださいね
これでSetupExMenuメソッドは完成しました

SetupExParamのコードを書く

Paramのコードを書いていきます(やっと)
今さっきと同じようにVRCExpressionParameters型の変数を宣言します
分かりやすく名前を付けます
名前はexpressionParameterにしました
そのあとも今さっきと一緒でCreateInstanceを使ってVRCExpressionPatametersを新しく作って代入します
ここはちょちょいと済ませてしまいましょう
コードはこうなりました

VRCExpressionParameters expressionParameter = CreateInstance<VRCExpressionParameters>();

これで新しいVRCExpressionParametersの代入ができました
次はExpressionParameterに初期で追加するためのパラメーターを作っていきます
最初にいくつ追加するか指定します
追加方法は変数expressionParameter.parametersを書き加えてnew ExpressionParameter["要素数"]を代入することで追加できます
今回は3つ追加するので要素数を3にします(最初からVRCのEmoteとか入ってるから...)
コードはこんな感じです

expressionParameter.parameters = new ExpressionParameter[3];

これでPatameterの箱が3つ作られました
ここからは追加するパラメーターなので一気に説明していきます

expressionParameter.parameters["要素数"]にnew ExpressionParameter()を代入してパラメーターを追加
expressionParameter.parameters["総素数"].nameに名前を代入
expressionParameter.parameters["総素数"].valueTypeにExpressionParameters.ValueType.型を代入

今説明したものを作っていきます
要素数0 <- [name = VRCEmote] [valueType = ValueType.Int]
要素数1 <- [name = VRCFaceBlendH] [valueType = ValueType.Float]
要素数2 <- [name = VRCFaceBlendV] [valueType = ValueType.Float]

コードはこうなります

expressionParameter.parameters[0] = new ExpressionParameter();
expressionParameter.parameters[0].name = "VRCEmote";
expressionParameter.parameters[0].valueType = ExpressionParameters.ValueType.Int;

expressionParameter.parameters[1] = new ExpressionParameter();
expressionParameter.parameters[1].name = "VRCFaceBlendH";
expressionParameter.parameters[1].valueType = ExpressionParameters.ValueType.Float;

expressionParameter.parameters[2] = new ExpressionParameter();
expressionParameter.parameters[2].name = "VRCFaceBlendV";
expressionParameter.parameters[2].valueType = ExpressionParameters.ValueType.Float;

これで追加するパラメーターが完成しました
これをAssetDatabase.CreateAssetを使ってファイル作成しましょう
作るオブジェクトはexpressionParameterにして・・・
パスの名前もexPath + "/" + avatar.name + "ExParameter.asset"とかにしましょうか
コードはこうなりました

AssetDatabase.CreateAsset(expressionParameter, exPath + "/" + avatar.name + "ExParameter.asset");

これでファイルが作られるようになりましたね
次にアバターへファイルを入れましょう
avatar.GetComponent()に.expressionParametersを付け足します
これでexpressionParametersにファイルを入れることができます
ファイルはAssetDatabase.LoadAssetAtPathを使ってロードしましょう
最後にロードしたものをアバターに入れます
コードはこうなります

avatar.GetComponent<VRCAvatarDescriptor>().expressionParameters = AssetDatabase.LoadAssetAtPath(exPath + "/" + avatar.name + "ExParameter.asset", typeof(VRCExpressionParameters)) as VRCExpressionParameters;

Menuの時と同じくキャストを忘れないように
これでSetupExParamメソッドは完成しました

4.ボタンで追加できるようにする

前回の物を修正する

最初に前回書いたSetupFXLayerのボタンを修正します
avatar.GetComponent().customizeAnimationLayersを使用して
カスタムアニメーションがオフになっているときだけ表示されるようにします
オフの時に真にしたいので[!]を付けます
前回書いたif(GUILayout.Button("アバターのFXLayerをセットアップする"))を挟むように追加します
コードはこうなります

if (avatar.GetComponent<VRCAvatarDescriptor>())
{
    //FXボタンが表示されないように追加
    if (!avatar.GetComponent<VRCAvatarDescriptor>().customizeAnimationLayers)
    {
        if (GUILayout.Button("アバターのFXLayerをセットアップする"))
        {
            SetupFXLayer();
        }
    }
}
else
{
    if (GUILayout.Button("アバターにVRCAvatarDescriptorを入れる"))
    {
        AddDescriptor();
    }
}

これでボタンの修正ができました

Expressionを追加するボタンを作る

まずはif文を使用してアバターのcustomEcpressionsがオフになってるか確認するために
avatar.GetComponent().customExpressionsを使用します
オフの時に真にしたいので[!]を付けます
その中にボタンを追加していきます
if文を使用してGUILayout.Buttonでボタンを作っていきます
ボタンの名前は"アバターのExpressionをセットアップする"と付けておきました
ボタンまで完成したコードがこれです

if (!avatar.GetComponent<VRCAvatarDescriptor>().customExpressions)
{
    if (GUILayout.Button("アバターのExpressionをセットアップする"))
    {

    }
}

これでボタンが完成ですね
次はボタンに処理を書いていきましょう
ボタンが押されたらcustomExpressionsをオンにするコードをif文の中に書いていきます
customExpressionsをtrueにするだけなので簡単ですね
コードはこうなりました

avatar.GetComponent<VRCAvatarDescriptor>().customExpressions = !avatar.GetComponent<VRCAvatarDescriptor>().customExpressions;

これでcustomExpressionsをオンにするコードができました
最後はこの下に作ったメソッドを追加していきましょう
SetupExMenu()
SetupExParam()
を追加します
追加するとコードはこうなります

if (avatar.GetComponent<VRCAvatarDescriptor>())
{
    //FXボタンが表示されないように追加
    if (!avatar.GetComponent<VRCAvatarDescriptor>().customizeAnimationLayers)
    {
        if (GUILayout.Button("アバターのFXLayerをセットアップする"))
        {
            SetupFXLayer();
        }
    }

    //この下に追加する
    if (!avatar.GetComponent<VRCAvatarDescriptor>().customExpressions)
    {
        if (GUILayout.Button("アバターのExpressionをセットアップする"))
        {
            avatar.GetComponent<VRCAvatarDescriptor>().customExpressions = !avatar.GetComponent<VRCAvatarDescriptor>().customExpressions;
            SetupExMenu();
            SetupExParam();
        }
    }
}
else
{
    if (GUILayout.Button("アバターにVRCAvatarDescriptorを入れる"))
    {
        AddDescriptor();
    }
}

これでExpressionを追加するEditorが完成しました!(ふぅ・・・)

5.動作確認

最初にCtrl + Sでスクリプトを保存しましょう
保存ができたらUnityに戻りEditorを開きます
Editor8.png
Editorの見た目は変わってないですね
VRCAvatarDescriptorは前回の続きであればこうなってると思います
vad.png
上の状態になっていたらEditorを開いてアバターを入れます
Editor9.png
アバターを入れると作ったボタンが表示されていると思います
押してみましょう
avd2.png
ちゃんとExpressionsにMenuとParameterが追加されていますね
これで今日は終了です
お疲れさまでした

6.次回

次回はゲームオブジェクトを出し入れするためのアニメーションを作るEditorを作ろうと思います

VRC用の拡張Editorを作ってみよう(5)

2
2
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
2
2