HoloLensで超人になる。リアルタイムVFX Realistic Explosions Pack #アセットアドカレ

この記事は Unity Assets Advent Calendar 2016 11日目の記事になります。

HoloLensは現実にプライベートな電脳空間を展開できる最高にクールなデバイスです。

という前振りとは関係ないこちらをご覧ください。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Action Movie Kid - Volume 01 <a href="https://t.co/IG3uhItqYw">https://t.co/IG3uhItqYw</a></p>&mdash; ゆーじ (@yuujii) <a href="https://twitter.com/yuujii/status/810468786440699904">2016年12月18日</a></blockquote>


それではさっくりと実現しましょう。

まずはこの爆破エフェクトを自在に出せるようになりましょう。

## Realistic Explosions Pack 1.0.0.0 (Sep 26, 2016)
[![image](https://qiita-image-store.s3.amazonaws.com/0/32347/b6d9f859-ff4e-cdf2-241e-3c0dc01fbea4.png)](https://www.assetstore.unity3d.com/jp/#!/content/54783)

使うスキルはエフェクトアセットでいつも大変お世話になっておりますな[kripto289](https://www.assetstore.unity3d.com/jp/#!/search/page=1/sortby=popularity/query=publisher:5224)さんの[Realistic Explosions Pack](https://www.assetstore.unity3d.com/jp/#!/content/54783)です。

## いつものHoloLensプロジェクトの仕込みを行う
- Windows PlatformにSwitch
- PlayerSettingsからVirtual Reality SupportedでWindows Holographic
- PlayerSettingsからCapabilitiesのSpatialPerceptionをON
- シーンのMain CameraのTransformをReset
- シーンのMain CameraのCameraをこんな感じに
  ![image](https://qiita-image-store.s3.amazonaws.com/0/32347/32518f93-ec80-b834-19d5-87cee1db1094.png)
- シーンに空のManagerオブジェクトを作成
- 爆破する壁とか床の空間認識(SpatialMapping)を実現するために、SpatialMappingColliderコンポーネントと、SpatialMappingRendererコンポーネントをManagerオブジェクトにアタッチする。


## 爆破スキルを習得する

シーンに追加したManagerオブジェクトへ下のスクリプトをアタッチ。
スクリプトではAir-TapでRealistic Explosions Packから習得したい爆破スキルのPrefabをインスタンテイト。発動は自分の見ている場所、空間認識で壁や床と認識した面をGazeManagerで使っている。


```csharp:SpawnEffect.cs
using UnityEngine;
using UnityEngine.VR.WSA.Input;
using HoloToolkit.Unity;

[RequireComponent(typeof(GazeManager))]
public class SpawnEffect : MonoBehaviour
{
	GestureRecognizer recognizer;
	
	public GameObject effect;
	public float DistanceFromCollision = 0.01f;
	
	void Start()
	{
		recognizer = new GestureRecognizer();
		recognizer.SetRecognizableGestures(GestureSettings.Tap);
		recognizer.TappedEvent += Recognizer_TappedEvent;
		recognizer.StartCapturingGestures();
	}
	
	void OnDestroy()
	{
		recognizer.TappedEvent -= Recognizer_TappedEvent;
	}
	
	private void Recognizer_TappedEvent(InteractionSourceKind source, int tapCount, Ray headRay)
	{
		OnTap();
	}
	
	void LateUpdate()
	{
 #if UNITY_EDITOR
		if (Input.GetMouseButtonDown(1))
		{
			OnTap();
		}
 #endif
	}
	private void OnTap()
	{
		var prefab = GameObject.Instantiate(effect);
		prefab.transform.position = GazeManager.Instance.Position + GazeManager.Instance.Normal * DistanceFromCollision;
		prefab.transform.up = GazeManager.Instance.Normal;
	}
}
```

## ついでに空間音響も使ってみる

なんと発動スキル(=Prefab)には盛大な効果音も含まれています。
せっかくなのであまり注目はされていませんが実は超凄いHoloLensの空間音響も有効にしてみましょう。

参考
> Spatial sound
https://developer.microsoft.com/en-us/windows/holographic/spatial_sound

### AudioSettings
- Spatializer PluginをMS HRTF Spatializerへ

### AudioSource
- SpatializeをON
- Spatial Blendを1(3D)
- Volume RolloffをCustom Rolloff
![image](https://qiita-image-store.s3.amazonaws.com/0/32347/c2b79222-3c8e-0b13-ff31-7ef377edc4a7.png)


## 完成

![file.jpg](https://qiita-image-store.s3.amazonaws.com/0/32347/3bf781e4-4006-4c0a-ba0b-06e957610fa9.jpeg)