【Unity】【C#】クエリちゃんを目パチさせる 
2015/02/27 Fri [edit]
前回クエリちゃんを動かしてみたが、AIアンドロイド(?)とはいえ、やっぱり目パチ(まばたき)させたいと思い、ユニティちゃん付属の「AutoBlinkforSD.cs」を参考にクエリちゃん用目パチスクリプトを作ってみた。
ただ、ユニティちゃんは表情がアニメーションクリップで作成されているが、クエリちゃんはマテリアルで作られているので、仕様そのものの違いから、スクリプト自体も考えなおした。というのはマテリアルを変更して表情を変えるというのは2Dのパラパラアニメと同じようなものなので、Update() でフレーム毎に処理する必要もなく、したがって思い切ってすべてコルーチンに任せるのも良いと考えた。ロジック的にもこの方が簡単だろう。
●クエリちゃん用オート目パチスクリプト(Close→Open 2段階変化)
using UnityEngine;
using System.Collections;
namespace QueryChan {
/**
* クエリちゃん用オート目パチスクリプト
* Close→Open 2段階変化
* 2015/2/27 Fantom
*/
[RequireComponent(typeof(QueryEmotionalController))]
public class QueryChanAutoBlink : MonoBehaviour {
/** オート目パチ有効フラグ */
public bool isActive = true;
//表情のマテリアル(目と口の組み合わせになってるので注意)
/** 開いている目 */
public QueryEmotionalController.QueryChanEmotionalType eyeOpen =
QueryEmotionalController.QueryChanEmotionalType.NORMAL_EYEOPEN_MOUTHCLOSE;
/** 閉じている目 */
public QueryEmotionalController.QueryChanEmotionalType eyeClose =
QueryEmotionalController.QueryChanEmotionalType.NORMAL_EYECLOSE_MOUTHCLOSE;
/** コントローラ(Script)のキャッシュ */
private QueryEmotionalController emotionalController;
/** 目パチ実行中フラグ */
private bool isBlink = false;
/** 目パチ全体の時間(Close→Open までの時間[秒]) */
public float timeBlink = 0.15f;
/** 目パチ全体の時間のゆらぎ時間(0.05 = timeBlink±0.05) */
public float fluctuation = 0.05f;
/** 目パチ発生ランダム判定の閾値(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<QueryEmotionalController>();
//初期化(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;
}
}
}
}
}
使い方は前回のクエリちゃんの状態で、ヒエラルキーでキャラ(「Query-ChanHalloween」)にこのスクリプトを追加するだけだ。表情だけなので、他のコスでも別に構わない。
気をつけて欲しいのはクエリちゃんの表情は目と口が1セットになっているので(「PQAssets>Query-Chan>Textures」のフォルダを参考に)、元の表情が口が開いてても、瞬きしたら口は閉じてしまう点だ(デフォルトの設定の場合)。その場合は、口が開いている表情に切り替える前に、「isActive=false」(目パチ停止)にし、元の表情に戻ったら「Reset()」(初期化)して、「isActive=true」(目パチ再開)などの工夫が必要になるだろう。マテリアルを指す「eyeOpen」「eyeClose」を直接変更する手もあるが、タイミング的に難しいかもしれない。
あとクエリちゃんには半目の状態がないので(掲載時点Ver2.1.0)、開閉2パターンのアニメーションとなる。実は初めはユニティちゃんを参考にそのまま3パターンで作っていた。参考までに掲載しておくが、マテリアルを自作などしない限り、2パターンの方を使った方が楽だろう。また3パターンにすればよりリアルになるかもしれないが、表情の変化にはクエリちゃん付属の「QueryEmotionalController.cs」を利用しているので、このスクリプトにも半目状態の追加・修正が必要になるだろう。
●クエリちゃん用オート目パチスクリプト(Close→HalfClose→Open 3段階変化)[※通常使用は2段階変化で十分]
using UnityEngine;
using System.Collections;
namespace QueryChan {
/**
* クエリちゃん用オート目パチスクリプト
* Close→HalfClose→Open 3段階変化
* 2015/2/27 Fantom
*/
[RequireComponent(typeof(QueryEmotionalController))]
public class QueryChanAutoBlink3Mat : MonoBehaviour {
/** オート目パチ有効フラグ */
public bool isActive = true;
//表情のマテリアル(目と口の組み合わせになってるので注意)
/** 開いている目 */
public QueryEmotionalController.QueryChanEmotionalType eyeOpen =
QueryEmotionalController.QueryChanEmotionalType.NORMAL_EYEOPEN_MOUTHCLOSE;
/** 半分閉じている目(material が無いので、半目=閉目として使っている) */
public QueryEmotionalController.QueryChanEmotionalType eyeHalfClose =
QueryEmotionalController.QueryChanEmotionalType.NORMAL_EYECLOSE_MOUTHCLOSE;
/** 閉じている目 */
public QueryEmotionalController.QueryChanEmotionalType eyeClose =
QueryEmotionalController.QueryChanEmotionalType.NORMAL_EYECLOSE_MOUTHCLOSE;
/** コントローラ(Script)のキャッシュ */
private QueryEmotionalController emotionalController;
/** 目パチ実行中フラグ */
private bool isBlink = false;
/** 目パチ全体の時間(Close→HalfClose→Open までの時間[秒]) */
public float timeBlink = 0.1f;
/** 半目状態の目パチ全体時間からの比率(0.3 = timeBlink の 30%[=7割]を切ったら半目にする[0~1.0]) */
private float halfOpenRate = 0.3f;
/** 目パチ全体の時間のゆらぎ時間(0.05 = timeBlink±0.05) */
public float fluctuation = 0.05f;
/** 目パチ全体の時間のゆらぎ時間ランダム値管理用 */
private float fluctTime;
/** 目パチ発生ランダム判定の閾値(0.3 より上のとき発生[=70%]) */
public float threshold = 0.3f;
/** 目パチ発生ランダム判定実行のインターバル */
public float interval = 3.0f;
/** 目の状態を表すステータス */
enum Status {
Close,
HalfClose,
Open
}
/** 現在の目パチステータス */
private Status eyeStatus = Status.Open;
// Use this for initialization
void Start () {
emotionalController = this.GetComponent<QueryEmotionalController>();
//初期化(Status.Open 前提)
Reset();
//目パチのランダム発生と変化をスタートする
StartCoroutine(RandomChange());
}
/** 状態初期化:目が開いていて[=Status.Open]、瞬きしてない[isBlink=false]状態にする */
public void Reset () {
SetOpenEyes();
isBlink = false;
}
/** 目を閉じている状態にする */
void SetCloseEyes () {
eyeStatus = Status.Close;
emotionalController.ChangeEmotion(eyeClose);
}
/** 目を半分閉じている状態にする */
void SetHalfCloseEyes () {
eyeStatus = Status.HalfClose;
emotionalController.ChangeEmotion(eyeHalfClose);
}
/** 目を開いている状態にする */
void SetOpenEyes () {
eyeStatus = Status.Open;
emotionalController.ChangeEmotion(eyeOpen);
}
/** 目パチのランダム発生と変化[(Open→)Close→HalfClose→Open] */
IEnumerator RandomChange () {
while (true) {
if (isActive) {
if (isBlink) {
switch (eyeStatus) {
case Status.Open: //Open→Close へ
SetCloseEyes();
yield return new WaitForSeconds((timeBlink + fluctTime) * (1f - halfOpenRate));
break;
case Status.Close: //Close→HalfClose へ
SetHalfCloseEyes();
yield return new WaitForSeconds((timeBlink + fluctTime) * halfOpenRate);
break;
case Status.HalfClose: //HalfClose→Open へ(ランダム発生待ち)
SetOpenEyes();
isBlink = false;
yield return null;
break;
}
} else {
//ランダム発生
if (Random.Range(0f, 1f) > threshold) {
isBlink = true;
fluctTime = Random.Range(-fluctuation, fluctuation);
}
yield return new WaitForSeconds(interval);
}
} else {
yield return null;
}
}
}
}
}
クエリちゃんスクリプトをメニューでまとめるために namespace を「QueryChan」としているが、必要あれば変更するのも良いだろう。
(関連記事)
【Unity】クエリちゃんを動かす!
【Unity】【C#】クエリちゃんを飛行させる!
【Unity】SDクエリちゃんを動かす!
【Unity】【C#】SDクエリちゃんを目パチさせる
【Unity】【C#】SDクエリちゃんを飛行させる!
【Unity】【C#】SmoothFollow に回転アングルと距離の遠近機能を付けてみる
【Unity】【C#】FPS(フレームレート)をリアルタイムに測定して表示するv2(4隅選択可能で、画面サイズの変更にも対応版)

【Unity】クエリちゃんを動かす!(Unity4) 
2015/02/22 Sun [edit]
ユニティちゃん同様、わりと自由に使えるモデルのクエリちゃん。AIアンドロイド(?)という設定のようだが、いつも踊っている(笑)。試してみたらコンポーネントはあらかじめ付属されているので、いつものようになるべく手抜きで動かすテスト。
1.まず新しいプロジェクトを作ったら、クエリちゃんのオフィシャルサイト(http://www.query-chan.com/)の「DATA DOWNLOAD」のリンクから AssetStore へ移動して、モデルをインポートする。

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

3.このままだと真っ暗なので、「GameObject」メニューから「Directinal Light」を適当に置く。設定は適当で構わない。

4.次に、クエリちゃんの 3Dモデルを配置する。プロジェクトエクスプローラで「PQAssets>Query-Chan>Prefabs」を開くといくつかモデルが入っているが、実はデフォルトの衣装で良ければ、「Query-Chan_Locomotion.prefab」をヒエラルキーにドラッグ&ドロップするだけで目的は達成してしまう。しかし他にもハロウィンコスやサンタコスも入っているので(掲載時点Ver2.1.0)、せっかくなのでこちらの方を動かしてみよう。今回は「Query-ChanHalloween.prefab」(ハロウィンコス)の方をヒエラルキーにドラッグ&ドロップしてみた(サンタコスでも良い)。


5.移動するにはいくつかコンポーネントが必要だ。それは元々移動できるプレファブ「Query-Chan_Locomotion.prefab」と比較してみればすぐわかる。「Query-Chan_Locomotion」をクリックしてインスペクターを見ると、「Character Controller」と「Query Locomotion Controller(Script)」が必要そうだ。とりあえずこの設定をそのままコピーしよう。インスペクター上で右クリックしてメニューを出し(右上にある歯車アイコンでも良い)、「Copy Component」を実行する。

6.コピーしたら、ヒエラルキーから配置したモデル「Query-ChanHalloween」をクリックし、インスペクターの適当な所(他のコンポーネントの名前のすぐ横あたり)で右クリックメニューから「Paste Component As New」を実行する。これでコンポーネントがそっくりコピペできたハズだ(既にコンポーネントが追加されている場合は「Paste Componet Value」で良い)。

7.「Query Locomotion Controller(Script)」も要領は同じだ。コンポーネントをそっくりコピペして欲しい。これでとりあえず移動に必要なものは追加できた。

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



(※) カメラ追従は「SmoothFollow に回転アングルと距離の遠近機能を付けたもの」を使っても良い。
9.これで動くには動いたが、残念ながらアニメーションしないので、滑ってる感じになってしまう。これは Animator が移動用のものになってないためなので、それを変更するだけで良い。ヒエラルキーから「Query-ChanHalloween」の▼を開いて「BodyParts」をクリックしてインスペクターを見てみよう。そして Animator の「Controller」の設定を「PQchan_AnimController」から「PQchn_Movement」に変更する。これでアニメーションするようになったと思う。めでたく完成だ。


背景が寂しいなら、アキバモデル(Otaku City)を使ってみるのも良いかもね。ただしかなりファイルが巨大になるが…(また、いくつかのテクスチャが抜けてるのでやめた)。Skybox や WebTemplate などの追加はユニティちゃんの時と同じなので、必要あれば参考に。
(関連記事)
【Unity】【C#】クエリちゃんを飛行させる!
【Unity】【C#】クエリちゃんを目パチさせる
【Unity】SDクエリちゃんを動かす!
【Unity】【C#】ユニティちゃんをサクっと簡単に動かす!
【Unity】SDユニティちゃんを動かす!
【Unity】プロ生ちゃんを動かす!
【Unity】SDプロ生ちゃんを動かす!
【Unity】【C#】SmoothFollow に回転アングルと距離の遠近機能を付けてみる
【Unity】【C#】FPS(フレームレート)をリアルタイムに測定して表示するv2(4隅選択可能で、画面サイズの変更にも対応版)
