【Playmaker】STYLYアドベントカレンダーに参加しました！

## はじめに
久しぶりの投稿です！
実は現在Psychic VR Labにてアルバイトとして社会勉強をさせていただいておりますyamatoです。

まだまだできないこと、知らないことばかりで勉強の日々ですが、同じチームとして普段ともに行動しているF●ma先輩から
ある日こんなことを言われました。

「Playmakerって触ったことある?」

え。。
Play...maker...??
無いです。。

と言ったら嘲笑するような冷たい視線を向けられました。(嘘)

何よ、、！そんな冷たい視線をしなくたっていいじゃない、、
なら触ってみようじゃないの！！！！！！！

ということで今回のSTYLYアドベントカレンダーにて初めてPlaymakerに挑戦してみました！という記事です!

※STYLYとはPsychic VR Labが開発している、XRプラットフォームです↓
※PlaymakerとはSTYLY上で体験の流れを作ったり、ゲームのような仕組みを作る際に使われるノードベースのビジュアルスクリプティングツールです。

https://gallery.styly.cc/about/ja

## 成果物

Playmakerの練習ということで、まずは超簡単なものから作っていこうと思いました。
簡単なゲームくらいは、JSやUnityのC#で作ったことがあったので、
ランダムに発生
プレイヤーを動かす
当たり判定
くらいあれば、何かしらゲーム性のあるものが作れるのではと思いました。

で、何を思ったか、クリスマスも近いし、
「クリスマスムードの中カップルをよけるゲーム」
にしようと思いました。
リア充爆発しろなんて不謹慎なことを思ってはいけないのです。クリスマスの道はカップルにあけてあげて、邪魔をしないようにするのが吉です。きっと。

なので、カップルがランダムに歩いてきて、当たってしまったらゲームオーバーという超単純なゲームを作りました。

(ちなみに大変申し訳ございませんが今回のアドベントカレンダーにはこちらの実装がSTYLYにうまく移行できなかったので、現在はとりあえずで作ったカオスなクリスマスワールドになっております。)



## Playmakerの実装
### 敵をランダムに発生させる
まずはこのカップルをランダムに発生させるところを簡単に見てみます。
「enemySpawner」という空のゲームオブジェクトを作成して、そこに発生の仕組みをつけ、発生させるオブジェクトに「Couple」を指定することにします。
(enemySpawnerとか言ってカップルを敵対視してるわけでは無いです決して！)

enemySpawnerのFSMはこんな感じ
![スクリーンショット 2023-12-08 13.09.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2635943/d1ec8714-8613-ce5f-c240-26d149b5afce.png)

![スクリーンショット 2023-12-08 13.12.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2635943/9778d841-e534-6f47-ae61-906650d2a4a1.png)

ランダムに発生させるために「Random Float」Actionで乱数を作ります。
今回上下の動きは特に無いので、二つの乱数をそれぞれx,zとして作成。
「Set Vector3 XYZ」アクションで位置をセットします。
このX,Zに先ほど作ったx,zの変数を入れることで、x軸,z軸それぞれランダムに敵...ではなくカップルを出現させることができるわけですね！

![スクリーンショット 2023-12-08 13.08.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2635943/62aae4e2-8648-114e-1cb0-cee8adca12c1.png)

ちなみに「Couple」オブジェクトは、「Controller Simple Move」というActionで前に進む実装をしています。

### プレイヤーコントロール
![スクリーンショット 2023-12-08 13.13.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2635943/a97b8a7f-fd31-06a7-4831-4cf9428dbefe.png)

![スクリーンショット 2023-12-08 13.13.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2635943/eaf569ac-cda3-86de-7588-16efdbf3fd53.png)

プレイヤーのコントロールは「Get Axis」のHorizontal(矢印キーでinputできるやつ)を使って動かしていたのですが、よくよく考えたらSTYLYに載せることを考えたら良くない体験設計で反省です。。
UIで矢印ボタン作るとかがいいのかな？

Float OperatorのFloat1とFloat2では、
「inputHotizontal」(Get Axisで入力された分) * 3 (任意の数字でOK)がmoveSpeedという変数に格納されています。
このmoveSpeedがPlayerの動く大きさになるので、Float2の数字を大きくするとより速く移動するようになります。

### 当たり判定

![スクリーンショット 2023-12-08 13.14.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2635943/df0f9219-bc37-7451-b450-e20a1a8e9bdd.png)

当たり判定もPlayerのFMS内で実装しています。
今回は「Hit」というステートを作っていて、ステートを右クリックして
Add Global Transition > System Events > TRIGGER ENTERで
「指定のオブジェクトのコライダーが入ったら(衝突したら)」というイベントを作成することができます。
コライダーが衝突したら、「Hit」ステートにステートが移り、その対象オブジェクトのタグを判定していて、
そのタグが「Enemy」だったら、「Die」ステートに移るという感じです。
今回「Couple」オブジェクトには「Enemy」タグをつけているので、カップルに当たったらDie、つまり終了、ということですね！


## 感想
今回初めて触りましたが、Playmaker...なかなか苦戦しました！！笑
なぜ苦戦したかというと、情報量がC#スクリプトより少ないからです。
例えば、こんなアクションしたいなと思った時に、スクリプトだったら調べたら大体自分がやりたいことに近づけるけれど、PlaymakerだとどのようなActionを追加したらいいか、行き着くまでにちょっと時間がかかってしまったんですよね。。
そして、スクリプトが書けなくてもプログラミングできるー！と言って舐めてかかると痛い目見るくらい、やはり論理的思考は大事になってくるなと。。
ただ、使うアクションの種類や場面が染み付いてきたら、速く効率的にプロダクトを作ることができそうです！

点数表示や秒数制限等、もっとゲーム要素を足したいなと思いましたので、これからも隙をみて勉強しようと思います！

それではみなさま！！
Merry Christmas！！！

ちなみにカップルに道をあけるとかいうゲームを作りましたがかくいう私は非リアではありませ(銃声