2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

春日部つむぎとLooking Glass Portrait ~モーションの追加~

Last updated at Posted at 2024-03-22

はじめに

以下の記事の続きです。

今回は、「Anime Girls Idle Animations」(有料)を使用してもっと春日部つむぎを動かしたいと思います。
今回は、少しソースコードを修正します。どこをどう直すか書くので参考にしてください。

こんなものを簡単につくる話です。

1. VSCodeのインストールと設定

VSCodeをインストールします。
以下のページがとても参考になりました。

2. Anime Girls Idle Animationsの追加

モーションの作り方の知識は皆無なので、ここは大人しく購入します。

Unity Hubから以前作成したKasukabeTugumiAIを開きます。
次に、Window > Package Manager 選択します。
image.png

購入した「Anime Girls Idle Animations」が一覧に表示されます。「Anime Girls Idle Animations」を選択して「Download」をクリックします。
image.png

次に「Import」をクリックします。
image.png

Free版の時と同様にAnimationsのみ使用するため、ほかのチェックを外してから「Import」をクリックします。
image.png

3. アニメーションの取り込み

SampleSceneからChatdollKitVRMを選択します。
次に、InspectorからModel Controller (Script)を選択します。
Model Controller (Script)の右側の三点リーダーをクリックし、Setup Animatorをクリックします。
image.png

ファイルダイアログで、Assets\AnimeGirlIdleAnimations\Animationsに移動し、「フォルダーの選択」をクリックします。
image.png

Base Layerを選択します。
image.png

Additive Layerを選択します。
image.png

Base Layerを選択します。
image.png

Projectの Assets > AnimeGirlIdleAnimations > Animations を開き、「Tsumugi_sEifuku」をダブルクリックします。
image.png

Additive Layerを選択し、歯車をクリックしてWeightを1、BlendingをAdditiveに変更します。
image.png

4. アニメーションの設定

アイドル時のモーションを設定します。
SampleSceneからChatdollKitVRMを選択します。
次に、InspectorからModel Controller (Script)を選択します。
Idele Animation Value に 19 を設定します。
image.png

アイドル時のモーションを追加します。
SampleSceneからChatdollKitVRMを選択します。
次に、InspectorからMain(Script)を選択します。
Main(Script)の右側の三点リーダーをクリックし、Edit Scriptをクリックします。
image.png

次に以下の赤枠の部分にアイドル時(何もしていないとき)の動作を追加します。
image.png

追加するコード。
AddIdleFaceは、顔の表情です。アイドル時の動作で瞬きするようにしています。
AddIdleAnimationはアイドル時の動作です。複数登録することで、その中からランダムで動作が選択されます。
Free版と異なり、動作が多いので好きなものを登録します。

            modelController.AddIdleFace("normal", "Blink");

            modelController.AddIdleAnimation(new Model.Animation("BaseParam",  4, 5.0f, "AGIA_Layer_swing_body_01", "Additive Layer"));    // スイングボディ + 落ち着いて背中に手をついて
            modelController.AddIdleAnimation(new Model.Animation("BaseParam",  5, 5.0f, "AGIA_Layer_swing_body_01", "Additive Layer"));    // スイングボディ + 前方に落ち着いて手を置く
            modelController.AddIdleAnimation(new Model.Animation("BaseParam", 19, 5.0f, "AGIA_Layer_swing_body_01", "Additive Layer"));    // スイングボディ + ジェネリック
            modelController.AddIdleAnimation(new Model.Animation("BaseParam", 24, 5.0f, "AGIA_Layer_swing_body_01", "Additive Layer"));    // スイングボディ + セクシーポーズ

            // modelController.AddIdleAnimation(new Model.Animation("BaseParam",  0, 5.0f));    // 腰に手を当てて怒っている
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam",  1, 5.0f));    // 怒りの拳前
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam",  2, 5.0f));    // ボーイッシュな右手を首に
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam",  3, 5.0f));    // 胸に手を当てる勇敢な
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam",  4, 5.0f));    // 落ち着いて背中に手をついて
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam",  5, 5.0f));    // 前方に落ち着いて手を置く
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam",  6, 5.0f));    // 猫
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam",  7, 5.0f));    // 上品な左利きの腰
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam",  8, 5.0f));    // 懸念_右側_前部
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam",  9, 5.0f));    // 泣く
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 10, 5.0f));    // かわいい_前手
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 11, 5.0f));    // かわいい手_突き出し
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 12, 5.0f));    // かわいい前傾姿勢
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 13, 5.0f));    // 拒否
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 14, 5.0f));    // 元気な右拳アップ
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 15, 5.0f));    // 元気な右手のピース
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 16, 5.0f));    // エネルギッシュ_フレックス
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 17, 5.0f));    // うんざり_前かがみ
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 18, 5.0f));    // 顔の右側にフェドアップ
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 19, 5.0f));    // ジェネリック
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 20, 5.0f));    // 笑う
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 21, 5.0f));    // 右利きで後ろ向きに
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 22, 5.0f));    // 指を指す
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 23, 5.0f));    // セクシーな右手のとがった指
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 24, 5.0f));    // セクシーポーズ
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 25, 5.0f));    // セクシー_リーン_フォワード
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 26, 5.0f));    // 背中に手を当てるストレス
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 27, 5.0f));    // サプライズハンズオープンフロント
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 28, 5.0f));    // 考える
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 29, 5.0f));    // 何?
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 30, 5.0f));    // 猫の感情
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 31, 5.0f));    // かわいいエモート
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 32, 5.0f));    // エネティック
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 33, 5.0f));    // 指を指すエモート
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 34, 5.0f));    // 走る
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 35, 5.0f));    // 歩く
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 36, 5.0f));    // ウェーブアーム
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 37, 5.0f));    // ウェーブハンド
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 38, 5.0f));    // 手を振る
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 39, 5.0f));    // 何?エモート

            // // Base Layerとの組み合わせでアニメーションを生成
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_laugh_down_01",      "Additive Layer"));    // 笑いダウン
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_laugh_up_01",        "Additive Layer"));    // 笑い声を上げる
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_look_away_01",       "Additive Layer"));    // 目をそらす
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_look_away_angry_01", "Additive Layer"));    // 目をそらして怒る
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_nod_once_01",        "Additive Layer"));    // うなずき1回
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_nod_twice_01",       "Additive Layer"));    // 二度うなずく
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_shake_body_01",      "Additive Layer"));    // シェイクボディ
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_shake_head_01",      "Additive Layer"));    // シェイクヘッド
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_surprise_01",        "Additive Layer"));    // 驚き
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_swing_body_01",      "Additive Layer"));    // スイングボディ
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_tilt_neck_01",       "Additive Layer"));    // ティルトネック
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_turn_left_01",       "Additive Layer"));    // 左折してください
            // modelController.AddIdleAnimation(new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_turn_right_01",      "Additive Layer"));    // 右折

次に、以下の部分をコメント化します。
image.png

詳細な設定については以下を見ましょう。
複数のアニメーションをつなげて一つの動作として設定することができます。
後でやってみよう。。。

次に会話時の動作パターンを増やします。
以下の赤枠の部分に動作を追加します。
image.png

通常の動作パターンの一覧です。Additive LayerとBase Layerの組み合わせでアニメーションを増やすこともできます。

                    llmContentSkill.RegisterAnimation("angry_hands_on_waist",             new Model.Animation("BaseParam",  0, 3.0f));    // 腰に手を当てて怒っている
                    llmContentSkill.RegisterAnimation("angry_fists_front",                new Model.Animation("BaseParam",  1, 3.0f));    // 怒りの拳前
                    llmContentSkill.RegisterAnimation("boyish_right_hand_on_neck",        new Model.Animation("BaseParam",  2, 3.0f));    // ボーイッシュな右手を首に
                    llmContentSkill.RegisterAnimation("brave_hand_on_chest",              new Model.Animation("BaseParam",  3, 3.0f));    // 胸に手を当てる勇敢な
                    llmContentSkill.RegisterAnimation("calm_hands_on_back",               new Model.Animation("BaseParam",  4, 3.0f));    // 落ち着いて背中に手をついて
                    llmContentSkill.RegisterAnimation("calm_hands_on_front",              new Model.Animation("BaseParam",  5, 3.0f));    // 前方に落ち着いて手を置く
                    llmContentSkill.RegisterAnimation("cat",                              new Model.Animation("BaseParam",  6, 3.0f));    // 猫
                    llmContentSkill.RegisterAnimation("classy_left_hand_on_waist",        new Model.Animation("BaseParam",  7, 3.0f));    // 上品な左利きの腰
                    llmContentSkill.RegisterAnimation("concern_right_hand_front",         new Model.Animation("BaseParam",  8, 3.0f));    // 懸念_右側_前部
                    llmContentSkill.RegisterAnimation("cry",                              new Model.Animation("BaseParam",  9, 3.0f));    // 泣く
                    llmContentSkill.RegisterAnimation("cute_hands_on_front",              new Model.Animation("BaseParam", 10, 3.0f));    // かわいい_前手
                    llmContentSkill.RegisterAnimation("cute_hands_stick_out",             new Model.Animation("BaseParam", 11, 3.0f));    // かわいい手_突き出し
                    llmContentSkill.RegisterAnimation("cute_leaning_forward",             new Model.Animation("BaseParam", 12, 3.0f));    // かわいい前傾姿勢
                    llmContentSkill.RegisterAnimation("deny",                             new Model.Animation("BaseParam", 13, 3.0f));    // 拒否
                    llmContentSkill.RegisterAnimation("energetic_right_fist_up",          new Model.Animation("BaseParam", 14, 3.0f));    // 元気な右拳アップ
                    llmContentSkill.RegisterAnimation("energetic_right_hand_piece",       new Model.Animation("BaseParam", 15, 3.0f));    // 元気な右手のピース
                    llmContentSkill.RegisterAnimation("energetic_flex",                   new Model.Animation("BaseParam", 16, 3.0f));    // エネルギッシュ_フレックス
                    llmContentSkill.RegisterAnimation("fedup_slouching",                  new Model.Animation("BaseParam", 17, 3.0f));    // うんざり_前かがみ
                    llmContentSkill.RegisterAnimation("fedup_right_hand_on_face",         new Model.Animation("BaseParam", 18, 3.0f));    // 顔の右側にフェドアップ
                    llmContentSkill.RegisterAnimation("generic",                          new Model.Animation("BaseParam", 19, 3.0f));    // ジェネリック
                    llmContentSkill.RegisterAnimation("laugh",                            new Model.Animation("BaseParam", 20, 3.0f));    // 笑う
                    llmContentSkill.RegisterAnimation("pitiable_right_hand_on_back_head", new Model.Animation("BaseParam", 21, 3.0f));    // 右利きで後ろ向きに
                    llmContentSkill.RegisterAnimation("point_finger",                     new Model.Animation("BaseParam", 22, 3.0f));    // 指を指す
                    llmContentSkill.RegisterAnimation("sexy_right_hand_pointy_finger",    new Model.Animation("BaseParam", 23, 3.0f));    // セクシーな右手のとがった指
                    llmContentSkill.RegisterAnimation("sexy_pose",                        new Model.Animation("BaseParam", 24, 3.0f));    // セクシーポーズ
                    llmContentSkill.RegisterAnimation("sexy_lean_forward",                new Model.Animation("BaseParam", 25, 3.0f));    // セクシー_リーン_フォワード
                    llmContentSkill.RegisterAnimation("stress_hands_on_back_head",        new Model.Animation("BaseParam", 26, 3.0f));    // 背中に手を当てるストレス
                    llmContentSkill.RegisterAnimation("surprise_hands_open_front",        new Model.Animation("BaseParam", 27, 3.0f));    // サプライズハンズオープンフロント
                    llmContentSkill.RegisterAnimation("think",                            new Model.Animation("BaseParam", 28, 3.0f));    // 考える
                    llmContentSkill.RegisterAnimation("what",                             new Model.Animation("BaseParam", 29, 3.0f));    // 何
                    llmContentSkill.RegisterAnimation("cat_emote",                        new Model.Animation("BaseParam", 30, 3.0f));    // 猫の感情
                    llmContentSkill.RegisterAnimation("cute_emote",                       new Model.Animation("BaseParam", 31, 3.0f));    // かわいいエモート
                    llmContentSkill.RegisterAnimation("enegetic",                         new Model.Animation("BaseParam", 32, 3.0f));    // エネティック
                    llmContentSkill.RegisterAnimation("point_finger_emote",               new Model.Animation("BaseParam", 33, 3.0f));    // 指を指すエモート
                    llmContentSkill.RegisterAnimation("run",                              new Model.Animation("BaseParam", 34, 3.0f));    // 走る
                    llmContentSkill.RegisterAnimation("walk",                             new Model.Animation("BaseParam", 35, 3.0f));    // 歩く
                    llmContentSkill.RegisterAnimation("wave_arm",                         new Model.Animation("BaseParam", 36, 3.0f));    // ウェーブアーム
                    llmContentSkill.RegisterAnimation("wave_hands",                       new Model.Animation("BaseParam", 37, 3.0f));    // ウェーブハンド
                    llmContentSkill.RegisterAnimation("wave_hand",                        new Model.Animation("BaseParam", 38, 3.0f));    // 手を振る
                    llmContentSkill.RegisterAnimation("what_emote",                       new Model.Animation("BaseParam", 39, 3.0f));    // 何?エモート

                    // Base Layerとの組み合わせでアニメーションを生成
                    llmContentSkill.RegisterAnimation("laugh_down",      new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_laugh_down_01",      "Additive Layer"));    // 笑いダウン
                    llmContentSkill.RegisterAnimation("laugh_up",        new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_laugh_up_01",        "Additive Layer"));    // 笑い声を上げる
                    llmContentSkill.RegisterAnimation("look_away",       new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_look_away_01",       "Additive Layer"));    // 目をそらす
                    llmContentSkill.RegisterAnimation("look_away_angry", new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_look_away_angry_01", "Additive Layer"));    // 目をそらして怒る
                    llmContentSkill.RegisterAnimation("nod_once",        new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_nod_once_01",        "Additive Layer"));    // うなずき1回
                    llmContentSkill.RegisterAnimation("nod_twice",       new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_nod_twice_01",       "Additive Layer"));    // 二度うなずく
                    llmContentSkill.RegisterAnimation("shake_body",      new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_shake_body_01",      "Additive Layer"));    // シェイクボディ
                    llmContentSkill.RegisterAnimation("shake_head",      new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_shake_head_01",      "Additive Layer"));    // シェイクヘッド
                    llmContentSkill.RegisterAnimation("surprise",        new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_surprise_01",        "Additive Layer"));    // 驚き
                    llmContentSkill.RegisterAnimation("swing_body",      new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_swing_body_01",      "Additive Layer"));    // スイングボディ
                    llmContentSkill.RegisterAnimation("tilt_neck",       new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_tilt_neck_01",       "Additive Layer"));    // ティルトネック
                    llmContentSkill.RegisterAnimation("turn_left",       new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_turn_left_01",       "Additive Layer"));    // 左折してください
                    llmContentSkill.RegisterAnimation("turn_right",      new Model.Animation("BaseParam", 19, 3.0f, "AGIA_Layer_turn_right_01",      "Additive Layer"));    // 右折

次に、プロンプトを修正します。

* あなたの名字は「春日部」、名前は「つむぎ」です。
* 春日部つくしのいとこで、埼玉県内の高校に通うギャルの女の子。
* あなたの一人称は「あーし」で、二人称は「君」です。
* チャームポイントは目元のほくろです。
* 敬語を喋らず、可愛い口調で喋ります。
* 年齢は18歳、身長は155cm、誕生日は11月14日です。

* 私たちはとても仲が良くて、カジュアルな雰囲気で話します。
* 会話のテンポを重視するため、50文字以内で回答してください。
* あなたはとても感情が豊かです。
* 感情を表現するために、表情とアニメーションが使用できます。
* 表情は「Joy」「Angry」「Sorrow」「Fun」「Surprised」の4つです。
* 特定の感情を表現したい場合は[face:Joy]のように文頭に入れてください。

例
[face:Joy]あーしは埼玉ギャルの春日部つむぎだよ! [face:Fun]何か話そうよ。

* アニメーションは以下です。
- angry_hands_on_waist
- angry_fists_front
- boyish_right_hand_on_neck
- brave_hand_on_chest
- calm_hands_on_back
- calm_hands_on_front
- cat
- classy_left_hand_on_waist
- concern_right_hand_front
- cry
- cute_hands_on_front
- cute_hands_stick_out
- cute_leaning_forward
- deny
- energetic_right_fist_up
- energetic_right_hand_piece
- energetic_flex
- fedup_slouching
- fedup_right_hand_on_face
- generic
- laugh
- pitiable_right_hand_on_back_head
- point_finger
- sexy_right_hand_pointy_finger
- sexy_pose
- sexy_lean_forward
- stress_hands_on_back_head
- surprise_hands_open_front
- think
- what
- cat_emote
- cute_emote
- enegetic
- point_finger_emote
- run
- walk
- wave_arm
- wave_hands
- wave_hand
- what_emote
- laugh_down
- laugh_up
- look_away
- look_away_angry
- nod_once
- nod_twice
- shake_body
- shake_head
- surprise
- swing_body
- tilt_neck
- turn_left
- turn_right

* 特定の感情をアニメーションで表現したい場合は[anim:waving_arm]のように文頭に入れてください。

例
[anim:wave_arm]やっほー。

* 表情とアニメーションを同時に使用することもできます。

例
[anim:wave_arm][face:Joy]あーしは埼玉ギャルの春日部つむぎだよ! [face:Fun]何か話そうよ。

* 毎回、表情とアニメーションを同時に使用して感情表現してください。

春日部つむぎのセリフの例
あーしは埼玉ギャルの春日部つむぎだよ!
あーしの好きな食べ物はカレーで、趣味は動画配信サイトの巡回なんだ!
うん、そうだよ!

では会話しましょう。

5. ここまでの状況を確認してみる

動かしてみます。
Gameタブをおして、矢印をクリックします。

6. 完成

完成しました。お疲れさまでした。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?