【Unity】【C#】SDクエリちゃんを飛行させる! 
2015/06/12 Fri [edit]
これも以前作った通常版の飛行スクリプトをSD 用に改造してみた。
※クエリちゃんのモデルのダウンロードからの場合は→こちら。
(※) Unity 4.6.1f2 / Windows8.1(x64) で確認
■SDクエリちゃん用 飛行移動スクリプト
といっても、これもクラス名や定数名を SD 用に変更するだけで上手くいった。作り方は「QueryFlyingController.cs」を「QuerySDFlyingController.cs」などにリネームし、MonoDevelop などテキストエディタで以下のように変更するだけだ([Ctrl - H]で全置換するとラク)。作るのが面倒な人はサンプルをダウンロードして欲しい。
スクリプトとアニメーターをダウンロードして使う場合は「■SDクエリちゃんモデルを飛行させる!」まで飛ばしても構わない。
●スクリプト内で変更するクラス名や定数名
通常版用 | SD版用 |
---|---|
QueryMechanimController | QuerySDMecanimController |
QueryChanAnimationType | QueryChanSDAnimationType |
QueryChanAnimationType.FLY_IDLE | QueryChanSDAnimationType.NORMAL_FLY_IDLE |
QueryChanAnimationType.FLY_STRAIGHT | QueryChanSDAnimationType.NORMAL_FLY_STRAIGHT |
QueryChanAnimationType.FLY_TOLEFT | QueryChanSDAnimationType.NORMAL_FLY_LEFT |
QueryChanAnimationType.FLY_TORIGHT | QueryChanSDAnimationType.NORMAL_FLY_RIGHT |
QueryChanAnimationType.FLY_UP | QueryChanSDAnimationType.NORMAL_FLY_UP |
QueryChanAnimationType.FLY_DOWN | QueryChanSDAnimationType.NORMAL_FLY_DOWN |
●SDクエリちゃん用 飛行移動スクリプト
using UnityEngine;
using System.Collections;
namespace QueryChanSD {
/**
* SDクエリちゃん用 飛行コントローラ
* 2015/6/12 Fantom
*/
[RequireComponent(typeof(CharacterController))]
[RequireComponent(typeof(QuerySDMecanimController))]
public class QuerySDFlyingController : 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;
/** QuerySDMecanimController(Script) キャッシュ */
private QuerySDMecanimController queryMechanim;
/** Animator キャッシュ */
private Animator animator;
//------------------------------------------------//
//ステート管理用
/** ステートハッシュと QueryChanSDAnimationType の変換テーブル */
private static Hashtable StateTable = new Hashtable() {
{Animator.StringToHash("Base Layer.Idle"), QuerySDMecanimController.QueryChanSDAnimationType.NORMAL_FLY_IDLE},
{Animator.StringToHash("Base Layer.Forward"), QuerySDMecanimController.QueryChanSDAnimationType.NORMAL_FLY_STRAIGHT},
{Animator.StringToHash("Base Layer.Left"), QuerySDMecanimController.QueryChanSDAnimationType.NORMAL_FLY_LEFT},
{Animator.StringToHash("Base Layer.Right"), QuerySDMecanimController.QueryChanSDAnimationType.NORMAL_FLY_RIGHT},
{Animator.StringToHash("Base Layer.Up"), QuerySDMecanimController.QueryChanSDAnimationType.NORMAL_FLY_UP},
{Animator.StringToHash("Base Layer.Down"), QuerySDMecanimController.QueryChanSDAnimationType.NORMAL_FLY_DOWN},
};
/** 変換テーブルにないときのデフォルトハッシュ */
private int defaultState = Animator.StringToHash("Base Layer.Idle");
/** 現在のステートハッシュ */
private int currentState;
/** 1つ前のステートハッシュ */
private int oldState;
/** ステートによって表情や手も変更する ON/OFF */
public bool useEmotionAndHandChange = true;
//------------------------------------------------//
// Use this for initialization
void Start () {
//オブジェクトキャッシュ
controller = this.GetComponent<CharacterController>();
animator = this.GetComponentInChildren<Animator>();
queryMechanim = this.GetComponent<QuerySDMecanimController>();
queryMechanim.ChangeAnimation(QuerySDMecanimController.QueryChanSDAnimationType.NORMAL_FLY_IDLE, false);
AnimatorStateInfo animatorInfo = animator.GetCurrentAnimatorStateInfo(0); //BaseLayer
currentState = animatorInfo.nameHash;
oldState = currentState;
//キーを設定
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);
//------------------------------------------------//
//ステートによって表情や手を変更する
if (useEmotionAndHandChange) {
AnimatorStateInfo animatorInfo = animator.GetCurrentAnimatorStateInfo(0); //BaseLayer
currentState = animatorInfo.nameHash;
if (oldState != currentState) {
oldState = currentState;
if (StateTable.ContainsKey(currentState)) {
queryMechanim.ChangeAnimation((QuerySDMecanimController.QueryChanSDAnimationType)StateTable[currentState], false);
} else {
queryMechanim.ChangeAnimation((QuerySDMecanimController.QueryChanSDAnimationType)StateTable[defaultState], false);
}
}
}
}
}
}
解説は通常版のときとまったく同じなので、必要なら参照して欲しい。
■飛行用アニメーターを作る
次にスクリプトから利用するアニメーターを作る。これも通常版のときのアニメーター「PQchan_Flying.controller」を複製([Ctrl -D])し、「PQchanSD_Flying.controller」などにリネームする。あとはムービークリップを変更するだけだ。設定例を以下に書いておく。自分で作るのが面倒な人はサンプルをダウンロードして欲しい。
●設定したアニメーションクリップ(PQchanSD_Flying.controller)
ステート | Motion |
---|---|
Idle | 0009_Fly_Idle (~/SD_QUERY_01.fbx) |
Up | 0013_Fly_Up (~/SD_QUERY_01.fbx) |
Down | 0014_Fly_Down (~/SD_QUERY_01.fbx) |
Forward | 0010_Fly_Straight (~/SD_QUERY_01.fbx) |
Left | 0011_Fly_Left (~/SD_QUERY_01.fbx) |
Right | 0012_Fly_Right (~/SD_QUERY_01.fbx) |
詳しいアニメーターの作り方も通常版のときとまったく同じなので、必要なら参照して欲しい。
■SDクエリちゃんモデルを飛行させる!
それではスクリプトやアニメーターをモデルに組み込もう。空に飛ばすのでシーンは何でも構わないが、床くらいはあった方がわかりやすいので、以前クエリちゃんを歩行させた時のように「Plane」にテクスチャでも貼って、適当に背景でも作ろう。今回はその辺りは割愛して、SDクエリちゃんを配置する所からはじめる。以前作ったシーンがあれば、[Ctrl - D](Duplicate)で複製して、それを使った方が簡単だ。
1.プロジェクトエクスプローラで「PQAssets>Query-Chan-SD>Prefabs」を開くといくつかモデルが入っているので、好きなものをヒエラルキーにドラッグ&ドロップしよう。今回は「Query-Chan-SD」を使ってみた。

2.モデルをヒエラルキーに追加したら、「Query-Chan-SD」(名前はモデルによる)を選択して、メニューから「Component>Scripts>QueryChanSD」で「Query SDFlying Controller」を追加する。

3.スクリプトを追加すると、自動的に「Character Controller」も追加されたと思うが、追加されなかったら、手動でメニューから「Component>Physics>Character Controller」で追加しよう。設定は自由で構わないが「Center」の「Y」だけは調整して置いた方が良い。

4.次にアニメーターを設定しよう。ヒエラルキーで「Query-ChanーSD」の▼を開いて、「SD_Query_01」(末尾の番号はモデルによる)を選択して、インスペクターで「Animator>Controller」を「QueryChanSDAnimController」から「PQchanSD_Flying」に変更する。「PQchanSD_Flying」は先に作った(またはダウンロードした)アニメーターのことだ。


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


デフォルトでは[↑][↓]で上昇下降、[←][→]で左右旋回、[Shift](左)で前進加速、[Ctrl](左)で前進減速となっている。「Query SDFlying Controller」のインスペクターで「Rotation Mode」のチェックを外せば、左右キーはシューティングの様な移動になる。シーンを再生して確かめてみよう。改造はスクリプトの解説(通常版)を参考にして欲しい。また、目パチをつけたい人はこちらの記事を、アニメーションの調整などはSDユニティちゃんの記事を、WebTemplate などを使いたい人はユニティちゃんの記事などを参考にしてみるといいだろう。
(関連記事)
【Unity】【C#】SDクエリちゃんを動かす!
【Unity】【C#】SDクエリちゃんを目パチさせる
【Unity】【C#】クエリちゃんを飛行させる!
【Unity】【C#】ユニティちゃんを飛行させる!
【Unity】プロ生ちゃんを飛行させる!
【Unity】SDプロ生ちゃんを動かす!
【Unity】【C#】SmoothFollow に回転アングルと距離の遠近機能を付けてみる
【Unity】【C#】FPS(フレームレート)をリアルタイムに測定して表示するv2(4隅選択可能で、画面サイズの変更にも対応版)

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