Unity2017でMMDモデルの首をキー操作でリアルタイムに動かすには?
Unity2017にMMD4Mecanimを使って取り込んだMMDモデルの首を、キー操作で動かすためのソースコードです。
を参考にしました。
環境
- MacBookPro2017(macOS Siella Ver.10.12.6)
- Unity(2017.3.0f3)
- MMD4Mecanim_Beta_20170910( MMD4Mecanim_Beta_20170910.zipをダウンロード)
実現したいこと
MMD4Mecanim を使ってUnityに取り込んだMMDキャラクターモデルの首を、キーボードの矢印キー(↑↓→←)の操作入力でリアルタイムに動かしたい。
ソースコード
下記のソースコードでスクリプトを作成し、キャラクターのゲームオブジェクトにアタッチすれば完了です。
※コピーの際は、ソースコードをダブルクリックして全選択するとやりやすいです。
using UnityEngine; using System.Collections; public class NeckController : MonoBehaviour { public GameObject mmdPlayerObject; MMD4MecanimBone neckBone; Vector3 neckVec; //首の角度 void Start () { //neckのgameObjectを取得 GameObject neckChild = mmdPlayerObject.transform.Find ("391.!Root").Find ("270.joint_HipMaster").Find ("3.joint_Torso").Find ("4.joint_Torso2").Find ("5.joint_Neck").gameObject; //neckのBoneにアタッチされているMMD4MecanimBoneを取得 neckBone = neckChild.GetComponent<MMD4MecanimBone>(); Debug.Log (neckBone); } void Update () { if(neckBone!=null){ neckVec = new Vector3(0, 0, 0); if (Input.GetKey (KeyCode.RightArrow)) { Debug.Log ("首を左に回しました。"); neckVec = new Vector3(0, -30, 0); } else if (Input.GetKey (KeyCode.LeftArrow)) { Debug.Log ("首を右に回しました。"); neckVec = new Vector3(0, 30, 0); } else if (Input.GetKey (KeyCode.UpArrow)) { Debug.Log ("首を上げました。"); neckVec = new Vector3(-20, 0, 0); } else if (Input.GetKey (KeyCode.DownArrow)) { Debug.Log ("首を下げました。"); neckVec = new Vector3(20, 0, 0); } //首を動かす neckBone.userEulerAngles=neckVec; } else { Debug.LogWarning("MMD4MecanimBone(script) が見つかりませんでした。"); } } }
これだけで、矢印キーの上下左右でキャラクターがリアルタイムに首を振ったり、上下に動かしたりできます。
首をもっとなめらかに動かすには?
上記のソースコードでも首は動きますが、動く角度を決めうちにしているので自然さがやや欠けますね。もう少し自然な動きに見えるようにしたいところです。そういうときは下記のようなコードにすると滑らかに動くようになります。
void Update () { if(neckBone!=null){ neckVec = new Vector3(0, 0, 0); float horizontal = Input.GetAxis("Horizontal"); float vertical = Input.GetAxis("Vertical"); neckVec = new Vector3(-vertical * 30, -horizontal * 50, 0); neckBone.userEulerAngles=neckVec; //首を動かす } else { Debug.LogWarning("can't find MMD4MecanimBone(script)"); } }
コメント