STYLYでVR湯婆婆を実装してみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/fc57a62a-218c-c72b-357a-0994ac83b288.png)
※ 湯婆婆の画像は [スタジオジブリのサイト](http://www.ghibli.jp/works/chihiro/) で配布されているものを使用しています。

この記事は、 [湯婆婆 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/yubaba) の6日目です。
前日は、 @everylittle さんの [Emacs Lispで湯婆婆を実装してみる](https://qiita.com/everylittle/items/e2221795d9f28c8794ed) でした。

# はじめに

最近流行ってる [Javaで湯婆婆を実装してみる](https://qiita.com/Nemesis/items/c7192a7c510788d2cba2) をVRでやってみました。

たぶん、 **視聴機材は湯婆婆史上一番高額** だと思います。



# 視聴方法

完成品はこちらです！VRゴーグルをお持ちの方は、 [STYLYをインストール](https://styly.cc/ja/download/) してご覧になってください。

[湯婆婆VR](https://gallery.styly.cc/scene/72bcdfdb-334e-4f25-b6c6-0b71632d3f70)

VRゴーグルをお持ちでない方でも、PCがあればWebブラウザで見れるので、是非ご覧になってください！



## 契約書だよ。そこに名前を書きな。

VR空間に入ると以下の図のようなテキストボックスが浮かんでいます。VR用のコントローラーでテキストボックスを選択すると英字キーボードが空中に現れるので、名前を入力してください。

**残念ながら英数字しか入力できない仕様です。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/f6c84011-5f06-0938-177c-f2c05a22a969.png)



## 贅沢な名だねぇ。

テキストボックスの右側にある `記` を選択すると、下にメッセージが出ます！

新しい名前は入力された英数字の中からランダムで一文字選ばれます！

残念ながら日本語が入力できないので、新しい名前は必ず英数字一文字になります！

![image-20201117221034467.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/d760688f-e276-010a-63f0-60e72e372d16.png)


# 解説

主に以下の技術を使っています。

- STYLY : VR空間の作成・公開
- Unity : テキストボックス等のGUI部品の作成
- PlayMaker : 名前生成アルゴリズムの作成



## STYLYとは？

STYLYはVR・ARの空間を作成・共有できるプラットフォームです。お手軽にVR空間が作れます。詳しくは [STYLY公式ページ](https://styly.cc/ja/) をご覧ください。

湯婆婆のような文字列の加工処理をSTYLY上でやる場合、PlayMakerというものが必要になるので、それも使います。PlayMakerについて、詳しくはこちらをご覧ください。

[【Unity入門】Playmakerを使った初めてのゲーム作り 概要とインストール](https://styly.cc/ja/tips/unity-playmaker-game-beginner-1/#PlayMaker-4)



## PlayMakerアルゴリズム

以下の図のように、4段階の状態遷移で実現しました。

- `InitState` : 初期化処理です。結果のパネルを非表示にします。 `START` をトリガーにします。

- `ScanName` : テキストボックスから名前を取得する処理です。ボタンクリックをトリガーにします。
- `MakeNewName` : 新しい名前を生成する処理です。 `ScanName` の `FINISHED` がトリガーです。
- `PrintNewName` : 新しい名前を表示する処理です。 `MakeNewName` の `FINISHED` がトリガーです。



### InitState

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/34481a3f-658c-20b1-60a8-bec145dc9eab.png)

VRシーンが起動した直後に、結果のパネルは表示されてほしくないので、 `Activate Game Object` の `Activate` のチェックボックスをOFFにしておきます。



### ScanName

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/0d7ce8b3-1e27-f16f-65f3-db6d644819e0.png)

`記` ボタンがクリックされると、こちらが発火します。

テキストボックスはUnityの `InputField` で実装しており、ここでは、 `UI Input Field Get Text` でその値を取得し、変数 `name` に代入します。



### MakeNewName

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/d79f38d9-17a5-b060-0ea8-371d4bc7d2b9.png)

次に、変数 `name` の文字数を `Get String Length` で数え、変数 `nameLength` に代入します。

`Random Int` で `0` ～ `nameLength` の整数をランダムで生成し、変数 `newNameIndex` に代入します。ここで `Inclusive Max` のチェックボックスをOFFにしておきます。（後工程で不正なインデックス参照が発生してしまう可能性を排除するためです。）

`Get Substring` で変数 `name` の中から `newNameIndex` 番目の文字を取り出し、変数 `newName` に代入します。

これで、新しい名前が生成できました！



### PrintNewName

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/79c1df00-d77a-191c-88bf-9ce682c45179.png)

`Activate Game Object` で非表示状態にしていた結果パネルを表示状態に切り替えます。

`Build String` で `name` や `newName` を結合して文章を生成し、 `UI Text Set Text` で出力します！



## クラッシュ湯婆婆の再現

名無しでボタンをクリックすると、

```
フン。というのかい。贅沢な名だねぇ。
今からお前の名前はだ。いいかい、だよ。分かったら返事をするんだ、!!
```

という感じになり、とくにクラッシュしません！残念！



## 感想

PlayMakerのようなビジュアルスクリプティングでも湯婆婆を実現できることがわかって嬉しかったです。



## 追記：湯婆婆ARも作ってみた

同じ要領でAR版も作ってみました。

スマートフォンをお持ちの方は、 [STYLY Mobile をインストール](https://styly.cc/ja/mobile/) してから、以下のリンク先に表示されたQRコードを読み込んでみてください。

[湯婆婆AR](https://gallery.styly.cc/scene/528e799e-b0ed-468a-ba07-87b91a6f4ca8)

以下のように、ARで湯婆婆を見れます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/819523d2-2d02-6e88-3ac5-6ce653e57408.png)

そして、 **スマホだとなぜか日本語入力ができます！**