Unity2017でMMDモデルの首をキー操作でリアルタイムに動かすには?

Unity2017にMMD4Mecanimを使って取り込んだMMDモデルの首を、キー操作で動かすためのソースコードです。

を参考にしました。

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)");
		}
	}

コメントを入力:
G Q​ F B X