【DOTS】Havok Physicsを使ってみよ～

# 記事の環境
- Unity 2019.3.0f6
- Unity Hub 2.3.2
- Havok Physics for Unity 0.2.2
- Unity Physics 0.3.2
- Hybrid Renderer 0.4.0

##諸注意
この記事はUnityの[公式ガイド](https://docs.unity3d.com/Packages/com.havok.physics@0.2/manual/quickstart.html)に沿って書いてます。
わしは公式がええんじゃ！！という方は公式ガイドを推奨します。

#Havok Physicsって？？
アイルランドにあるHavok社が開発を行っている物理エンジンで、モバイルからコンシューマー、PCまで様々なタイトルで多数の採用実績があります。
現在はMicrosoftの傘下だそう。



そんな超有名物理エンジンがUnityで採用されることになったんだからやるしかねぇ！！ということでやっていきます。

#[ミッション１] 公式のGitからサンプルコードを入手せよ！
1. [こ↑こ↓をクリック](https://github.com/Unity-Technologies/EntityComponentSystemSamples/)
- **Clone or download**をクリック
- **Download ZIP**をクリック

#[ミッション２]解凍してUnity Hubに追加せよ！
1. 先ほどダウンロードしたZipファイルを任意のフォルダに解凍
2. Unity Hubを起動
3. **リストに追加**をクリック
4. 先ほど解凍したフォルダの中にある**UnityPhysicsSamples**というフォルダをクリックして、フォルダの選択をクリック
5. 初期バージョンがない人は任意のUnityバージョンを指定(本記事ではUnity2019.3.0f1が無かったため3.0f6にアップグレードしました)

#[ミッション３]Havok Physicsをプロジェクトに追加せよ！
1. Unity Hubからプロジェクトをクリック(開くまで待つべし！待つべし！)
2. **Window > Package Manager**の順でクリックしてPackage Managerを開く
3. **Advanced > Show preview packages**の順でクリックしてプレビューパッケージを表示するように
4. 検索欄に**Havok**と入力
5. 出てくる**Havok Physics for Unity**を選択して右下の**Install**をクリック(インストールできるまで待つべし！待つべし！)

#[ミッション４]まずはUnity Physicsを体感せよ！
1. **Assets / Tests / Pyramids**の中にある**Pyramids**シーンをクリック
2. Hierarchyビューの**Physics Scene Basic Elements**にある**Main Camera**のTransformを変更<br>![カメラ位置とかの説明](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293529/e34c925c-178b-c8aa-9eef-77535f0a7b20.png)
3. できたら実行してみよう！<br>※一番最初の実行時はちょっと重くなる可能性あるので、重かったら一旦止めてもう一回実行してみて下さい。<br>![UnityPhysicsMovie.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293529/ad90ad5b-8881-d66d-0af8-4f0422eb1532.gif)<br>
ふむ。。。<br>
特になんも力を加えてないのにピラミッドが崩れてしまった。。。。<br>
※なんか赤い部分がチラチラ見えますがエンコが上手く行かなかったようで、、、実際は赤くないですｗ

#[ミッション５]Havok Physicsを体感せよ！
1. Hierarchyビューの**Physics Scene Basic Elements**にある**Physics Settings**をクリック
2. そのオブジェクトにくっ付いてる**Physics Step**コンポーネントにある**Simulation Type**をUnity Physicsから**Havok Physics**に変更<br>![Havok_physics選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293529/abac2e88-d720-5186-05df-8e5f66b26cdd.png)
3. できたら実行！！<br>![HavokPhysicsMovie.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293529/19f41776-216d-30fe-1ef4-e3de066de84a.gif)<br>
今度は触ってない時ちゃんとピラミッドは形を保っていますね。<br>
さすが**Havok Physics**！！<br>
20年以上に渡る歴史は伊達じゃないです。<br>
密になってるオブジェクトの山からブロックを引き抜く動作も見事に出来てます。(ジェンガとか作れそう)<br><br>
※追記 2020/05/30 **[作ってみました。](https://twitter.com/suittizihou/status/1267003480247463939?s=20)**<br>
[Gitリポジトリも置いておきます。](https://github.com/suittizihou/Unity-Dots-Test/tree/master)

#あとがき
いかがだったでしょうか？
個人的にはなかなか感動しましたｗ
こういうサンプルは他にもいっぱいあって、気になる方は**Assets / LoaderScene**フォルダにある**LoaderScene**シーンファイルを実行してみて下さい。
ここから全サンプルへ飛ぶことが出来ます。
物理エンジンとしてのクオリティがどえりゃぁたけぇHavok Physicsですが将来的には有償での提供になるそうな。。？
Unity Physicsは物理エンジンとしての精度はHavok Physicsに劣りますが、ステートレス物理演算なことや100%C#で記述されたオープンソースなエンジンであること。
また無償で使用できることなどこの辺りでHavok Physicsと差別化を図っていくのではないかと思います。

#参考文献
- [DOTS ベースのプロジェクト向け Unity Physics/Havok Physics](https://unity.com/ja/unity/physics#unity-physics)

- [Quick start guide for Havok Physics](https://docs.unity3d.com/Packages/com.havok.physics@0.1/manual/quickstart.html)

- [(GitHub)EntityComponentSystemSamples](https://github.com/Unity-Technologies/EntityComponentSystemSamples/)

- [UnityがHavokとの提携を発表。軽量で扱いやすい物理エンジン「Unity Physics」と「Havok Physics」をUnityに導入へ](https://automaton-media.com/articles/newsjp/20190319-87672/)

- [Unity partners with Havok to roll out new physics systems](https://www.gamasutra.com/view/news/338719/Unity_partners_with_Havok_to_roll_out_new_physics_systems.php)

- [たのしいDOTS〜初級から上級まで〜 - Unite Tokyo 2019](https://www.youtube.com/watch?v=ydHbtssCrMw&t=1861s)

- [Leveraging DOTS-powered physics - Unity at GDC 2019](https://www.youtube.com/watch?v=yuqM-Z-NauU&t=234s)