Edited at

【Unity(C#)】トンネルフェードでVRの酔いを軽減する

  

  

  

この記事は

『プログラミング完全未経験からUnityでの開発現場に迎え入れてもらえた世界一の幸せ者』

の記事です。そのつもりでお読みください。

  


VRの酔い

私自身も毎日デバッグをしてて思うことですが、

VRは本当に酔いやすいです。(個人差はあります)

VR空間内と現実のプレイヤーの体に対するフィードバックが

異なる場合に引き起こりやすいです。

顕著な例を挙げると、ジェットコースターやドライブシミュレータなどです。

[VR空間内]・・・自らの体が移動しているように感じる

[現実]・・・何のフィードバックも受けていない(慣性力を受けていない)

この矛盾が酔いを引き起こします。


トンネルフェード

酔いを軽減する方法の一つに、視野を狭くする方法があります。[参考]

それがトンネルフェードです。(勝手に名付けた)

酔いを軽減しながらちょっとした移動をさせたい場合(自動で移動、回転)に、使えます。

GifCapture-201902100228289347.gif


PostProcessing

UnityのPackageでPostProcessingをImportすれば、

このトンネルフェードを簡単に再現できます。

WindowPackage Managerに進みます。

window_PackageManager.png

PostProcessingInstallです。

PostProcessing.png


設定

カメラにPostProcessLayerPostProcessVolumeをAdd Componetします。

PostProcessLayerの方で警告マークが出ているので、警告通りレイヤーを設定します。

カメラのレイヤーと合わせる必要があります。

PostProcessVolumeの方では、ひとまずProfileの横のNewを押します。

PostProcessingComponent.png

Profileの設定が完了したら、

Add effectunityVignetteの順に進みます。

その後↓の画像のように設定します。

PostProcessing設定後.png

ゲームビューでは多少大げさなぐらいに感じますが、

VRのHMDを通して見た場合(VIVEしか試してませんが...)はこれぐらいがちょうどいいです。

トンネル 大げさ.png

PostProcessVolumeweightのスライダーを動かすと、画面が変わります。


TunnelComponent

けっこう使うので、コンポーネントとして何回でも使いまわせるようにしました。

トンネルの色や、大きさを変えた場合に確認しやすいように、

キーボードのSpaceでトンネル開始、BackSpaceでトンネル解除を可能にしてます。

name spaceにusing UnityEngine.Rendering.PostProcessing;を入れてください

※私が試みた際には、何度かこのname spaceが参照できないとかなんとか言われて非常に困りました。

 原因不明です、再起動とかいろいろしたら直りました、わかる方いたら教えてください。


//CameraにAdd

PostProcessVolume processVolume;

Coroutine coroutine;

[SerializeField]
[Range(0.01f, 0.05f)]
float tunnelSpeed = 0.01f;

void Start()
{
processVolume = this.gameObject.GetComponent<PostProcessVolume>();
}

void Update()
{
//キー押してない間はreturn
if (Input.anyKey == false)
{
return;
}

if(coroutine == null)
{
//テスト用 トンネル開始
if (Input.GetKeyDown(KeyCode.Space) && processVolume.weight == 0)
{
coroutine = StartCoroutine(Tunnel_ON_Coroutine());
}

//テスト用 トンネル解除
if (Input.GetKeyDown(KeyCode.Backspace) && processVolume.weight == 1)
{
coroutine = StartCoroutine(Tunnel_OFF_Coroutine());
}

}

}

//トンネル開始
public void Tunnel_ON()
{
if(processVolume.weight == 0)
{
coroutine = StartCoroutine(Tunnel_ON_Coroutine());
}

}

//トンネル解除
public void Tunnel_OFF()
{
if (processVolume.weight == 1)
{
coroutine = StartCoroutine(Tunnel_OFF_Coroutine());
}

}

IEnumerator Tunnel_ON_Coroutine()
{
while (processVolume.weight < 1)
{
yield return new WaitForSeconds(tunnelSpeed);
processVolume.weight += 0.01f;
}

processVolume.weight = 1;
StopCoroutine(coroutine);
coroutine = null;
}

IEnumerator Tunnel_OFF_Coroutine()
{
while (processVolume.weight > 0)
{
yield return new WaitForSeconds(tunnelSpeed);
processVolume.weight -= 0.01f;
}

processVolume.weight = 0;
StopCoroutine(coroutine);
coroutine = null;
}
}

下記のメソッドをトンネルフェード、オン、オフしたい箇所で呼び出せばOKのはずです。(もう眠たいので試してません)

 //トンネル開始

public void Tunnel_ON()
{
if(processVolume.weight == 0)
{
coroutine = StartCoroutine(Tunnel_ON_Coroutine());
}

}

//トンネル解除
public void Tunnel_OFF()
{
if (processVolume.weight == 1)
{
coroutine = StartCoroutine(Tunnel_OFF_Coroutine());
}

}

家にVIVEほしい。切実に。