ヽ|∵|ゝ(Fantom) の 開発blog? ホーム » Unity »【Unity】【C#】クエリちゃんを目パチさせる

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


 前回クエリちゃんを動かしてみたが、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隅選択可能で、画面サイズの変更にも対応版)


"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: --


トラックバック

トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/167-7f6c8c9c
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR

▲ Pagetop