AI / ML Technology

Unityで対話できるAIキャラクターを作る(3)

AI / ML
スポンサーリンク

どうも、Reveです。なんやかんやで2週間も経ってしまいましたが、今回も「AIで対話できるキャラづくり」です。

Unityでのアニメーション処理について

キャラクターの動きや表情も大雑把に言えば素材の一つです。

Unityではモーション自体をAnimation Clipという形式のファイルで保管しており、それをAnimation Controllerというファイルで条件に応じてどのモーションを動かすか制御します。そして、動かす3DCGモデルにAnimatorというスクリプトをつけてコントローラー(Animation Controller)を割り当てることで、3DCGモデルが動くようになります。この一連のシステムをAnimation State Machine(ステートマシン)と呼んでいます。つまりAnimator → Animation Controller → Animation Clipという親子(?)関係でモーションを制御しています。

ステートマシン一例。ノードをつなげて遷移図みたいなのを作ります。

アニメーションステートについての解説はこちらも参照。

アニメーションステート - Unity マニュアル
Animation State は Animation State Machine の基本構成要素です。各ステート(状態)には、個々のアニメーションシーケンス(もしくは ブレンドツリー)が含まれていて、キャラクターがそのステートに入ったときに再生されます。ゲーム内のイベントがステート遷移をトリガーすると、キャラクターは...

モーション作成(というか導入)

まず、前提として3DCGモデルはリグと呼ばれる骨格が仕込まれたものを使います。

そのうえで、リグを動かすモーションを作成、またはどこかからダウンロードして導入します。主に考えられる手段は以下の通りです。

  1. 3DCGアニメーションソフトを使って作成
  2. モーションキャプチャを使って作成
  3. Unityアセットストアや外部サイトから取得

自力での作成はそれなりの機材や手間がかかるので、手っ取り早く作りたい場合はどこかから素材を見つける方が良いと思います(最近では、AIを使って画像や動画の姿勢推定からモーションを作る方法もあるようですが…)。今回は、Unityアセットストアなどから対話型AIキャラに合いそうなモーションを選んでみました。

Anime Girl Idle Animations

お試し版もあります。

『VRMお人形遊び』用アニメーションデータ詰め合わせ

『VRMお人形遊び』用アニメーションデータ詰め合わせ - fumi2kick booth - BOOTH
『VRM お人形遊び』で使えるアニメーションデータです。 アセットバンドル形式(*.ab) と Unity アニメーション形式(*.anim) の二種類が同梱されています。 ※モデルデータは付属していません アニメーション形式(*.anim) については他のアプリやゲームで利用していただいて構いません。 ループ前提のア...

(無料)【VMMモーション詰め合わせ】- VMagicMirror用カスタムモーション

(無料)【VMMモーション詰め合わせ】- VMagicMirror用カスタムモーション - アンテナショップ【ねここや】 - BOOTH
VMagicMirror用 カスタムモーション Ver'1.00 ※動画プレーヤーからYoutubeに飛べない場合はこちらから

ステートマシン作成

ステートマシンを作るには、まず上記の通りAnimation Controllerを新規作成します。これはプロジェクトタブの新規作成ボタン右クリックメニューですぐに出来ます。

作成した直後は緑色(Entry)赤色(Exit)水色(Any State)、そして橙色(初期状態でIdle)の4つのブロック(ステート)があると思いますが、まずここでは緑色と橙色のものに注目します。

実行された直後は Entry → Idle と状態が遷移して、Idleブロックに割り当てられたアニメーションを実行するので、IdleのMotionを好きなモーション(Animation Clip)を入れればすぐに3Dモデルが動き出します。

オレンジ色のブロックを選択して、項目「Motion」の右のアイコンをクリック(右の灰色ブロック2つはひとまず無視)

ただ、これでは単一のモーションを繰り返すだけなので、別のモーションも入れる場合はもう少し工夫が必要です。

別のモーションを入れるには、ステートを追加したうえでステート間を矢印(Transision)でつなぎます。当然、作成したステートにも対応するAnimation Clipを割り当てます。

そして、パラメータ作成および遷移条件の設定を行います。

前者は Animatorタブの左側にある Parameter を選択して+ボタンを押すと作れます。パラメータは4つの型(Float, Int, Bool, Trigger)から一つを選び、任意の名前を付けます。

後者は先ほどつなげたステート間の矢印がどんな条件で実行されるかを定めるもので、先ほど設定したパラメータで条件を設定します(値が10以上、真理値がtrue等)。なお、条件を指定しない場合、Exit Timeが有効であればモーションの終了時に接続先のものへ移行します。

モーション制御

ただ、このステートマシンを作成しただけではモーションの切り替えはできません。

そこで、先述のパラメータの値をC#スクリプトで変えていくことでモーション遷移を実装します。Animator(Animation Controllerのクラス名)インスタンスにあるメソッドのSet…(Float/Int/Bool/Trigger)メソッドで値を入れることでモーションが切り替えられます。

ですが、パラメータ名の引数が文字列で、型ごとに別のメソッドを分ける必要があるため、このままではパラメータを増やすごとにスクリプトを弄る必要があって面倒です。なので、当方ではAnimationParameterという独自クラスとSetParameterというメソッドを使い、パラメータを増やしてもAnimationParameterの配列をインスペクタ上で編集することで対応できるようにしました。

リップシンク

リップシンクは表情に関するアニメーションの一種といえます。3Dモデルで表情を作るにはフェイスリグやテクスチャの切替といった手法がありますが、Unityで一般的なのはブレンドシェイプです。これは対象の3Dモデルについて複数パターンの形状を記憶しておき、滑らかにブレンドすることでいろいろな表情などを作れるようにする仕組みです。

リップシンクも自力で実装するのは非常に難しいので、今回はuLipSyncを使います。

GitHub - hecomi/uLipSync: MFCC-based LipSync plug-in for Unity using Job System and Burst Compiler
MFCC-based LipSync plug-in for Unity using Job System and Burst Compiler - hecomi/uLipSync

3Dモデルのルート(大元)にULipSyncBlendShape、顔のモデルにULipSync(+ AudioSource)を入れて、あいうえお5音に対応するブレンドシェイプを指定すれば、音声に対応して口が変形するようになります。詳細は上のリンク先をご参照ください。

なお、(VRMモデルで)口も動かしつつ目など他の表情も動かしたいときは、VRMInstanceの Runtime >> Update TypeUpdate に変更する必要がありました。

次回は?

いよいよ終盤。ChatGPTを仕込んでしゃべらせます!

タイトルとURLをコピーしました