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