fc2ブログ
ヽ|∵|ゝ(Fantom) の 開発blog? ホーム »クエリちゃん
このページの記事一覧

【Unity】【C#】SDクエリちゃんを飛行させる!  


 これも以前作った通常版の飛行スクリプトSD 用に改造してみた。



※クエリちゃんのモデルのダウンロードからの場合は→こちら。

(※) Unity 4.6.1f2 / Windows8.1(x64) で確認




■SDクエリちゃん用 飛行移動スクリプト

 といっても、これもクラス名や定数名を SD 用に変更するだけで上手くいった。作り方は「QueryFlyingController.cs」を「QuerySDFlyingController.cs」などにリネームし、MonoDevelop などテキストエディタで以下のように変更するだけだ([Ctrl - H]で全置換するとラク)。作るのが面倒な人はサンプルをダウンロードして欲しい。

>>サンプルのスクリプトとアニメーターをダウンロード
(Google Drive を利用。画面右上にあるダウンロードアイコンを押す)

 スクリプトとアニメーターをダウンロードして使う場合は「■SDクエリちゃんモデルを飛行させる!」まで飛ばしても構わない。

●スクリプト内で変更するクラス名や定数名
通常版用SD版用
QueryMechanimControllerQuerySDMecanimController
QueryChanAnimationTypeQueryChanSDAnimationType
QueryChanAnimationType.FLY_IDLEQueryChanSDAnimationType.NORMAL_FLY_IDLE
QueryChanAnimationType.FLY_STRAIGHTQueryChanSDAnimationType.NORMAL_FLY_STRAIGHT
QueryChanAnimationType.FLY_TOLEFTQueryChanSDAnimationType.NORMAL_FLY_LEFT
QueryChanAnimationType.FLY_TORIGHTQueryChanSDAnimationType.NORMAL_FLY_RIGHT
QueryChanAnimationType.FLY_UPQueryChanSDAnimationType.NORMAL_FLY_UP
QueryChanAnimationType.FLY_DOWNQueryChanSDAnimationType.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」などにリネームする。あとはムービークリップを変更するだけだ。設定例を以下に書いておく。自分で作るのが面倒な人はサンプルをダウンロードして欲しい。

>>サンプルのスクリプトとアニメーターをダウンロード
(Google Drive を利用。画面右上にあるダウンロードアイコンを押す)

●設定したアニメーションクリップ(PQchanSD_Flying.controller)
ステートMotion
Idle0009_Fly_Idle (~/SD_QUERY_01.fbx)
Up0013_Fly_Up (~/SD_QUERY_01.fbx)
Down0014_Fly_Down (~/SD_QUERY_01.fbx)
Forward0010_Fly_Straight (~/SD_QUERY_01.fbx)
Left0011_Fly_Left (~/SD_QUERY_01.fbx)
Right0012_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隅選択可能で、画面サイズの変更にも対応版)


"Query-Chan model" は Creative Commons Attribution 4.0 International License(CC-BY) に基づいて配布されています。
"Query-Chan model" by Pocket Queries, Inc. is licensed under a Creative Commons Attribution 4.0 International License(CC-BY).



関連記事
スポンサーサイト



category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityライブラリ  C#  クエリちゃん  サンプル 
tb: 0   cm: --

【Unity】【C#】SDクエリちゃんを目パチさせる  


 以前作った通常版の目パチスクリプトSD 用に改造してみよう。


 といっても、これもクラス名や定数名を SD 用に変更するだけで上手くいった。作り方は「QueryChanAutoBlink.cs」を「QueryChanSDAutoBlink.cs」などにリネームして、MonoDevelop などテキストエディタで以下のように変更するだけだ([Ctrl - H]で全置換するとラク)。作るのが面倒な人はサンプルをダウンロードして欲しい。


●スクリプト内で変更するクラス名や定数名
通常版用SD版用
QueryEmotionalControllerQuerySDEmotionalController
QueryChanEmotionalTypeQueryChanSDEmotionalType
QueryChanEmotionalType.NORMAL_EYEOPEN_MOUTHCLOSEQueryChanSDEmotionalType.NORMAL_DEFAULT
QueryChanEmotionalType.NORMAL_EYECLOSE_MOUTHCLOSEQueryChanSDEmotionalType.NORMAL_BLINK


●SDクエリちゃん用オート目パチスクリプト
using UnityEngine;
using System.Collections;

namespace QueryChanSD {
/**
* SDクエリちゃん用 オート目パチスクリプト
* * Close→Open 2段階変化
* 2015/6/11 Fantom
*/
[RequireComponent(typeof(QuerySDEmotionalController))]
public class QueryChanSDAutoBlink : MonoBehaviour {

/** オート目パチ有効フラグ */
public bool isActive = true;

//表情のマテリアル(目と口の組み合わせになってるので注意)
/** 開いている目 */
public QuerySDEmotionalController.QueryChanSDEmotionalType eyeOpen =
QuerySDEmotionalController.QueryChanSDEmotionalType.NORMAL_DEFAULT;
/** 閉じている目 */
public QuerySDEmotionalController.QueryChanSDEmotionalType eyeClose =
QuerySDEmotionalController.QueryChanSDEmotionalType.NORMAL_BLINK;

/** コントローラ(Script)のキャッシュ */
private QuerySDEmotionalController emotionalController;

/** 目パチ実行中フラグ */
private bool isBlink = false;

/** 目パチ全体の時間(Close→Open までの時間[秒]) */
public float timeBlink = 0.15f;

/** 目パチ全体の時間のゆらぎ時間(0.05 = timeBlink±0.05) */
public float fluctuation = 0.05f;

/** 目パチ発生ランダム判定の閾値(乱数0~1.0 で 0.3より上のとき発生[=70%]) */
public float threshold = 0.3f;

/** 目パチ発生ランダム判定実行のインターバル */
public float interval = 3.0f;

/** 目の状態を表すステータス */
enum Status {
/** 目が閉じている状態 */
Close,
/** 目が開いている状態 */
Open
}

/** 現在の目パチステータス */
private Status eyeStatus = Status.Open;


// Use this for initialization
void Start () {
emotionalController = this.GetComponent<QuerySDEmotionalController>();

//初期化(Status.Open 前提)
Reset();

//目パチランダム発生と変化をスタートする
StartCoroutine(RandomChange());
}

/** 状態初期化(目が開いていて[=Status.Open]、瞬きしてない[isBlink=false]状態にする) */
public void Reset () {
SetOpenEyes();
isBlink = false;
}

/** 目を閉じている状態にする */
void SetCloseEyes () {
eyeStatus = Status.Close;
emotionalController.ChangeEmotion(eyeClose);
}

/** 目を開いている状態にする */
void SetOpenEyes () {
eyeStatus = Status.Open;
emotionalController.ChangeEmotion(eyeOpen);
}

/** 目パチランダム発生と変化[(Open→)Close→Open] */
IEnumerator RandomChange () {
while (true) {
if (isActive) {
if (isBlink) {
switch (eyeStatus) {
case Status.Open: //Open→Close へ
SetCloseEyes();
yield return new WaitForSeconds(timeBlink + Random.Range(-fluctuation, fluctuation));
break;

case Status.Close: //Close→Open へ(ランダム発生待ち)
SetOpenEyes();
isBlink = false;
yield return null;
break;
}
} else {
//ランダム発生
if (Random.Range(0f, 1f) > threshold) {
isBlink = true;
}
yield return new WaitForSeconds(interval);
}
} else {
yield return null;
}
}
}
}
}


 使い方は前回のSDクエリちゃんの状態で、ヒエラルキーでキャラ(「Query-Chan-SD」)にこのスクリプトを追加するだけだ。


 気をつけて欲しいのはクエリちゃんの表情は目と口が1セットになっているので(「PQAssets>Query-Chan-SD>Models>SD_QUERY_01>Textures」のフォルダを参考に)、元の表情が口が開いてても、瞬きしたら口は閉じてしまう点だ(デフォルトの設定の場合)。その場合は、口が開いている表情に切り替える前に、「isActive=false」(目パチ停止)にし、元の表情に戻ったら「Reset()」(初期化)して、「isActive=true」(目パチ再開)などの工夫が必要になるだろう。マテリアルを指す「eyeOpen」「eyeClose」を直接変更する手もあるが、タイミング的に難しいかもしれない。

 SDクエリちゃんスクリプトをメニューでまとめるために namespace を「QueryChanSD」としているが、必要あれば変更するのも良いだろう。


(関連記事)
【Unity】【C#】SDクエリちゃんを動かす!
【Unity】【C#】SDクエリちゃんを飛行させる!
【Unity】クエリちゃんを動かす!
【Unity】【C#】クエリちゃんを目パチさせる
【Unity】【C#】クエリちゃんを飛行させる!
【Unity】SDユニティちゃんを動かす!
【Unity】SDプロ生ちゃんを動かす!
【Unity】【C#】SmoothFollow に回転アングルと距離の遠近機能を付けてみる
【Unity】【C#】FPS(フレームレート)をリアルタイムに測定して表示するv2(4隅選択可能で、画面サイズの変更にも対応版)


"Query-Chan model" は Creative Commons Attribution 4.0 International License(CC-BY) に基づいて配布されています。
"Query-Chan model" by Pocket Queries, Inc. is licensed under a Creative Commons Attribution 4.0 International License(CC-BY).




関連記事

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityライブラリ  C#  クエリちゃん  サンプル 
tb: 0   cm: --

【Unity】SDクエリちゃんを動かす!  


 SD 版がいつの間にか出てたのね。さっそく試してみようと思ったら、歩行スクリプトが無かった…(ver.1.1.0 時点)。



 とりあえず1から作るのは大変なので、通常版のスクリプトを改造して作ってみた。

 といっても、基本的には使用しているコンポーネントを SD 用に入れ替えただけだけなので、通常版をダウンロードしたことがある人は、元の歩行スクリプト「QueryLocomotionController.cs」を自分で改造しても良いだろう。作り方は「QueryLocomotionController.cs」を「QuerySDLocomotionController.cs」などにリネームして、コード内で使っているクラス名や定数を、MonoDevelop などテキストエディタで、以下のように、通常版用からSD版用に変更するだけだ([Ctrl - H] で全置換するとラク)。面倒な人はサンプルをダウンロードして使って欲しい。

>>サンプルのスクリプトとアニメーターをダウンロード
(Google Drive を利用。画面右上にあるダウンロードアイコンを押す)

●スクリプト内で変更するクラス名や定数名
通常版用SD版用
QuerySoundControllerQuerySDSoundController
QueryChanSoundTypeQueryChanSDSoundType
QueryMechanimControllerQuerySDMecanimController
QueryChanAnimationTypeQueryChanSDAnimationType
QueryChanAnimationType.IDLEQueryChanSDAnimationType.NORMAL_IDLE


 それでは、さっそく試してみよう。

1.まず新しいプロジェクトを作ったら、クエリちゃんのオフィシャルサイト(http://www.query-chan.com/)の「DATA DOWNLOAD」のリンクから「クエリちゃん SD版モデル DOWNLOAD」を押し、AssetStore へ移動して、モデルをインポートする。



2.とりあえず動き回れる床を作りたいので、「GameObject」メニューから「Plane」を作ろう。床のテクスチャなどは通常版のときの方法と同じように適当で良い。ここでは「PQAssets>Query-Chan-SD>Textures」にある「bg_player.png」を使っている。ちょっとタイリングの模様が綺麗に繋がってない気もするが、テストなのであまり気にしない(笑)。



3.次に、SDクエリちゃんの 3Dモデルを配置する。プロジェクトエクスプローラで「PQAssets>Query-Chan-SD>Prefabs」を開くといくつかモデルが入っているので、好きなものをヒエラルキーにドラッグ&ドロップしよう。今回は「Query-Chan-SD」を置いてみた。またこのままだと真っ暗なので、「GameObject」メニューから「Directinal Light」を適当に置く。設定は適当で構わない。





4.それから、カメラがちょっと遠いのと、カメラは固定でクエリちゃんが画面からはみ出たりすると見えなくなってしまうので、カメラをキャラに追従させたい。超簡単な方法は「Main Camera」を「Query-Chan-SD」(名前はモデルによる)の子要素にしてしまう方法だ。ヒエラルキーで「Main Camera」を「Query-Chan-SD」にドラッグ&ドロップして、カメラの位置を調整するだけで良い。こうするとクエリちゃんと一緒にカメラも動く。ここではアングルを正面からにしてみた。







5.移動するにはいくつかコンポーネントが必要だ。先ほど作った(またはダウンロードした)スクリプト「QuerySDLocomotionController.cs」をヒエラルキーに置いたプレファブ「Query-Chan-SD」に追加しよう。ヒエラルキーで「Query-Chan-SD」を選択して、メニューから「Component>Scripts(>QueryChanSD)」で「Query SDLocomotion Controller」を追加する。



6.更に「Character Controller」も必要だ。メニューから「Component>Physics>Character Controller」で追加しよう。設定は自由で構わないが「Center」の「Y」だけは調整して置かないと、床にめり込む(笑)。



7.これで動くには動いたが、残念ながらアニメーションしないので、滑ってる感じになってしまう。これは Animator が移動用のものになってないためだ。これも通常版から拝借して、SD 用に改造しよう。作り方はアニメーター「PQchan_Movement.controller」を「PQchanSD01_Movement.controller」などにリネームし、各ステートのアニメーションクリップをSD 用に変更するだけだ。今回はノーマルコスの「SD_QUERY_01」(ファイルは PQAssets>Query-Chan-SD>SD_QUERY_01>Models>SD_QUERY_01.fbx)のアニメーションクリップを各ステートに設定している。以下に設定例を上げておく。自分の好きに設定しても良いだろう。選択したモーションによっては、遷移のタイミングなど多少調整しておいた方が良いかもしれない。作るのが面倒な人はサンプルをダウンロードして使って欲しい。

>>サンプルのスクリプトとアニメーターをダウンロード
(Google Drive を利用。画面右上にあるダウンロードアイコンを押す)

●設定したアニメーションクリップ(PQchanSD01_Movement.controller)
ステートMotion
002_Idle0004_Idle (~/SD_QUERY_01.fbx)
003_Walk0002_Walk (~/SD_QUERY_01.fbx)
WalkBack0002_Walk (~/SD_QUERY_01.fbx)
004_Run0003_Run (~/SD_QUERY_01.fbx)
005_Jump001_Jump (~/Human_Female_A.fbx) または、0008_Win (~/SD_QUERY_01.fbx) など



●001_Jump ムービークリップでの Jump → Walk の遷移はタイミングを少し前へずらした方が良い


8.アニメーターが用意できたら、モデルに設定しよう。ヒエラルキーから「Query-Chan-SD>SD_Query_01」(末尾の番号はモデルによる)を選択して、インスペクターで「Animator>Controller」を「QueryChanSDAnimController」から「PQchanSD01_Movement」に変更する。これでアニメーションするようになったと思う。とりあえずシーンを適当な名前で保存して、動きを確かめてみよう。





9.動かして見ると、歩行は上手くいくのだが、ジャンプ(スペースキー)すると「IndexOutOfRangeException: Array index is out of range.」というエラーが出る。これは通常版の歩行スクリプトにはジャンプしたときボイスが再生されるからで、SD 版にはそのボイスが入ってないからだ。原因がわかれば、修正する方法は2パターンある。1つは歩行スクリプト「QuerySDLocomotionController.cs」内のサウンド機能の呼び出しを無効にする方法と、もう1つは通常版のボイスフォルダ(PQAssets>Query-Chan>Sounds>Voice)から wav ファイル(音声ファイル)を持ってきて、設定する方法だ。

10.ボイスを無効化する場合は、MonoDevelop などテキストエディタで「QuerySDLocomotionController.cs」を開き、「PlayJumpSound」を検索しよう([Ctrl - F])。見つけたら、その関数内の「PlaySound()」の行をコメントアウトする。これでエラーは出なくなる。



11.また、通常版からボイスを持ってきたい場合は、通常クエリちゃん(「PQAssets>Query-Chan>Sounds>Voice>02_Shouts」)から「Go_Ahead.wav」(いきますよ!)と「One_Two.wav」(せーの!)をインポートしよう(自分の好きなボイスでも構わない)。再生させるにはヒエラルキーからモデル「Query-Chan-SD」を選択して、インスペクターで「Query SD Sound Controller(Script)」の「Sound Data」の▼を開き、「Size」にとりあえず「31」と入れて、Enter を押す。すると Element 項目が設定できるようになるので、「Element 19」に「Go_Ahead」、「Element 30」に「One_Two」を設定する。どうやらジャンプするたびランダムで再生されるようだ。「QuerySDLocomotionController.cs」内の配列「jumpSounds」に追加して増やしても良いだろう。その場合は、先ほどの Element(番号) への設定も必要になる。ちなみに Element の番号はスクリプト「QuerySDSoundController.cs」内に定義されている(MonoDevelop で jumpSounds 内の ONE_TWO など定数にカーソルを当て、[F12]を押せば参照できる)。





 細かい調整は各自でやるとして、とりあえずはこれで完成だ。目パチをつけたい人はこちらの記事を、アニメーションの調整などはSDユニティちゃんの記事を、WebTemplate などを使いたい人はユニティちゃんの記事などを参考にしてみて欲しい。






(関連記事)
【Unity】【C#】SDクエリちゃんを目パチさせる
【Unity】【C#】SDクエリちゃんを飛行させる!
【Unity】クエリちゃんを動かす!
【Unity】SDユニティちゃんを動かす!
【Unity】【C#】ユニティちゃんをサクっと簡単に動かす!
【Unity】プロ生ちゃんを動かす!
【Unity】SDプロ生ちゃんを動かす!
【Unity】【C#】SmoothFollow に回転アングルと距離の遠近機能を付けてみる
【Unity】【C#】FPS(フレームレート)をリアルタイムに測定して表示するv2(4隅選択可能で、画面サイズの変更にも対応版)


"Query-Chan model" は Creative Commons Attribution 4.0 International License(CC-BY) に基づいて配布されています。
"Query-Chan model" by Pocket Queries, Inc. is licensed under a Creative Commons Attribution 4.0 International License(CC-BY).




関連記事

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: クエリちゃん  サンプル 
tb: 0   cm: --

【Unity】Japanese Otaku City(秋葉原モデル)のピンクテクスチャの修正方法  


 クエリちゃんのデモで使われているアキバモデル(Japanese Otaku City:秋葉原の都市モデル)って、Unity Free版を使っているとピンクテクスチャが出るらしいね(Pro版は出ない(?))。私も以前試してみた時、ピンクテクスチャがあるから使うのやめてしまったが(私は Free版使ってます)、修正方法を調べてみようと思ったら、Asset Store のレビューに英文で解決方法が書いてあったので、翻訳して試してみたら上手くいった。その方法。



1.既にアキバモデルがインポート済の状態から、プロジェクトエクスプローラで「ZRNAssets>005339_08932_25_14>Shaders」フォルダを開き、「su_Double_and_Clip」をクリックして、インスペクターを表示する。
(※)「005339_08932_25_14」はリリース時期(バージョン)によって違うかも。



2.インスペクターが表示されたら、右上にある「Open...」ボタンを押し、MonoDevelop などテキストエディタで開く。



3.テキストエディタを開いたら、「void vert」を検索([Ctrl - F])し、そのメソッドの一番はじめの行に「UNITY_INITIALIZE_OUTPUT(Input,o);」というコードを書いて保存する。



4.Unity のエディタに戻ったらすぐに反映されると思うので、他のシェーダ「su_VertexCol_1UV_Single」も同じように、MonoDevelop で開いて「UNITY_INITIALIZE_OUTPUT(Input,o);」のコードを追加して保存する。



5.クエリちゃんのシェーダは「PQAssets>Query-Chan\Shaders」フォルダに「PQ_Skin」「PQ_TransBlue」の2つがあるので、同じようにコードを追加して保存する。





 以上で完了。これでエラー表示も消える。

 私は素材も今のところ Free版しか使ってないが、他の素材でも、たまにピンクテクスチャ(テクスチャ抜けとか)とか出ることあるので、同じエラーだったらこの方法で直るかもね。今まではピンク出たら、面倒なのでその素材は捨ててたが、これからは色々試してみよう…。

(※) Unity 4.6.1f2 で確認。


 他にも修正方法はあったので、以下を参照。

(参考) アキバ風Unityマップ素材
(参考) ゼンリンのJapanese Otaku CityをUnityのアセットストアからインポートしたら...



 そう言えばこのパッケージにオリジナルのクエリちゃん飛行コントローラが入ってるね(「ZRNAssets>005339_08932_25_14>Scripts>FlyThroughController.cs」)。以前作った「クエリちゃんを飛行させる!」と違ってやはりスクリプトでアニメーション制御してた(このスクリプトは参考にしてない)。まぁ、私の作ったものはスクリプトとアニメーターでロジック分離してあるので、他のキャラに応用する等に使うといいかも。「ユニティちゃんを飛行させる!」はまさにその例だしね。







(関連記事)
【Unity】【C#】ユニティちゃんを飛行させる!
【Unity】【C#】クエリちゃんを飛行させる!
【Unity】クエリちゃんを動かす!
【Unity】SDクエリちゃんを動かす!
【Unity】【C#】SDクエリちゃんを飛行させる!
【Unity】【C#】SmoothFollow に回転アングルと距離の遠近機能を付けてみる



このコンテンツの一部には『ユニティちゃんライセンス』で許諾されたアセットが使用されています。
Portions of this work are licensed under Unity-Chan License


"Query-Chan model" は Creative Commons Attribution 4.0 International License(CC-BY) に基づいて配布されています。
"Query-Chan model" by Pocket Queries, Inc. is licensed under a Creative Commons Attribution 4.0 International License(CC-BY).



関連記事

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: ユニティちゃん  クエリちゃん  Unityトラブルシューティング  サンプル 
tb: 0   cm: --

【Unity】【C#】クエリちゃんを飛行させる!  


 クエリちゃんにはデフォルトで飛行モーションが入っているのが良いね。せっかくなのでクエリちゃんを空に飛ばしたいと思い、アキバモデルのデモを見ながら、それに近い動きになるようにスクリプトを書いてみた。



※クエリちゃんのモデルのダウンロードからの場合は→こちら。

(※) Unity 4.6.1f2 / Windows8.1(x64) で確認




■クエリちゃん用 飛行移動スクリプト

 ただ、なんとなくだけどアキバモデルのデモは操作とモーションの変化がかなり反応良いので、もしかしたらアニメーションのトランジションはスクリプトで組んでいるのかもね。また上下のモーションが優先的で左右のモーションより強い(同時押ししてみたりすると)。前進速度が無くなるとアイドル(停止)モーション固定になるという感じかな。コードの方がこういう動きは簡単な気がする。

 私はアニメーターで作ってみたが、方向反転する場合、Input.GetAxis()/Input.GetAxisRaw() を使うとどんなに速くキーを操作しても、「上→前→下」のように中間のモーションを経由してしまう。また Input Manager の Gravity や Sensitivity を調整しても思うように「上→下」のように直接遷移してくれない(できなくはないが)。それにプロジェクト毎にInput Managerを調整するのも面倒だし、できればデフォルトで使いたいので、Input.GetKey() を擬似的に GetAxis() のように -1~0~1 の仮想軸の値を返すようなクラスを作ってみた。そしたら単純なアニメーターでもいい感じの動きになった。それになるべくスクリプトとアニメーターでロジックを分離した方が、色々流用もしやすくなるしね。

 また、今回は作るものが複雑になったので、使用したスクリプトやアニメーターをあらかじめ用意した。記事を見ながらやればあっという間にできるだろう。ただ使うだけなら、「■クエリちゃんモデルを飛行させる!」まで読み飛ばしてもいい。

>>サンプルのスクリプトとアニメーターをダウンロード
(Google Drive を利用。画面右上にあるダウンロードアイコンを押す)

●クエリちゃん用 飛行移動スクリプト
using UnityEngine;
using System.Collections;

namespace QueryChan {
/**
* クエリちゃん用 飛行コントローラ
* 2015/3/12 Fantom
*/
[RequireComponent(typeof(CharacterController))]
[RequireComponent(typeof(QueryMechanimController))]
public class QueryFlyingController : 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;

/** QueryMechanimController(Script) キャッシュ */
private QueryMechanimController queryMechanim;

/** Animator キャッシュ */
private Animator animator;

//------------------------------------------------//
//ステート管理用

/** ステートハッシュと QueryChanAnimationType の変換テーブル */
private static Hashtable StateTable = new Hashtable() {
{Animator.StringToHash("Base Layer.Idle"), QueryMechanimController.QueryChanAnimationType.FLY_IDLE},
{Animator.StringToHash("Base Layer.Forward"), QueryMechanimController.QueryChanAnimationType.FLY_STRAIGHT},
{Animator.StringToHash("Base Layer.Left"), QueryMechanimController.QueryChanAnimationType.FLY_TOLEFT},
{Animator.StringToHash("Base Layer.Right"), QueryMechanimController.QueryChanAnimationType.FLY_TORIGHT},
{Animator.StringToHash("Base Layer.Up"), QueryMechanimController.QueryChanAnimationType.FLY_UP},
{Animator.StringToHash("Base Layer.Down"), QueryMechanimController.QueryChanAnimationType.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<QueryMechanimController>();
queryMechanim.ChangeAnimation(QueryMechanimController.QueryChanAnimationType.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((QueryMechanimController.QueryChanAnimationType)StateTable[currentState], false);
} else {
queryMechanim.ChangeAnimation((QueryMechanimController.QueryChanAnimationType)StateTable[defaultState], false);
}
}
}
}
}
}

 上下左右のキー設定を「SerializeField」の「private」スコープにしているが、これはこのスクリプト内では下記の「AxisKey」クラスを使っているためで、ユーザーにカスタム設定させたい場合は「horizontalKey」「verticalKey」を「Start()」の中にあるように「AxisKey」のインスタンスを再設定するメソッドなどを付け加えれば良い。

 「rotationMode」はデフォルトで左右のキーを旋回にしてあるが、false にすれば単純な移動になる。シューティングには false の方がしっくり来るかもしれない。また「speedMin」「speedMax」で前進速度を制限してあるが、同じ値にすれば一定速度のみとなる。「speedMin」を初期値で0以上にしておけば、プレイ開始と同時に前進することになる。

 またクエリちゃんは表情や手(通常、グー、パー)を「QueryMechanimController」でモーションと一緒に切り替えているようだ。そのためモーションを増やす場合には「StateTable」に登録する必要がある。このスクリプトでは「useEmotionAndHandChange = false」にすれば自動的には変化しなくなるようにしてあるが、アニメーションイベント仕様にしたり、自分で設定したい場合も false の方が良いだろう。また最低限の飛行モーションだけなら使わなくても見た目おかしくはないようだ。

 クエリちゃんスクリプトをメニューでまとめるために namespace を「QueryChan」としているが、必要あれば変更するのも良い。



 尚、キー操作には以下のクラスが必要である。汎用的なクラスなので他のものにも使える。

●【汎用】Input.GetKey() で Input.GetAxisRaw() のような仮想軸の値を返すクラス
using UnityEngine;
using System.Collections;

/**
* Input.GetKey() で Input.GetAxisRaw() のような仮想軸の値を返す。
* -1, 0, 1 のみで中間の値はない。
* 2015/3/12 Fantom
*/
public class AxisKey {

/** +1 を返すキー */
public KeyCode positiveKey = KeyCode.UpArrow;

/** -1 を返すキー */
public KeyCode negativeKey = KeyCode.DownArrow;

/** 現在押しっぱなしにされているキー */
private KeyCode holdKey = KeyCode.None;

//------------------------------------------------------//
//コンストラクタ

/**
* キー指定のコンストラクタ
* positiveKey = 1 / negativeKey = -1 となる。
*/
public AxisKey(KeyCode positiveKey, KeyCode negativeKey) {
this.positiveKey = positiveKey;
this.negativeKey = negativeKey;
}

//------------------------------------------------------//

/**
* Input.GetKey() で Input.GetAxisRaw() のような仮想軸の値を返す。
* positiveKey = 1 / negativeKey = -1 / 離したとき or それ以外は 0 を返す。
* Input.GetAxisRaw() は急激に反対のキーを押しても -1→0→1 のように 0 を通過するが、
* この関数は、-1→1 のように 0 を通過しない値を返す。
* 同時押しの場合は、先に押されていた方の値を返す。
*/
public float GetAxis() {
bool positive = Input.GetKey(positiveKey);
bool negative = Input.GetKey(negativeKey);

//同時押しの場合、先に押されていた方を優先する
if (holdKey == positiveKey && positive) {
return 1f; //holdKey は変更なし
}
if (holdKey == negativeKey && negative) {
return -1f; //holdKey は変更なし
}

if (positive) {
holdKey = positiveKey;
return 1f;
}
if (negative) {
holdKey = negativeKey;
return -1f;
}

holdKey = KeyCode.None;
return 0f;
}
}


>>サンプルのスクリプトとアニメーターをダウンロード
(Google Drive を利用。画面右上にあるダウンロードアイコンを押す)




■飛行用アニメーターを作る

※クエリちゃんのモデルのダウンロードからの場合は→こちら。

 次にスクリプトから利用するアニメーターを作ろう。アニメーターとは複数のアニメーションクリップを遷移させるものと考えて良い。(SD)ユニティちゃんのときと違って、クエリちゃんは「face」(表情)レイヤーを使ってないので、新規で作成しても変わらない。アニメーションクリップはスクリプトで判別して遷移することもできるが、アニメーターを使った方がコードを大幅に省けるのでオススメだ。また新しいモーションを加えたりするときも、アニメーターを複製して編集した方が作業がラクになり、流用性も高い。

1.プロジェクトエクスプローラから「Create>Animator Controller」で新規作成する。名前はとりあえず「PQchan_Flying」としておいた。これをダブルクリックして「Animator」タブを開こう。


2.使用するパラメータはスクリプトを見てもわかるが、「Speed」「Horizontal」「Vertical」を「Float」 型で作れば良い。ちなみに「Speed」は前進方向の移動速度、「Horizontal」は左右方向、「Vertical」は上下方向の移動を表している。「Paramters」の横にある「+」ボタンを押して作ろう。



3.次にステートだが、「Idle」(停止)、「Forward」(前進)、「Left」(左移動)、「Right」(右移動)、「Up」(上移動)、「Down」(下移動)の6つを作る。Animator 上で右クリックし「Create State>Empty」で新規作成、名前を付けたら適当に配置する。配置は任意で構わないが、今回は「下←→前←→上」「左←→前←→右」だけでなく、「下←→上」「左←→右」のような遷移もしたいので、上下と左右はなるべく近い方が良いかもしれない。またデフォルトステート(オレンジ色)は「Idle」にしておく。ステート上を右クリックして「Set As Default」で設定できる。



4.ステートを作り終えたら、それぞれにアニメーションクリップを割り当てる。「Idle」をクリックし、インスペクターの「Motion」で「100_Fly_Idle」を選ぶ。「Forward」は「101_Fly_Straight」、「Right」は「102_Fly_toRight」、「Left」は「103_Fly_toLeft」、「Up」は「104_Fly_Up」、「Down」は「105_Fly_Down」にする。それぞれ2種類ずつ入っているが、下に表示される情報を見て、「~_Mechanim.fbx」となっている方を選ぶ。新しく作る場合は基本的にメカニム仕様となっているものを使った方が良い。

●「Idle」のモーション


●「Forward」のモーション


●「Right」のモーション


●「Left」のモーション


●「Up」のモーション


●「Down」のモーション


●ファイル選択は基本的に「~_Mechanim.fbx」の方で



5.各モーションの設定を終えたら、今度はそれぞれの遷移を作っていこう。まずは「Idle」と「Forward」の遷移を作る。停止と前進の条件なので、パラメータは「Speed」を使う。「Speed」が「0.1」より上のとき前進し、「0.1」より下のとき停止とする。ではやってみよう。「Idle」ステートを右クリックし、「Make Transition」で「Forward」へ矢印を伸ばす。「Forward」をクリックして矢印を繋いだら、今度はその矢印をクリックし、インスペクターを表示させる。「Exit Time」を「Speed」に変更したら、条件が「Greater」(より上)になっていることを確認し、値に「0.1」と入れる。これで停止→前進への遷移ができた。

●「Idle→Forward」への遷移


●「Idle→Forward」のインスペクター(遷移条件)



6.今度は逆に「Forward→Idle」の遷移を作る。同じように「Forward」から「Make Transition」で「Idle」に繋いだ後、インスペクターで遷移条件を設定する。「Exit Time」を「Speed」に変更したら、条件を「Less」(より下)にし、値に「0.1」と入れれば、前進←→停止への遷移は完了だ。

●「Forward→Idle」への遷移


●「Forward→Idle」のインスペクター(遷移条件)



7.他の遷移も要領は同じだ。今度は前進から上下のステートの遷移を作ろう。「Forward」から「Make Transition」で「Up」「Down」にも同じように繋いでいく。パラメータは「Vertical」(上下方向)を使えば良い。正の値は上方向、負の値は下方向を表すので、正は「0.1」、負は「-0.1」をしきい値とする。インスペクターで次々と設定していこう。

●「Up←→Forward←→Down」への遷移


●「Forward→Up」のインスペクター(遷移条件)


●「Up→Forward」のインスペクター(遷移条件)


●「Forward→Down」のインスペクター(遷移条件)


●「Down→Forward」のインスペクター(遷移条件)



8.これで「Up←→Forward←→Down」の遷移はできたが、このままではキーを「上→下」「下→上」と急激に反転したとき、「Forward」を通過してしまう。そうなると少し動きがきごちなくなるので、そうならないように「Up←→Down」経由の遷移も作ろう。遷移条件は「Forward」のときと同じとなる。またこの経由を作りたかったので、前述した「AxisKey」というクラスを使っている。具体的に言えば、上から下に急反転したしたとき「1 → -1」となり、下から上に急反転したしたとき「1 → -1」と値が設定される。Input.GetAxisRaw() だと、デフォルト設定では「1 → 0 → -1」「-1 → 0 → 1」となり、前進モーションを経由してしまう。調整しても良いが、できればデフォルトでいい動きになった方が、改造したいときもラクだからだ。

●「Up←→Down」への遷移


●「Down→Up」のインスペクター(遷移条件)


●「Up→Down」のインスペクター(遷移条件)



9.ただこの状態では、まだ直接「Down→Up」「Up→Down」の遷移はしないと思う。というのは遷移条件を考えてみれば当然で、例えば急激に「上→下」キーを動かしたとき、パラメータ「Vertical = -1」となるが、これは「Up→Forward」の遷移条件「Vertical < 0.1」と、「Up→Down」の遷移条件「Vertical < -0.1」の両方に被るからだ。そういうときは遷移の優先順位を付けてやれば良い。やり方は「Up」のステートをクリックし、インスペクターで「Transitions」の順番をドラッグで変える。つまり「Up→Down」を「Up→Forward」より上にする。同じ条件に当てはまる場合、上にあるほど優先順位が高くなると考えて良い。同じように「Down」ステートもインスペクターで「Down→Up」を「Down→Forward」よりも上にしよう(BaseLayer の名前は気にしなくて良い)。

●「Up」のインスペクター(優先順位)


●「Down」のインスペクター(優先順位)



10.考え方は同じで「Left←→Forward←→Right」「Left←→Right」の遷移も作ってみよう。左右の場合はパラメータが「Horizontal」になるだけで、「Horizontal < -0.1」は左へ、「Horizontal > 0.1」は右へ遷移すると考える。設定し終わったら、「Left」「Right」ステートのインスペクターを見て、「Left→Right」「Right→Left」の遷移が「Forward」の遷移より上にすることを忘れないようにしよう。

●「Left←→Forward←→Right」「Left←→Right」への遷移


●「Forward→Left」のインスペクター(遷移条件)


●「Left→Forward」のインスペクター(遷移条件)


●「Forward→Right」のインスペクター(遷移条件)


●「Right→Forward」のインスペクター(遷移条件)


●「Left→Right」のインスペクター(遷移条件)


●「Right→Left」のインスペクター(遷移条件)


●「Left」のインスペクター(優先順位)


●「Right」のインスペクター(優先順位)



11.ここまでで十分いい感じに動くようになったので完成でも良いと思うが、アキバモデルのデモを見ると、移動中でも前進速度が無くなったとき、「Idle」モーションになってるね。とりあえずそれをシミュレートしてみよう。といっても考え方は簡単で「Forward→Idle」の遷移条件「Speed < 0.1」と同じものを各ステートにも追加するだけだ。

●「各ステート→Idle」への遷移


●「Up→Idle」「Down→Idle」「Left→Idle」「Right→Idle」のインスペクター(遷移条件)[※すべて同じ]



12.最後に「Idle」状態から前進+上下左右したとき、各ステートに直接遷移する設定もしておこう。つまり先ほどの逆の動きとなる。遷移条件はすべて「Speed > 0.1」を含む必要があるが、上下左右にはそれに加えて「Horizontal」(左右)、「Vertical」(上下)の条件も含めないといけない。遷移条件の下にある「+」ボタンを押して、条件を2つずつにしよう。また設定し終えたら、「Idle」のステートをクリックし、インスペクターで遷移の優先順位も変えておく。並び順は自分の任意で構わないが、「Idle→Forward」だけは一番下にしておかないと上手く遷移しない。アキバモデルのデモに合わせて、上下を優先、左右を真ん中に置いておいた。まぁ、完全に同じ動きにはならなかったが、全体的にコンパクトで、十分いい動きになったと思う。これでアニメーターは完成だ。

●「Idle→各ステート」への遷移


●「Idle→Up」のインスペクター(遷移条件)


●「Idle→Down」のインスペクター(遷移条件)


●「Idle→Left」のインスペクター(遷移条件)


●「Idle→Right」のインスペクター(遷移条件)


●「Idle」ステートのインスペクター(優先順位)



>>サンプルのスクリプトとアニメーターをダウンロード
(Google Drive を利用。画面右上にあるダウンロードアイコンを押す)



 
■クエリちゃんモデルを飛行させる!

 さてここまで来たらあと一息。必要なものは揃ったので、あとはモデルに組み込むだけだ。空に飛ばすのでシーンは何でも構わないが、床くらいはあった方がわかりやすいので、以前クエリちゃんを歩行させた時のように「Plane」にテクスチャでも貼って、適当に背景でも作ろう。今回はその辺りは割愛して、クエリちゃんを配置する所からはじめる。以前作ったシーンがあれば、[Ctrl - D](Duplicate)で複製して、それを使っても良い。

1.プロジェクトエクスプローラで「PQAssets>Query-Chan>Prefabs」フォルダを開き、「Query-Chan_Locomotion」をヒエラルキーにドラッグ&ドロップしよう。このプレハブは歩行用のものだが、「Query Emotional Controller」(表情)や「Query Mechanim Controller」(モーションや手など)、「Character Controller」(コライダ)などが初めから組み込まれているので採用した。ハロウィンコスやサンタコスでも構わないが、その場合はこれらのコンポーネントを手動で追加する必要がある。



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






3.次いで「Query Locomotion Controller」(歩行用スクリプト)を前述の「Query Flying Controller」(飛行用スクリプト)に入れ替えよう。「Script」の右にある「○」ボタンから選択しても良い。




4.次にアニメーターを設定しよう。ヒエラルキーで「Query-Chan_Locomotion」の▼を開いて、「BodyParts」を選択したら、インスペクターで「Animator>Controller」を「PQchan_Movement」(歩行用)から「PQchan_Flying」(飛行用)に変更する。「PQchan_Flying」は先に作ったアニメーターのことだ。






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






 デフォルトでは[↑][↓]で上昇下降、[←][→]で左右旋回、[Shift](左)で前進加速、[Ctrl](左)で前進減速となっている。「Query Flying Controller」のインスペクターで「Rotation Mode」のチェックを外せば、左右キーはシューティングの様な移動になる。シーンを再生して確かめてみよう。改造はスクリプトの解説を参考にして欲しい。





 以上お疲れ様でした。前述したようにこの飛行コントローラは「ハロウィンコス」や「サンタコス」でも使えます。その場合は「クエリちゃん動かす!」のときのように、「Query Emotional Controller」「Query Mechanim Controller」「Character Controller」などをインスペクターでそっくりコピペすると良いでしょう。ただし、ハロウィンコスやサンタコスには専用の飛行アニメーションクリップはないので、ハロウィンコスはスティックが体を突き抜けたり、サンタコスは履いてない疑惑が暴露(笑)されたりという問題がありますが…(〇〇には見えない下着とか、夢を忘れた人には見えないパ○ツという設定にする手もある(?))。

 また、目パチもしたい人は「クエリちゃんを目パチさせる」も参考にして下さい。









(関連記事)
【Unity】クエリちゃんを動かす!
【Unity】【C#】クエリちゃんを目パチさせる
【Unity】【C#】SDクエリちゃんを飛行させる!
【Unity】【C#】ユニティちゃんを飛行させる!
【Unity】プロ生ちゃんを飛行させる!
【Unity】【C#】SmoothFollow に回転アングルと距離の遠近機能を付けてみる
【Unity】【C#】FPS(フレームレート)をリアルタイムに測定して表示するv2(4隅選択可能で、画面サイズの変更にも対応版)


"Query-Chan model" は Creative Commons Attribution 4.0 International License(CC-BY) に基づいて配布されています。
"Query-Chan model" by Pocket Queries, Inc. is licensed under a Creative Commons Attribution 4.0 International License(CC-BY).



関連記事

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityライブラリ  C#  クエリちゃん  サンプル 
tb: 0   cm: --


プロフィール

Social

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR

▲ Pagetop