//tips
//VR酔
パソコンからデータをアップロードするためにoculusをいじっている中で、新しくリリースされたアプリもダウンロードして、いくつかやってみた。
その中で、視覚に頼るVR体験で発生するデメリットを感じたので記載していく。
VRアプリの種類は以前よりも豊富になり、アバターの視点で、アバターになりきって操作できるものも出てきていた。
このアバターの操作方法が曲者で、VRデバイスを被って、体を動かさないまま、左右のVRコントローラでアバターを回転運動させ視点を変えていると、ひどいVR酔に襲われるのである。
これは乗り物酔いなどと同じく、視覚情報と耳の三半規管の情報を脳が取得して、回転運動を知覚しているにもかかわらず、VRの一人称運動とリアルの操作者の運動状態にギャップができ、視覚と三半規管の情報の整合性が取れず、脳が混乱して、ひどく酔った状態になるのである。
現状ではVRの世界の体の動きとリアルの自分の動きを連動させることで、そのデメリットを隠しているが、屋内でVRデバイスを被って動き回るのは、VRデバイスの重さや家具との衝突などの問題からかなり不便である。
VRの一つの理想系とされている、VRのキャラクター目線で様々な運動を行うには、この視覚情報と三半規管の情報ギャップを解決しなければならないように感じる。
VRデバイスに脳への情報伝達を書き換える電波装置を組み込むか、薬により、違和感をなくすのか、視覚情報に頼らず、目を閉じたまま思考で操作できるようになるのかなどができないと、VR酔の苦痛に耐えてまで使用する一般ユーザーは少ないように思われる。
VRデバイスの醍醐味が現れるこの分野でVR酔という壁があることは、ゲームなどのエンターテイメントを目的とするVRデバイス普及にはかなりのマイナスであることが窺える。PCの方が便利に快適にできるので。
VRアプリを制作する際も、どのデバイス向けアプリなのかを事前に定義しておくことが重要になりそう。ひとまずVRデバイスを用いた使用用途よりもPCやスマフォを利用するVRコンテンツ制作に軸足をおくことにする。
//Ethanに人工知能を与える
VRデバイスへの出力に拘らず、VRコンテンツの作成を進めていく。
今回はEthanをAI搭載のキャラクターとして運用していく。これはAI付きのEthanがstandard assetsのprefabに組み込まれているので、シーンにドロップするだけで良い。
ここからは、AIに付随する、どのように動くかを決めるNavMeshAgentと、歩いていく先を決めるAICharacterControlスクリプトを調整していくことになる。
まずは空オブジェクトでwalktargetを作成。それをEthanのインスペクター内にあるAICharacterControlのtargetにドロップ。
これにより向かう方向は指定できたが、指示を行わないとEthanはまだ動くことはできない。
動くことができる地表をNavMeshで定義する必要がある。
定義に含めたい、地面と四角と丸のインスペクターからstaticにチェックを入れ、選択されたオブジェクトがナビメッシュのベーキング処理に含まれるようにする。
window→AI→Navigationで表示されるインスペクターのBake項目でBakeボタンをクリックする。
するとNavMeshでとして定義された部分が青色表示される。
これでEthanを動かしてみる。
ここからさらにEthanをランダムに動かしていく方法を考えていく。
Ethanの動きはAICharacterControlのtargetにより定められるので、targetにスクリプトを追加することでEthanの動きを不規則にしていく。
WalkTargetに下記のスクリプトを追加した。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RandomPosition : MonoBehaviour
{
void Start()
{
StartCoroutine(RePositionWithDelay());
}
IEnumerator RePositionWithDelay()
{
while (true)
{
SetRandomPosition();
yield return new WaitForSeconds(1);
}
}
void SetRandomPosition()
{
float x = Random.Range(-5.0f, 5.0f);
float z = Random.Range(-5.0f, 5.0f);
Debug.Log("X,Z:" + x.ToString("F2") + "," + z.ToString("F2"));
transform.position = new Vector3(x, 0.0f, z);
}
}
Random.Rangeの範囲はplaneの大きさが10×10であるからこの値に設定しており、SetRandomPositionでtargetの位置のランダム生成、RePositionWithDelayでwhile (true)、つまり、ゲームが実行され続ける限り、ターゲット位置のランダム生成とWaitForSecondsで指定された移動可能秒数での移動をループさせ続ける。
Ethanの動きの動きが早すぎるのでもう少し遅くしてみる。
EthanインスペクターのNavMeshAgentのsteeringの値(speed, angular speed,acceleration)を調整できる。