こちらは
Unity アセット真夏のアドベントカレンダー 2021 Summer! 24日目の記事になります。
今回紹介するアセットはこちら
PuppetMaster
PuppetMasterで出来る事
・キャラクターを簡単にラグドール化できる
・キャラクターのコライダーを簡単に編集できる
他にも色んなことができるけど今回やりたいことは・・・
キャラクターの頭を貫通させずに撫でる!
撫でたら反応させる!
以前、自作ソフト みくちゅあがーでんで「頭を撫でる」を実装した際は
反応するけど手がキャラの頭をすり抜ける状態でした。
――守りたい、この笑顔。#みくちゅあがーでん#るきべん8K #LookingGlass #ルキグラス pic.twitter.com/0z3DQtsv2b
— シロフード@XRクリエイター (@sirohood_exp) September 22, 2020
decchiさんから「PuppetMasterってアセット使ってみたらいいですよ。」と助言を頂き
購入してたけど全然触ってなかったので突如思い立って触りだしました。
公式ドキュメント
http://root-motion.com/puppetmasterdox/html/index.html
◆キャラクターのラグドール化
キャラオブジェクトにBipedRagdollCreator.csを付け
Create a Ragdollボタンを押すとキャラクターの全身に自動的にコライダーが設定されます。(めちゃ楽!)
↓
コライダーのサイズ設定は後で出来るので、そのままStartEditingManuallyボタンを押します。
するとキャラクターにつけたスクリプトがRagdollEditorに変化します。
コライダーを調整したい箇所をシーンで選択しサイズなどを変更します。
片方を調整したら反対側も自動的に同じ調整されるのは便利!
シーン上に表示されてるウィンドウで、左右対称にするかどうか、コライダーの種類を選択できます。
※コライダーの調整で使えるのは移動(ショートカットキーW)とサイズ(ショートカットキーR)の変更だけ、移動・回転・サイズ変更の操作できる(ショートカットキーY)のハンドルは表示されないようです。
●足のコライダーの角度が違う場合
キャラクターにPuppetMaster.csをアタッチしSetUpPuppetMasterボタンを押します。
するとキャラクターの階層にPuppetMasterオブジェクトが追加されます。
向きを変えたい箇所を選択して回転させます。
ココでは左右対称が効かないのでhierarchyで二つ選択して同じように回転させましょう。
地面としてPlaneを追加して実行
そのまま直立していますが、PuppetMasterオブジェクトのPuppetMasterスクリプトから
PinWeightを1から0にスライドしてあげると人形のように振舞うようになります。
この状態でCubeなどをぶつけてあげるとモノに当たったような反応をしてくれるようになります。
頭が沈みすぎたり違和感がある場合は
PuppetMasterオブジェクトについているPuppetMasterコンポーネントからHeadの項目を選んで
MappingWeightをいい感じに調整するといいです。
あとはこれを手のモデルに置き換えてLeapmotionなどで手の動きを取得し、頭を撫でたら表情が変わるようにしていきます!
◆頭を撫でたら反応するようにする
手のモデルを用意してメッシュコライダーつけてtagをセットします。
BaseLayerには基本のアニメーションをセット
頭用のアバターマスクを作成して
AnimatorのLayersにHeadレイヤーを追加、weightを1にして作成したアバターマスクを設定します。
Animatorのパラメーターにbool型のパラメーターを追加(今回はhuruhuruという名前にしました。)
Headレイヤーに「笑って頭を振る」アニメーションを設定し、パラメーターで動くようにセット
アニメーションを動かすスクリプトを作成
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class huruhuru : MonoBehaviour { public Animator _animator; void Start() { _animator.SetBool("huruhuru", false); } void Update() { } //オブジェクト同士が衝突している間発生するイベント void OnCollisionStay(Collision col) { if (col.gameObject.tag == "Hand") { _animator.SetBool("huruhuru", true); Debug.Log("あたっている"); } } //オブジェクトが離れた場合 void OnCollisionExit(Collision other) { _animator.SetBool("huruhuru", false); Debug.Log("はなれた"); } }
キャラの頭オブジェクトにスクリプトをつけてアニメーターをセットして完成!
ゲーム実行して手のモデルが頭にあたるとアニメーションが再生されるようになります。
これで手が貫通せずに頭を撫でたらキャラが反応してくれるようになりました!
はい、可愛いいいいぃぃいいいい!!!
ということでUnityアセットPuppetMasterを使った紹介でした。
ちなみに今回使用した天使のモデルはコチラ
https://assetstore.unity.com/packages/3d/characters/humanoids/sci-fi/muryotaisu-187402
以上、解散っ!
投稿者:シロフード
とある企業のVR事業部でUnityと戯れるお仕事をしています。
※コメントは承認後に表示されます。
コメントを公開されたくない場合、名前の後に「:非公開」とつけてください。