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

  • 10
    いいね
  • 0
    コメント

これはUnity2 Advent Calendar 2016東ゲ部 Advent Calendar 2016の12月3日の記事です。

2016年11月21日に株式会社フーモア Unity部から「10日で学ぶ Unity5 2Dゲーム入門 カジュアルゲーム製作で楽しく覚えよう!」という本が発売されました。

imgres.jpg

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

image

image

image

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

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

image

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

image

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

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

演算式

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

image

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

image

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

image

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

image

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

image

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

image

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

image

image

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

image

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

image

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

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

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

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

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

image

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

image

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

image

このノードで指定するインクリメント、デクリメントは全て後置演算です。
以下、スクリプト出力結果です。
image

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

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

image

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

image

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

Value += Parameter Value

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

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

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

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

image

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

まず普通にGetComponentノードを表示します。
image

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

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

image

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

あとはTのプルダウンをクリックして型を指定するだけです。
image

検索もあります。
image

出力したスクリプトがちゃんとジェネリック関数になっています。
image

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

using ディレクティブ追加

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

image

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

image

追加したいnamespaceにチェックを入れると、検索で対応したノードが出てきます。
下記の画像はUnityEngin.UIにチェックを入れています。これをやるとTextなどのUIに関するノードが検索されるようになります。
image

キャスト(型変換)とas

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

image

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

image

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

image

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

入力ピンからつなげるとノードがこのように変化します。
image

この状態で2つめのプルダウンを選択すると、何故かこのノードだけ決まった型しか選択できません。
image

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

image

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

image

image

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

image

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

image

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

image

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

image

image

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

image

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

image

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

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


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

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

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