2016の12月3日の記事です。カジュアルゲーム製作で楽しく覚えよう!」という本が発売されました。本屋でこの本の中身を一通り見て、何故か私は「あ、これスクリプトをNottorusで変換したら10日でNottorus覚えられるんじゃないの」という謎の発想をしてしまったために即購入し、やる気がある内に全部やりました。10日間のうち、作業は6日で終わりました。内2日間は体調不良で倒れて何も出来なかったため、実質4日間です。下記の画像の通り、本に掲載されているスクリプト部分のみNottorusで全て実装しました。どこかで見たことがある素敵なスパゲッティノードも出来ています。スクリプトだけとはいえ中身を全て公開すると著者はもちろん、各業界の方から色々と怒られるので変換する上で初見だと分からなかった所、苦労した部分のみ掲載していきたいと思います。実装時のUnityの環境は5.5.0f1、Nottorusのバージョンは1.1です。演算式Nottorusの検索はブループリントに比べてやや直感的な検索が出来ない(+とか*を入力しても計算式ノードが検出されない)ため、数式に関するノードを覚える必要があります。Node」で行います。左ピンが入力値、右ピンが出力値です。真ん中のプルダウンで記号を選択します。最終的にこのような形になります。最初に出力ピンのAnyTypeにつなげると自動的に入力ピン、出力ピンの型を指定します。入力ピンにつなげても出力ピンの型が自動的に指定されます。一つの入力ピンに数値を入れたい場合は、真ん中の]ボタンを押すと自動的に設定してくれます。比較演算子が選択された時点で該当のピンを自動的にboolに変更します。value」で行います。真ん中のプルダウンで演算子を選択できます。インクリメント、デクリメントは以下の通り、単純なノードです。Valueに接続すれば自動的に型指定されます。このノードで指定するインクリメント、デクリメントは全て後置演算です。以下、スクリプト出力結果です。前置演算は出来ないので注意してください。複合代入を選択するとノードが以下のように変わります。このように接続することで複合代入が可能です。こちらの入力ピンをスクリプトで書くと以下の通りです。Time.deltaTimeとなります。valueの二つを覚えれば、Nottorus上でどんな演算もすることが可能です。GetComponent等のジェネリック関数指定GetComponent<Rigidbody>()などのジェネリック関数指定に対応するノードは少し特殊な操作が必要です。ここではよく使われるGetComponentに限定して説明します。普通にGetComponentノードを表示します。type)となります。GetComponentをよく見ると、出力ピンの上に<0/2>とあります。これはGetComponentは3つのノードパターンがあることを意味しています。この「<」か「>」をクリックするとノードが変わります。1/2で表示されるノードがGetComponentのジェネリック関数になります。あとはTのプルダウンをクリックして型を指定するだけです。出力したスクリプトがちゃんとジェネリック関数になっています。これさえ分かれば、他のジェネリック関数に対応したノードも同じ操作で対応できます。ディレクティブに追加するのも初見ではちょっとわかりにくいです。正確にはNottorusで出力したスクリプトに、新しいusingディレクティブ追加はできないのですが似たようなことはできます。ディレクティブに追加できるnamespaceが出てきます。追加したいnamespaceにチェックを入れると、検索で対応したノードが出てきます。下記の画像はUnityEngin.UIにチェックを入れています。これをやるとTextなどのUIに関するノードが検索されるようになります。キャスト(型変換)とas初めてNottorusを使用する場合、個人的に最大の難易度を誇るのがキャストとasです。いうのもNottorusでキャストかasする場合、このノードだけ他とは違って必ず決まったつなぎ方をしないと思った結果がえられないからです。キャストとasに対応したノードはDataにある「'as'/'(T)'」です。真ん中のプルダウンでキャスト「(T)」かasを選択できます。これを単純に変数へ代入する場合は、入力ピン、出力ピンどちらから接続しても大丈夫です。入力ピンからつなげるとノードがこのように変化します。この状態で2つめのプルダウンを選択すると、何故かこのノードだけ決まった型しか選択できません。Interface以外の状態で選択した場合、出力ピンを対象の入力ピンに接続すると自動的に型変換してくれます。出力ピンから接続しても、同じように動作します。問題は以下の画像のように計算式等、型が決まっていないノードに接続した場合です。これを以下のように入力ピンから接続します。最終のFloatピンに接続しても、AnyTypeのままで型変換されず出力時にエラーが発生します。これを解消したい場合、以下の画像の通り最終的な入力ピンから接続して型を指定してから接続しないといけません。これは初見ではわかりにくいです。ここでかなり苦戦しました。この仕様のせいで一番困ったのが、以下の画像の通りfloatの値をintにキャストして、string文字列に変換する処理です。'as'/'(T)'では型指定が事前に出来ないため、この部分の再現に非常に苦労しました。最終的にやむを得ず、Convert.ToInt32をはさむ以下の形にしました。int→stringピンにつなげても処理が通るのであれば問題ないようです。キャスト、asでもジェネリック関数のように型のプルダウンと同じ選択方法にしなかったのかは疑問です。上記のことに気をつければ、基本直感的に操作できるように作られているので初見でもどうにかなると思います。本に記載されていた通り、製作物の公開が出来ないのが残念ですが個人的にはNottorusの検証が出来ただけでも十分満足です。Nottorusは少しクセの強い部分もありますが、実際に10日以内で一つのゲームが作れたので十分実用に耐えられる素晴らしいアセットです。値段は少し高いですが、もし興味を持ったら購入してUnityでビジュアルスクリプト実装を楽しみましょう。明日はとりすーぷさんによる「ゲーム制作で発生した問題とその解決策みたいなのを適当に羅列」する記事です。2016](http://www.adventar.org/calendars/1585)の12月3日の記事です。カジュアルゲーム製作で楽しく覚えよう!](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日間のうち、作業は6日で終わりました。内2日間は体調不良で倒れて何も出来なかったため、実質4日間です。下記の画像の通り、本に掲載されているスクリプト部分のみ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の検索はブループリントに比べてやや直感的な検索が出来ない(+とか*を入力しても計算式ノードが検出されない)ため、数式に関するノードを覚える必要があります。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)最終的にこのような形になります。最初に出力ピンの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/6a2b3c3e-eac2-5d36-a9e7-6d483ca5d829.png)比較演算子が選択された時点で該当のピンを自動的にboolに変更します。b`そのため、複合代入演算子は別のノードで対応しています。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)こちらの入力ピンをスクリプトで書くと以下の通りです。Time.deltaTime`となります。valueの二つを覚えれば、Nottorus上でどんな演算もすることが可能です。#GetComponent等のジェネリック関数指定`GetComponent<Rigidbody>()`などのジェネリック関数指定に対応するノードは少し特殊な操作が必要です。![image](https://qiita-image-store.s3.amazonaws.com/0/104377/bbed8b3f-aaf5-2a04-e989-7253bcf5b662.png)ここではよく使われるGetComponentに限定して説明します。普通にGetComponentノードを表示します。type)`となります。GetComponentをよく見ると、出力ピンの上に<0/2>とあります。これはGetComponentは3つのノードパターンがあることを意味しています。この「<」か「>」をクリックするとノードが変わります。![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)これさえ分かれば、他のジェネリック関数に対応したノードも同じ操作で対応できます。ディレクティブに追加するのも初見ではちょっとわかりにくいです。正確にはNottorusで出力したスクリプトに、新しい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でビジュアルスクリプト実装を楽しみましょう。明日はとりすーぷさんによる「ゲーム制作で発生した問題とその解決策みたいなのを適当に羅列」する記事です。送信いただいたご意見への返信は行っておりません。お問い合わせください。