【Unity】【C#】ユニティちゃんを飛行させる! 
2015/03/15 Sun [edit]
前回「クエリちゃんを飛行させる!」で作ったスクリプトとアニメーターを利用して、今度はユニティちゃんを空へ飛ばしてみたいと思う。これこそメカニムの醍醐味と言えよう。せっかくの機能なんだから、使わないともったいない(笑)。今回はある意味ユニティちゃんとクエリちゃんの勝手にコラボという感じだが、まぁ製品化しているわけじゃないし、ライセンス的にはどちらも問題ないと思う。
先に概要を挙げておくと、前回作ったスクリプトとアニメーターをユニティちゃん用に改造し、そこそこ見た目おかしくない程度に設定するくらいだ。細かい調整は自分なりにやって欲しい。例えば、高速移動すると服が少しめくれて元に戻らなくなったりすることもあるけど、その辺は大目に見て欲しい(笑)。
今回も使用したスクリプトやアニメーターをあらかじめ用意しておくので、クエリちゃんを飛ばしたことある人は、「■ユニティちゃんモデルを飛行させる!」から読んでも大丈夫だろう。
(※) Unity 4.6.1f2 / Windows8.1(x64) で確認
■モデルを用意する
今回はユニティちゃんとクエリちゃんの両方のパッケージを使うことになる。もし「クエリちゃんを飛行させる!」で作ったシーンがあるのなら、それを [Ctrl - D](Duplicate) で複製して使うのも良いだろう。モデルは各オフィシャルサイトや AssetStore からダウンロードできる。今回使ったパッケージはクエリちゃんモデル「Query-Chan model.unitypackage」(Ver.2.1.0)とユニティちゃん 3Dモデルデータ「UnityChan_1_2.unitypackage」(Ver.1.2)の2つだ。ユニティちゃんのモデルは AssetStore の方ではバージョンが少し古いのか、欲しいものが入ってなかったので、オフィシャルサイトの方からダウンロードしよう。クエリちゃんの場合はオフィシャルサイトからリンクを辿っていくと、AssetStore でダウンロードすることになる。
・クエリちゃんのモデルのダウンロードの説明は→こちら。
(※)以前インポートしたことある人は「C:\Users\(ユーザー名)\AppData\Roaming\Unity\Asset Store\Pocket Queries Inc\3D ModelsCharactersToons」に「Query-Chan model.unitypackage」があるので(Windowsの場合。隠しフォルダになってるかも)、それをプロジェクトエクスプローラにドラッグ&ドロップしても良い。
・ユニティちゃんのモデルはオフィシャルサイトの上部メニューの「DATA DOWNLOAD」からライセンス承諾後、パッケージをダウンロードできる。「ユニティちゃん 3Dモデルデータ」をダウンロード(掲載時点Ver1.2)。
これらを1つのプロジェクト内にインポートしよう。「~.unitypackage」をプロジェクトエクスプローラにドラッグ&ドロップでもインポートできる。

■飛行移動スクリプトを作る
前回作ったクエリちゃん飛行スクリプトをユニティちゃんでも使えるように改造しよう。といっても実はクエリちゃん用という部分は「QueryMechanimController」を使っている所だけだ。その関連を削除することになる。
(※)サンプルのスクリプトとアニメーターをダウンロードして使う人は「■ユニティちゃんを飛行させる」まで読み飛ばしても良い。
1.プロジェクトエクスプローラで「QueryFlyingController」を [Ctrl - D](Duplicate) で複製し、「CharacterFlyingController」にリネームしよう。MonoDevelop で開いたら、クラス名もファイル名に合わせることに注意。こちらも「QueryFlyingController」→「CharacterFlyingController」に変更する。
2.テキストエディタの検索機能を使って(Ctrl - F) 「QueryMechanimController」を検索し、その関連はすべて削除する。この部分はクエリちゃんのステートが変わったときに、そのモーション用の表情や手をスクリプトで変更するためのものだ。また「StateTable」「defaultState」「currentState」「oldState」「useEmotionAndHandChange」など「ステート管理用」にまとめられている変数もすべて必要ないので、その辺りもすべて削除しよう。これで完成だ。
実はこれらを削除してしまうと、ごく汎用的なスクリプトとなる。本家がこの状態で、「QueryFlyingController」の方がクエリちゃんのシステムを分析した上で、クエリちゃん用にカスタマイズしたものと言って良い。だから物によってはユニティちゃん以外でも使える。
●キャラクター飛行コントローラ「CharacterFlyingController」
using UnityEngine;
using System.Collections;
/**
* キャラクター飛行コントローラ
* 2015/3/15 Fantom
*/
[RequireComponent(typeof(CharacterController))]
public class CharacterFlyingController : MonoBehaviour {
/** 前進速度 */
private float forwardSpeed = 0f;
/** キーによる前進速度加速量 */
public float accelerarion = 0.05f;
/** 最小前進速度(下限速度 > 0) */
public float speedMin = 0f;
/** 最大前進速度(上限速度) */
public float speedMax = 10f;
/** 上下[左右]速度(Y軸[X軸:rotationMode=false]方向移動速度) */
public float moveSpeed = 3f;
/** 左右旋回モード(false = 左右移動) */
public bool rotationMode = true;
/** 左右旋回速度 */
public float rotationSpeed = 90f;
//------------------------------------------------//
//キー使用 ON/OFF
/** (前進)加速キーの使用 ON/OFF */
public bool useAccelKey = true;
/** (前進)減速キーの使用 ON/OFF */
public bool useBrakeKey = true;
//------------------------------------------------//
//キー設定
/** (前進)加速キー */
public KeyCode accelKey = KeyCode.LeftShift;
/** (前進)減速キー */
public KeyCode brakeKey = KeyCode.LeftControl;
/** 上昇キー */
[SerializeField]
private KeyCode upKey = KeyCode.UpArrow;
/** 下降キー */
[SerializeField]
private KeyCode downKey = KeyCode.DownArrow;
/** 左移動キー */
[SerializeField]
private KeyCode leftKey = KeyCode.LeftArrow;
/** 右移動キー */
[SerializeField]
private KeyCode rightKey = KeyCode.RightArrow;
//------------------------------------------------//
//仮想軸キー管理用
/** 左右仮想軸キー */
private AxisKey horizontalKey;
/** 上下仮想軸キー */
private AxisKey verticalKey;
//------------------------------------------------//
//実行用
/** 移動方向のローカル空間→ワールド空間変換用 */
private Vector3 moveDirection = Vector3.zero;
/** CharacterController キャッシュ */
private CharacterController controller;
/** Animator キャッシュ */
private Animator animator;
//------------------------------------------------//
// Use this for initialization
void Start () {
//オブジェクトキャッシュ
controller = this.GetComponent<CharacterController>();
animator = this.GetComponent<Animator>();
//キーを設定
horizontalKey = new AxisKey(rightKey, leftKey);
verticalKey = new AxisKey(upKey, downKey);
//初期化
forwardSpeed = Mathf.Clamp(forwardSpeed, speedMin, speedMax);
}
// Update is called once per frame
void Update () {
//入力による移動処理
bool accel = useAccelKey && Input.GetKey(accelKey);
bool brake = useBrakeKey && Input.GetKey(brakeKey);
forwardSpeed += (accel ? accelerarion : 0f) + (brake ? -accelerarion : 0f);
forwardSpeed = Mathf.Clamp(forwardSpeed, speedMin, speedMax);
float h = horizontalKey.GetAxis();
float v = verticalKey.GetAxis();
if (rotationMode) {
transform.Rotate(0f, h * rotationSpeed * Time.deltaTime, 0f);
moveDirection.Set(0f, v * moveSpeed, forwardSpeed);
} else {
moveDirection.Set(h * moveSpeed, v * moveSpeed, forwardSpeed);
}
moveDirection = transform.TransformDirection(moveDirection);
controller.Move(moveDirection * Time.deltaTime);
//------------------------------------------------//
//Animator
animator.SetFloat("Speed", forwardSpeed);
animator.SetFloat("Horizontal", h);
animator.SetFloat("Vertical", v);
}
}
尚、キー操作には前回作った「AxisKey」クラスが必要である。
内容的には前回作ったスクリプトと変わらない。
上下左右のキー設定を「SerializeField」の「private」スコープにしているが、これはこのスクリプト内では「AxisKey」クラスを使っているためで、ユーザーにカスタム設定させたい場合は「horizontalKey」「verticalKey」を「Start()」の中にあるように「AxisKey」のインスタンスを再設定するメソッドなどを付け加えれば良い。
「rotationMode」はデフォルトで左右のキーを旋回にしてあるが、false にすれば単純な移動になる。シューティングには false の方がしっくり来るかもしれない。また「speedMin」「speedMax」で前進速度を制限してあるが、同じ値にすれば一定速度のみとなる。「speedMin」を初期値で0以上にしておけば、プレイ開始と同時に前進することになる。
■ユニティちゃん用 飛行アニメーターを作る
次にスクリプトから利用するアニメーターを作ろう。アニメーターとは複数のアニメーションクリップを遷移させるものと考えて良い。ユニティちゃんは「Face」(表情)レイヤーを持っているので、その部分だけを追加しよう。
1.前回作ったアニメーター「PQchan_Flying.controller」を [Ctrl - D](Duplicate) で複製する。名前は「PQchan_Flying_for_UnityChan.controller」としておいた。これをダブルクリックして「Animator」タブを開こう。
2.「Base Layer」はそのままで、まずは「Face」(表情)レイヤーを作成する。画面左上の「Base Layer」の右下にある「+」ボタンを押せば、新規レイヤーが作られる。名前を「Face」に変更したら、「Mask」を「face only mask」に設定する。この「Avatar Mask(アバターマスク)」とはキャラ全体から一部を抜き出す(不要な部分を隠す)ものと考えて良い。つまりユニティちゃんは表情のアニメーションとそれ以外のアニメーションが別々に再生されているという感じになる(目パチとか)。この機能を使えば2つ以上のモーションの合成みたいなものもできる(例えば上半身と下半身で別々のアニメーションクリップを再生するとか)。

3.この「Face」レイヤーに登録するステートだが、遷移は特に必要ないので(スクリプトがやってる)、プロジェクトエクスプローラで「UnityChan>FaceAnimation」フォルダを開き、ここにあるアニメーションクリップをすべて選択し、Animator にドラッグ&ドロップしよう。追加し終わったら、その中から「default@unitychan」を探し出し、そのステートを右クリックして「Set As Default」でデフォルトステート(オレンジ色)に設定する。並び方などは適当で良い。これで完成だ。
(※)画面からはみ出て見にくいときは、[Alt + ドラッグ](Windows)で画面を移動できる。

●デフォルトステートを設定する

■ユニティちゃんモデルを飛行させる!
さてここからが本番。必要なものは揃ったので、あとはモデルに組み込むだけだ。空に飛ばすのでシーンは何でも構わないが、床くらいはあった方がわかりやすいので、以前ユニティちゃんを歩行させた時のように「Plane」にテクスチャでも貼って、適当に背景でも作ろう。今回はその辺りは割愛して、ユニティちゃんを配置する所からはじめる。以前作ったシーンがあれば、[Ctrl - D](Duplicate)で複製して、それを使っても良い。
1.プロジェクトエクスプローラで「UnityChan>Prefabs」フォルダを開き、「unitychan_dynamic」をヒエラルキーにドラッグ&ドロップしよう。このプレハブを選んだ理由は通常の「unitychan」プレハブの場合、飛行したときあの長いツインテールがなびかず、自分の体に刺さってしまうからだ(笑)。「unitychan_dynamic」の場合は初めから組み込まれている「Spring Manager(Script)」コンポーネントを調整すれば、飛行中も髪がなびき、いい感じになる。
(※)ユニティちゃんの色が暗く見えるようなら、同フォルダにある「Directional light for UnityChan」もヒエラルキーにドラッグ&ドロップして使うと良い。

2.モデルをヒエラルキーに追加したら、インスペクターで少しばかり Y 軸の配置を調整し、「Character Controller」を追加しよう。また「Center」は0のままで、「Height」だけ調整しておこう。編集画面上ではモデルとコライダがずれているように見えるが、飛行モーションはどうやら基準座標は真ん中になっているようなので(歩行モーションは足元)、実行したとき、少しばかり空中に浮いていないと、床にめり込んでしまうからだ。


3.そのままインスペクターで「Idle Changer(Script)」と「Random Wind(Script)」を無効にしてしまおう(Remove Component しても良い)。「Random Wind(Script)」は別に使っても大丈夫なのだが、無い方がスッキリする。「Face Update(Script)」もGUIが邪魔なら、MonoDevelop で開いて「OnGUI」メソッドをコメントアウトした方が良い。

4.次いで先に作った「CharacterFlyingController」(飛行用スクリプト)を追加しよう。設定はデフォルトのままで良い。

5.次にアニメーターを設定しよう。インスペクターで「Animator>Controller」を「UnityChanARPose」(ARポーズ)から「PQchan_Flying_for_UnityChan」(飛行用)に変更する。「PQchan_Flying_for_UnityChan」は先に作ったアニメーターのことだ。そして「Apply Root Motion」をオフにしておく。これがオンになってるとうまく飛べない。

6.最後にカメラを追従させよう。超簡単な方法は「Main Camera」を「unitychan_dynamic」の子要素にしてしまう方法だ。ヒエラルキーで「Main Camera」を「unitychan_dynamic」にドラッグ&ドロップして、カメラの位置を調整するだけで良い。こうするとユニティちゃんと一緒にカメラも動く。ここでは微妙に上から見下ろす角度にしておいた。これでめでたく完成だ。シーンは適当な名前で保存しよう。


デフォルトでは[↑][↓]で上昇下降、[←][→]で左右旋回、[Shift](左)で前進加速、[Ctrl](左)で前進減速となっている。「Character Flying Controller(Script)」のインスペクターで「Rotation Mode」のチェックを外せば、左右キーはシューティングの様な移動になる。髪のなびき方が大き過ぎると感じたら、「Spring Manager(Script)」のインスペクターで「Dynamic Ratio」を少し低くするのも良いだろう。シーンを再生して確かめてみよう。
(関連記事)
【Unity】【C#】ユニティちゃんをサクっと簡単に動かす!
【Unity】【C#】クエリちゃんを飛行させる!
【Unity】【C#】SDクエリちゃんを飛行させる!
【Unity】プロ生ちゃんを飛行させる!
【Unity】【C#】SmoothFollow に回転アングルと距離の遠近機能を付けてみる
【Unity】【C#】FPS(フレームレート)をリアルタイムに測定して表示するv2(4隅選択可能で、画面サイズの変更にも対応版)


- 関連記事
トラックバック
トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/169-c5dae36d
この記事にトラックバックする(FC2ブログユーザー)
| h o m e |