「10日で学ぶ Unity5 2Dゲーム入門　カジュアルゲーム製作で楽しく覚えよう！」でNottorusを覚えよう

これは[Unity2 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/unity2)、[東ゲ部 Advent Calendar 2016](http://www.adventar.org/calendars/1585)の12月3日の記事です。

2016年11月21日に株式会社フーモア Unity部から「[10日で学ぶ　Unity5 2Dゲーム入門 カジュアルゲーム製作で楽しく覚えよう！](http://www.mdn.co.jp/di/info/release/50777/)」という本が発売されました。

![imgres.jpg](https://qiita-image-store.s3.amazonaws.com/0/104377/bcca1cfb-a203-72c9-a56a-d055679e7db9.jpeg)

本屋でこの本の中身を一通り見て、何故か私は「あ、これスクリプトをNottorusで変換したら10日でNottorus覚えられるんじゃないの」という謎の発想をしてしまったために即購入し、やる気がある内に全部やりました。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/d9041a80-ca40-206d-2003-00738453c10b.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/d35c2ef4-eefc-a22c-bd3a-ee5ddc0a9b93.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/4b5f0091-0bdd-bc18-bef3-c64c70e841b2.png)


10日間のうち、作業は６日で終わりました。
内２日間は体調不良で倒れて何も出来なかったため、実質４日間です。

下記の画像の通り、本に掲載されているスクリプト部分のみNottorusで全て実装しました。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/fcc09a18-977e-eff5-1665-4c1854abe701.png)

~~どこかで見たことがある~~素敵なスパゲッティノードも出来ています。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/ac6123f2-b868-7f2e-2a8b-c8e3ae36d2fe.png)


さすがにスクリプトだけとはいえ中身を全て公開すると著者はもちろん、各業界の方から色々と怒られるので変換する上で初見だと分からなかった所、苦労した部分のみ掲載していきたいと思います。

実装時のUnityの環境は5.5.0f1、Nottorusのバージョンは1.1です。

#演算式

Nottorusの検索はブループリントに比べてやや直感的な検索が出来ない(+とか*を入力しても計算式ノードが検出されない)ため、数式に関するノードを覚える必要があります。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/f76ceb3c-6544-7fd9-d7b9-926ac28b8644.png)

演算は全てDataの中にある「Math Operations Node」で行います。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/8fcacaa4-c2e4-1a22-505a-99b71018dc00.png)

左ピンが入力値、右ピンが出力値です。
真ん中のプルダウンで記号を選択します。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/c51c993a-d253-b2ff-3f53-d11ece86f795.png)

最終的にこのような形になります。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/fb761171-a753-ec34-0f8f-158ca10117ba.png)

下記の画像の通りに　最初に出力ピンのAnyTypeにつなげると自動的に入力ピン、出力ピンの型を指定します。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/ec177906-e317-0117-bbd7-d34226c065e6.png)

入力ピンにつなげても出力ピンの型が自動的に指定されます。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/260b41c5-037c-439a-4132-466ed2b0c1e4.png)

もう一つの入力ピンに数値を入れたい場合は、真ん中の]ボタンを押すと自動的に設定してくれます。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/d5bdce49-8fc9-dfc1-83c0-461163fc09e0.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/906201f3-4b27-037e-7544-2f6ca975d115.png)

ifでよく使われる比較演算子もMath Operations Nodeです。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/6a2b3c3e-eac2-5d36-a9e7-6d483ca5d829.png)

比較演算子が選択された時点で該当のピンを自動的にboolに変更します。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/2b3a13ba-09f1-44bb-29e9-b2e9353ecc1d.png)

ここにある複合代入演算子、+＝と-＝はMath Operations Nodeでは以下の意味になるので注意が必要です

`(AnyType)c = a += b`
`(AnyType)c = a -= b`

そのため、複合代入演算子は別のノードで対応しています。

#複合代入演算子、インクリメント、デクリメント

複合代入、インクリメント、デクリメント等の特殊な演算はFlow Controlにある「Increment/Decrement value」で行います。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/438007f6-ad52-277d-e35e-108ca9e1705b.png)

真ん中のプルダウンで演算子を選択できます。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/d5f2904e-04cb-06f9-1a92-de5bc2c076f3.png)

インクリメント、デクリメントは以下の通り、単純なノードです。Valueに接続すれば自動的に型指定されます。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/8c3524ca-e939-21a3-967b-fe0afae557e1.png)

このノードで指定するインクリメント、デクリメントは全て**後置演算**です。
以下、スクリプト出力結果です。
![image](https://qiita-image-store.s3.amazonaws.com/0/104377/4a584002-d5d1-5f92-d687-2214fdd49f37.png)

前置演算は出来ないので注意してください。

複合代入を選択するとノードが以下のように変わります。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/edf2d760-0821-4363-1ded-bb94d32c4140.png)

このように接続することで複合代入が可能です。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/d9b6bfca-1eb0-1cfc-f749-9161c4454611.png)

こちらの入力ピンをスクリプトで書くと以下の通りです。

`Value += Parameter Value`

画像のノードをスクリプトであらわすと、`deathTimer += Time.deltaTime`となります。

Math Operations NodeとIncrement/Decrement valueの二つを覚えれば、Nottorus上でどんな演算もすることが可能です。

#GetComponent等のジェネリック関数指定

`GetComponent<Rigidbody>()`などのジェネリック関数指定に対応するノードは少し特殊な操作が必要です。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/bbed8b3f-aaf5-2a04-e989-7253bcf5b662.png)

ここではよく使われるGetComponentに限定して説明します。

まず普通にGetComponentノードを表示します。
![image](https://qiita-image-store.s3.amazonaws.com/0/104377/a2e4be92-2643-7504-996e-57e4b283ab7c.png)

このノードは`GetComponent(Type type)`となります。
GetComponentをよく見ると、出力ピンの上に<0/2>とあります。
これはGetComponentは３つのノードパターンがあることを意味しています。

この「<」か「>」をクリックするとノードが変わります。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/e0db07c8-d7c9-5b46-9810-03b35c596ea4.png)

1/2で表示されるノードがGetComponentのジェネリック関数になります。

あとはTのプルダウンをクリックして型を指定するだけです。
![image](https://qiita-image-store.s3.amazonaws.com/0/104377/15a41a42-5964-4e4e-43f0-b377f2f618b3.png)

検索もあります。
![image](https://qiita-image-store.s3.amazonaws.com/0/104377/e904eda6-291a-194b-7cfa-5fd67e7941c2.png)

出力したスクリプトがちゃんとジェネリック関数になっています。
![image](https://qiita-image-store.s3.amazonaws.com/0/104377/e36244d4-3772-dda5-3df8-7f3fd5fa2115.png)

これさえ分かれば、他のジェネリック関数に対応したノードも同じ操作で対応できます。

#using ディレクティブ追加

using ディレクティブに追加するのも初見ではちょっとわかりにくいです。
正確にはNottorusで出力したスクリプトに、新しいusingディレクティブ追加はできないのですが似たようなことはできます。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/aff39d3f-de1d-e4d6-9b15-e77e8c2754e1.png)

Assembliesのプルダウンをクリックすると、using ディレクティブに追加できるnamespaceが出てきます。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/71c11751-6484-4776-ef9c-86072ce8c63f.png)

追加したいnamespaceにチェックを入れると、検索で対応したノードが出てきます。
下記の画像はUnityEngin.UIにチェックを入れています。これをやるとTextなどのUIに関するノードが検索されるようになります。
![image](https://qiita-image-store.s3.amazonaws.com/0/104377/5a1ecd85-44b8-6960-4d32-a49d20918675.png)

#キャスト(型変換)とas

初めてNottorusを使用する場合、個人的に最大の難易度を誇るのがキャストとasです。
というのもNottorusでキャストかasする場合、このノードだけ他とは違って必ず決まったつなぎ方をしないと思った結果がえられないからです。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/4c15e08f-11e2-8035-0589-4be94bdbfad9.png)

まずキャストとasに対応したノードはDataにある「'as'/'(T)'」です。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/c5fd0fe8-3ed2-a71b-b9c9-e85c91f2e058.png)

真ん中のプルダウンでキャスト「(T)」かasを選択できます。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/ffb722c5-7f46-da73-5942-4cf67bfcd48b.png)

これを単純に変数へ代入する場合は、入力ピン、出力ピンどちらから接続しても大丈夫です。

入力ピンからつなげるとノードがこのように変化します。
![image](https://qiita-image-store.s3.amazonaws.com/0/104377/fcecf659-acde-6bd6-24f1-8a26743d097a.png)

この状態で2つめのプルダウンを選択すると、何故かこのノードだけ決まった型しか選択できません。
![image](https://qiita-image-store.s3.amazonaws.com/0/104377/36e6fe02-db0c-0fb4-7bfb-0a67c8471e7c.png)

Interface以外の状態で選択した場合、出力ピンを対象の入力ピンに接続すると自動的に型変換してくれます。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/bf918f98-d01c-ef37-7ad9-50ebc63ab9f8.png)

出力ピンから接続しても、同じように動作します。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/313c8133-83aa-90c6-3384-f4c746bbf969.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/d5ecba4d-4c99-4c0f-a7d9-14ee16a962d9.png)

問題は以下の画像のように計算式等、型が決まっていないノードに接続した場合です。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/78c81858-f2c1-2b8b-c799-2b0b8d0b554d.png)

これを以下のように入力ピンから接続します。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/deb277eb-8f74-9250-233d-8f73b7be6c7a.png)

最終のFloatピンに接続しても、AnyTypeのままで型変換されず出力時にエラーが発生します。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/3e1ddc2a-78c0-b969-c685-b559a9c2fa24.png)

これを解消したい場合、以下の画像の通り最終的な入力ピンから接続して型を指定してから接続しないといけません。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/a7de994e-1005-853b-903c-41f7109f881c.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/34ba804c-d6e8-e62f-c867-77153186ecac.png)

これは初見ではわかりにくいです。ここでかなり苦戦しました。
この仕様のせいで一番困ったのが、以下の画像の通りfloatの値をintにキャストして、string文字列に変換する処理です。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/25d40d2f-9480-1a99-a859-7a0f77090eab.png)

'as'/'(T)'では型指定が事前に出来ないため、この部分の再現に非常に苦労しました。
最終的にやむを得ず、Convert.ToInt32をはさむ以下の形にしました。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/29184c89-a86e-5b3c-9b8e-9918dcafda05.png)

int→stringピンにつなげても処理が通るのであれば問題ないようです。

キャスト、asでもジェネリック関数のように型のプルダウンと同じ選択方法にしなかったのかは疑問です。

---

上記のことに気をつければ、基本直感的に操作できるように作られているので初見でもどうにかなると思います。
本に記載されていた通り、製作物の公開が出来ないのが残念ですが個人的にはNottorusの検証が出来ただけでも十分満足です。

Nottorusは少しクセの強い部分もありますが、実際に10日以内で一つのゲームが作れたので十分実用に耐えられる素晴らしいアセットです。
値段は少し高いですが、もし興味を持ったら購入してUnityでビジュアルスクリプト実装を楽しみましょう。

明日はとりすーぷさんによる「ゲーム制作で発生した問題とその解決策みたいなのを適当に羅列」する記事です。
楽しみにしています！