見出し画像

PhysBoneであそぼ - うささきさんの耳をアウターの紐で動かそう

はじめに

初note執筆です。よろしくおねがいします。

PhysBoneにはオプション機能としてParameterという項目があります。
PhysBoneのinspector内、画像の箇所に設定した名前に、_IsGrabbed、_Angle、_Stretchを付け加えたアニメーションパラメータが、自動で生成されるそうです。
つまり、ボーンを触ることでアニメーションを制御することができます!

英語むずかしい

例えば、「_Stretch」についてみてみましょう。
最大まで伸びきった長さを1.0とした割合(小数値)を返してくれます
伸ばしきったら音が鳴る!みたいなギミックができて面白そうですね…!

ところでうささきさんってかわいいですね
服のデザインも大きな耳もとっても素敵!
…閃きました
アウターの紐で耳を動かしてみよう!

動かせました

うささきさんユーザーじゃなくても、他ギミックにも活かせることができるはずですので、知識共有したいと思います。
(なんとなくやってたらできた程度の情報なので仕様解説記事ではないです。適宜補完をお願いします…)

うささき「さん」派です

0.大まかな流れ 【22/06/21追記】

小物を持つギミックを作る際に記事を見直すことが何度かあったので概略を示します。
とりあえず小物をつかめるようにしたい!という方はこちらと必要に応じた章を、
詳細な手順、アニメーションとの連携については 1. 以降を参照してください。

  1. 空オブジェクトを2つ作り、
    空オブジェクトA
     ∟空オブジェクトB
      ∟動かしたいオブジェクト の階層構造をつくる

  2. 空オブジェクトBのみを持ちやすい位置に移動させる
    または
    空オブジェクトAにつけるPhysBoneコンポーネントの、Endpoint Positionを持ちやすい長さに設定する

  3. 空オブジェクトAにPhysBoneコンポーネントを追加し、

    • Ignore Tranceforms動かしたいオブジェクトを指定

    • Forcesの各種パラメータを適当な値に調整

    • CollisionのRadiusを0から適当な値に変更

    • Allow Grabbingにチェック

    • Grab Movementを1に

    • Max Stretchを適当な値に調整

1.モデルの準備

blender等お使いの3Dモデリングソフトで、動かしたいモデルを作成/編集します。
今回の場合、服の一部分を改造して無理やり紐としています。
新規でボーンを作成して作ってしまいましょう。

1.1 ボーンの作成

Start、End、Object(仮名称)の3つのボーンを作成します。
このとき、Endのボーンは「完全に伸びきったときの位置」「つかみやすい好きなボーンの長さ」で置きましょう。

訂正(2022/5/5)
ここでのEndボーンの役割は伸ばした最大値ではなく、つかめるボーン一本分の長さを定義するもののようです。
Endpoint Positionを設定することで、1つの空オブジェクトからボーンを伸ばしているように設定することもできます。)

Endpoint Position


Startボーン
Endボーン 掴むボーンの長さが決まります

1.2 ウェイト

ウェイトを設定して、紐じゃないオブジェクトを紐っぽくしましょう。

  1. Startボーンに、紐の根本の頂点のみをウェイト付けします。

  2. Objectボーンに、Startボーンで指定していない頂点をウェイト付けします。

根本であるStartは固定され、根本以外(Object)のみ動く

3Dモデリングソフト側の作業は以上です。
FBXにエクスポートしてUnityにインポートしましょう。

2.PhysBoneの設定

PhysBoneなどなどを設定していきます。
画像の通りに設定していくと、「引っ張ることができて、離すとすぐに元の状態に戻る」紐ができます。
本記事の最初で話した、Parameterの設定もお忘れなく。
ここでは左右の紐のPhysBoneに「OuterHimo.L」「OuterHimo.R」を設定しました。後で使います。

意味をイメージすれば、inspectorもこわくない

重要なポイント

  • Ignore Tranceformsの中に、Objectボーン以下を入れる

Objectボーンのみ、PhysBoneの影響を受けなくなります。
(イメージが難しくてうまく説明できません…)
設定するのはStart、Endボーンではありません。

  • ForcesのPullを 1.0 に

Pull:もとに戻ろうとする力の量です。
ここを小さくすると、離しても伸ばしたままの状態になります。

  • Allow Grabbingをチェック

ボーンをつかむための設定です。必ずチェックしましょう。

  • CollisionのRadiusを0から適切な値に変更

ボーンの当たり判定の大きさを変更します。
判定の大きさでつかみやすさが変わりますので、好みの数値に変更してください。(私は0.02~0.04が好みです)

  • Grab Movementを1に【22/06/21追記】

持った時、手に追従する速度を変更できます。
1にすると、ワールドのオブジェクトをgrabしたようにぴったりくっついてきます。

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

紐と連動して耳が動くようにしたいので、アニメーションを作成・設定していきましょう。

3.1 アニメーションの作成(準備)

アニメーションを組み込む環境を整えます。
Avatar3.0そこそこわかる!って方は3.2まで飛ばしちゃってください。

3.1-1 アニメーションクリップの作成
Assetフォルダ内の適当な場所で右クリックをして、
Create→Animationの順にクリックして、アニメーションクリップを2つ作成します。
(左右の耳を個別に動かしたいため、2つ作成しました。)

  • 3.1-2 アニメーションコントローラーを探す

次に、アニメーションの中身を設定していきましょう。
まず、使いたいアバターのFXレイヤーに入っているアニメーションコントローラーを探しましょう。

FXレイヤーはここ

探すことができたら、このアニメーションコントローラーを、
アバターの一番上の階層にあるAnimatorコンポーネントに入れます。
これを行わないと、アニメーションを作るのが大変になります…

Animatorコンポーネント
アバターの親オブジェクトに直刺しでも同じ動作になります。

編集するための画面を表示します。
画面上部から、Window→Animation→Animation,Animatorをクリックしてウィンドウ2つ表示させます。

上がAnimatorウィンドウ
下がAnimationウィンドウ

これでアニメーションを作る準備ができました。

3.2 アニメーションの作成(内容の作成)

アニメーションの中身を設定していきましょう。

  • 3.2-1 レイヤーを追加
    Animatorウィンドウのレイヤーを追加します。
    今回はOuterRope_L、OuterRope_Rを作成します。(両方ともに同じ手順で作成できます。)
    Layersタブ→+マーク→歯車→Weightを1 にします。

Weightを1にしないと耳が動きません。あるある。
  • 3.2-2 パラメーターを追加
    Parameterを設定します。
    Parameters→+マーク→Floatを選択し、
    名前を「OuterHimo.L_Stretch」に変更します。
    このOuterHimo.LはPhysBone上で設定した名前です。

Floatとすることで、小数を扱えるようになる。
  • 3.2-3 アニメーションクリップを適用
    3.2-1
    で作成したアニメーションクリップを、OuterHimo_Lレイヤーの右の画面にドラッグ&ドロップします。

    生成された長方形をクリックするとInspectorに下の画像のように表示されます。以下のように設定します。

    • Motion Typeの右、Parameterにチェック

    • Motion Typeのテキストボックスに、OuterHimo.L_Stretchと入れる

    • Write Defaultsをオフ

Motion Timeで、
OuterHimo.L_Stretchの割合に応じたアニメーションのフレームを再生できる
  • 3.2-3 耳のアニメーションを作成
    最後の工程です。
    Hierarchy上でアバターを選択してから、Animationウィンドウを開きます。(これ忘れるとAnimationウィンドウを触れません。あるある)
    赤丸の録画ボタンを押して、以下を録画します。

    • 0フレーム(左端)に、最初の状態

    • 10フレームに、耳が最大まで上がった状態

伸びきった状態を、最後のフレームに設定しよう

完成!

やったね!

やったね!


おまけ

両方の耳が最大(90%以上)まで上がったら、サウンドを再生することもできちゃいます。

EX.1 音を鳴らすオブジェクトの設置

まずは、鳴らしたい音を入手して、Unityに取り込みましょう。
アバターの適当なところ(Headボーンなど)で、
右クリック→Audio→Audio Sourceを作成します。

Unityに取り込んだ音を、AudioClipの四角にドラッグ&ドロップします。
以下を確認してください。

  • Play On Awakeにチェックが入っているか

  • Volume(音の大きさ)は適切か

Volumeは初期値の1.0だと超うるさいので必ず確認しましょう。
画面上の再生ボタンで確認できます。

EX.2 アニメーションの設定

アニメーションクリップを2つ作成します。一方はSound_idle、他方はSound_Clapと名前を付けました。

3.アニメーションの設定の要領で、アニメーションのレイヤーを設定しましょう。
パラメーターは「OuterHimo.L(またはR)_Stretch」以外使いません。
順に操作しましょう。

  • 「Sound_idle」をドラッグ&ドロップ

  • 「Sound_Clap」をドラッグ&ドロップ
    (順番はSound_Clapが先でも可ですが、その場合は、
    Sound_idleを右クリック→「Set as Layer Defalut State」を選択しておきましょう。)

  • 「Sound_idle」を右クリックMake Transitionを選択
    矢印を「Sound_Clap」に伸ばし、クリック。

  • 「Sound_Clap」を右クリック→Make Transitionを選択
    矢印を「Sound_idle」に伸ばし、クリック。

  • 手順 4.をもう一度行う。

手順5 完了時の画像
右の→の三角が3つになりますが矢印は2本です。
  • 手順3の矢印を選択し、

    • Has Exit Timeのチェックを外す

    • Transition Duration(s)を0に

    • Conditionの+を2回押し、
      OuterHimo.L_Stretch Greater 0.9
      OuterHimo.R_Stretch Greater 0.9

      と設定。

  • 手順4の矢印の一方に、

    • Has Exit Timeのチェックを外す

    • Transition Duration(s)を0に

    • Conditionの+を1回押し、
      OuterHimo.L_Stretch Less 0.9
      と設定。

  • もう一方に、

    • Has Exit Timeのチェックを外す

    • Transition Duration(s)を0に

    • Conditionの+を1回押し、
      OuterHimo.R_Stretch Less 0.9
      と設定。

手順4の複数の矢印は、Transitionsからどの矢印を選ぶか変えることができる。
矢印の設定完了後の様子。

完成!

紐を両方とも9割以上引き延ばすと、サウンドが再生できるようになりました!!やったね!

ただ、この設定のままだと、紐を緩めるとサウンドの再生が止まってしまうので、改良が必要になるかもしれません…

さいごに

PhysBone、髪の毛やしっぽを持てる・触れるもすごいですが、アニメーションを関連付けられるのは最強だと思います( ˘ω˘ )
握ると耳が動く肉球帽子をイメージして作りましたが、パラシュートを展開したり、防犯ブザーを鳴らしたり、チェーンソーを起動したり…と本当に何でも簡単に実現できそうな夢の機能なんじゃないか…!?って考えています。

初note執筆でしたが、ターゲットを初心者と有識者のどっちにしようか悩みながら書いたので、ぐちゃっとした内容になってるかもしれません…
人に教えるようなイメージで書くのはかなりトレーニング?になりました。
Unityの細かいInspectorの内容は、どんな効果を持つかをイメージしながら触ってみるとそのうち無意識にマウスが動くようになります。多分。

皆さんのPhysBoneのギミックが見たいので、みんなもPhysBone、しよう!

いいなと思ったら応援しよう!