かかしでもわかるUdonチュートリアル　その２　絶えず回転する直方体

[前回](https://qiita.com/crowley_youtube/items/db598721ebe04da5cfda)から3か月も空いてしまいましたが皆様お元気でしょうか。
2018もついに正式版になりました。需要も上がっていそうなので、さっさと進めてしまいましょう。

## 今回のおしながき
- コンポーネントについて
- コンポーネントのメンバ変数とメソッドの呼び出し
 
# はじめに
前回から3か月も空いてしまったので、SDKを更新しましょう。
[こちら](https://docs.vrchat.com/docs/setting-up-the-sdk)の説明（英文）を（Google翻訳なり英和辞書なりを使って）読んで、**SDK3**をダウンロードしましょう。2ではなく。
新しいプロジェクトを作ってしまうのがいいと思います。

# 復習
前回と同じように、シーンとオブジェクトの準備をします。今回はEmptyではなく**Cube**を作成してください。
![ScreenShot_20200416163737.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571664/e22c1d3f-94e1-55b5-65eb-89a785618dcf.png)

そうしたなら、前回と同様に
**Add Component＞Udon Behavior**でコンポーネントを取り付け、**New Program**、**Open Udon Graph**をクリックしてください。

**親の顔より見ることになる画面**が出てくるはずです。
![1_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571664/e2d27832-eeb3-2547-4bd6-a3a4134de8bb.png)

# 絶えず回転する純白の立方体
今回の内容は[公式チュートリアル](https://ask.vrchat.com/t/spinning-cube-example-series/81)の１，２をもとにしたものです。
まずはこのUdonGraphに、**Add Component＞Fixed Update**と、**Transform Rotate**の２つのノードを追加します。
そしてこれらを図のようにつなぎ、**axis**の値を**0,1,0**、**angle**の値を**1**にします。

![ScreenShot_20200416173345.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571664/98f5ea0f-6038-5dee-7f78-d192793db682.png)

これを実行し、タブを**Scene**に切り替えてみましょう。すると……

![udon.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571664/da84d334-b700-3bf9-7e4f-c17da90f98ba.gif)

回ります。回らなかった人は、ノードをちょっとだけ動かして再コンパイルしてみましょう。
2つのノードについて解説しますと、

- **Fixed Update**
 - **毎フレーム実行**します。処理落ちしている場合も**必ず1秒間辺り既定の回数実行**します。たとえば、昔のシューティングゲームは、FPSが低下すると弾の速度が落ちました。Fixed Updateの場合、処理落ちしているときも弾が遅くなりません（見た目はカクカクになります）。
- **Transform.Rotate**
 - **instance**に指定されたTransformを、**axis**を軸として、**angle**度回転させます（ラジアンではありません）。Transformが何も参照していない場合、このオブジェクトの持つTransformを参照します![ScreenShot_20200416175448.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571664/399d3c32-660a-d6a5-9894-0b0d3a65e6cc.png)
（参照について詳しくは次回説明します。ざっくり言うと、「このオブジェクトを回す」です）。

つまり、今回のUdonGraphは、**「毎フレーム、このオブジェクトを1度回転させる。回転軸はY方向（縦）」**という意味です。

# コンポーネントって何さ
**ここからは少し複雑な概念の話になるので、よくわからなかった場合は読み飛ばして進めてください。そして、気が向いたときに読みに戻ってきてください。**

Transformの値を変更するとオブジェクトの位置、回転、拡縮が変わるのはご存じのとおりですが、これは、オブジェクトが「Transform」という名前の、「3D空間上に位置を持つ」という**要素（コンポーネント）**を持っているからです。

UdonBehaviourを追加したときに、**「Add Component」**というボタンを押しましたが、これは**「要素を追加する」**という意味合いだと思ってください。
たとえば、**Box Collider**を持つオブジェクトは**3D空間上に箱型の当たり判定を持ちます**。
**RigidBody**を持つオブジェクトは**3D物理シミュレーションを行います**。
**Mesh Renderer**と**Mesh Filter**を持つオブジェクトは**3D空間上に描画されます**。![ScreenShot_20200416181927.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571664/b85bd29e-def0-7639-5b1b-074dfc4a0c83.png)


コンポーネントやオブジェクトは**インスタンス（実体）**と言って、**メンバ変数（データ）**と**メソッド（機能）**を持ちます。

Transformは、**Position（位置）**、**Rotation（回転）**、**Scale(拡縮）**などの数値をメンバ変数として保持しています。
Box Colliderは、**IsTrigger（ものに当たったとき、めり込むかめり込まないか）**の真理値（YesかNoかの値のこと、チェックボックスで表されます）や、**Center（当たり判定の位置）**や**Size（当たり判定のサイズ）**をメンバ変数として保持しています（Materialもですが、これは次回やる**参照**に含まれます）。

ゲームオブジェクトは、**Name（名前）**、**ActiveSelf（そのオブジェクトがアクティブかどうか、つまり名前の左のチェックボックス）**、それに**Layer**や**Tag**などのメンバ変数を持っています。


Unityの**Inspector**に表示されてる情報は全部メンバ変数だと思っていただいていいです。Udonでは、これらの値を読み取ったり書き換えたりできます。
また、エディタ上では見えないメンバ変数もあります。
Rigidbodyは、**Velocity（速度）**の数値をメンバ変数として持っています。これもUdonからアクセスできます。


一方メソッドは、今までは見ることが出来ない場所にありました。
Transformは、**Translate（動かす）**や、今回使った**Rotate（回転する）**などのメソッドを持ちます。
RigidBodyは、**AddForce（力を加えて動かす）**や**AddTorque（力を加えて回す）**などのメソッドを持ちます。

Udonではこれらを使えるので、今までできなかったことが出来るようになるわけですね。

# ちょっとだけ変えてみよう
さて、ところで、さっきのUdonGraph、回転軸が縦でしたが、次は横軸、つまり**転がるような回転**をさせてみましょう。
axisの値は、オブジェクトの回転軸、コマで言う棒の部分がどちらに伸びているかを意味します。

今のaxisの値は0,1,0（上向き）だと思います。では、これを1,0,0（右）などにすればいい……

のですが、せっかくなので別の方法を使いましょう。

![ScreenShot_20200416185346.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571664/6a8e24b2-a0e4-9b21-21e4-294da36f359d.png)
**Vector3 get right**で検索すると一番上に出てくるノードをグラフに配置します。これは、「1,0,0」を意味します。入力欄に「1,0,0」と入れるより、あとで**「あ、右向きなんだなあ」**ってわかりやすいので、これが使えるときは積極的に使うことをお勧めします。
当然、**Vector3 get up**なら「0,1,0」を意味しますよ。

そして、これをaxisにつなげば……

![ScreenShot_20200416185528.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571664/9576652a-3311-b71b-2ea1-d1d5149f5209.png)

完成や。**Udon推進式立方体型パンジャンドラム**や。
![Unity-2018.4.14f1-Personal-SampleScene.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571664/d691099d-13da-436d-5f4c-9fb7a211d112.gif)

あ、angleの値を上げると当然そのぶん高速回転します。

# もちろん移動だってできる
そういえば先ほど、
> Transformは、**Translate（動かす）**や、今回使った**Rotate（回転する）**などのメソッドを持ちます。

と言いました。では、実際にTranslateも使ってみましょう。

まあ、基本的にはここまでと同じで、まずFixed Update以外を消し、**Transform Translate**を追加してヌードルをつなぎます。
そして、**translationのY**に0.01くらいの値を入れましょう。

![ScreenShot_20200416190713.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571664/aa765d5a-9a06-623b-a20b-142ae2261adb.png)
###狭すぎて読めねえ！

いや、まあ、ちゃんと値が入ってれば動くんだけどさあ……しょうがないので入力方法を変えましょう、**Transform Translate**の入力ピンの上のドロップダウンから**(float,float,float)**を選び直すと、入力欄が3行になります。
![ScreenShot_20200416191838.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571664/d5863107-b607-db0b-b10b-f1525b8cf0e0.png)
実行すると、こうなるはずです。
![Unity-2018.4.14f1-Personal-SampleScene (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571664/01abc0f7-ba25-1532-0ad8-5c77b63cc4c7.gif)
**フワーッ！**

このとおり、Udon（というかUnityの）プログラムは、メソッドを使って動かしてゆきます（メンバ変数を変更することもできます）。いっぱいあるメソッドを覚えるのは大変ですが、よく使うものだけ覚え、それ以外は[Unity公式リファレンス](https://docs.unity3d.com/ja/2018.4/ScriptReference/index.html)で検索するか、人に聞くのがいいでしょう。

たとえば、前回使った**Debug.log**は、**Debug**というクラス（概念）に含まれる**logというメソッド**です。

# まとめ

- オブジェクトはコンポーネント（要素）を持つ
- オブジェクトやコンポーネントはインスタンス（実体）といい、メンバ変数（データ）とメソッド（機能）を持つ
- メソッドに値を入れて実行ピンを繋ぐと動く
- メソッドの入力ピンの上のドロップダウンから入力の種類を変えられる

今回のポイントは上の４つです。前回も言いましたが、全部一気に理解する必要はないので、「そういうものらしい」となんとなく覚えておいて、そのうえで実際にUdonを打ちながら理解してください。経験が力です。

次回は、ミラーをオンオフするプログラムと、プログラムの肝である変数、避けては通れない難題の型の話をやります。