はじめに
デスノートの死神の目を再現したAndroidアプリをUnityで開発しました.記事はこちら.画面をタッチされたらMicrosoft AzureのFaceAPIにデータを送って年齢推定し,結果が返ってきたら年齢を表示するのですが,どうしてもタッチしてから結果が返ってくるまでにラグがあります.初めて使う人に「え,何も起きないじゃん」と思わせてしまうとよくないので,その間になにか演出を入れようと思いました.
そこで,以前から使ってみたかったPostProcessingを試してみることにしました.Lens Distortionを使えば目で覗き込んでいる感じが出せるのではと思い,以下のような演出を加えました.
実装
PostProcessingをスクリプトから制御する
PostProcessingを利用するための設定はこちらの記事を参考にさせていただきました.
タッチされたらゆっくり歪ませ,結果が返ってきたらゆっくり元に戻したいので,PostProcessingのパラメータをスクリプトで制御する必要があります.
VolumeやらLayerやらSettingやらややこしいですが,制御方法はここに書いてありました.
エフェクトをゆっくり変化させる
パラメータの取得ができたので,次にそれをなめらかにゆっくり変化させます.今回はLens DistortionのIntensityをMathf.SmoothDamp()を使って変化させました.
_distortion.intensity.value = Mathf.SmoothDamp(_distortion.intensity.value, 100f, ref _currentIntensity, 0.2f);
第4引数のsmoothTimeの単位がよくわからないので,体感で2秒くらいになるよう調整した結果0.2fになりました.ご存知の方おられたら教えていただきたいです.
SmoothDampは呼ばれるたびに少しずつ値を変化させるので,「画面タッチされたらエフェクトをゆっくり変化させる」といった場合,以下のように書くと一瞬しか変化しません.
void Update(){
if(タッチされた){
_distortion.intensity.value = Mathf.SmoothDamp(_distortion.intensity.value, 100f, ref _currentIntensity, 0.2f);
}
}
したがって,タッチされたら結果が返ってくるまでフラグを立てて,変化し切るまでSmoothDampを呼び続ける必要があります.
void Update(){
if (タッチされた) {
_distortion.intensity.value = Mathf.SmoothDamp(_distortion.intensity.value, 100f, ref _currentIntensity, 0.2f);
_isWaiting = true;
SendToFaceApi(); //FaceAPIにデータ送信.結果が返ってきたら_isWaitingを下ろす
}
if (_isWaiting) { //結果待ち中
_distortion.intensity.value = Mathf.SmoothDamp(_distortion.intensity.value, 100f, ref _currentIntensity, 0.2f);
}
}
結果が返ってきたら,今度はゆっくり元に戻します.
_distortion.intensity.value = SmoothDamp(_distortion.intensity.value, 0f, ref _currentIntensity, 0.2f);
終わりに
PostProcessingやMathf.SmoothDamp()は初めて使ったので難しかったですが,おかげでそれっぽい演出を追加できました.ただ,人に体験してもらうと「なにこれ?」って感じになってしまい,また歪んでる時間が結構長いため「歪ませて終わり?」と不安になってる人もいました.このあたりのUXについても勉強していきたいですね.