前回から3か月も空いてしまいましたが皆様お元気でしょうか。
2018もついに正式版になりました。需要も上がっていそうなので、さっさと進めてしまいましょう。
今回のおしながき
- コンポーネントについて
- コンポーネントのメンバ変数とメソッドの呼び出し
はじめに
前回から3か月も空いてしまったので、SDKを更新しましょう。
こちらの説明(英文)を(Google翻訳なり英和辞書なりを使って)読んで、SDK3をダウンロードしましょう。2ではなく。
新しいプロジェクトを作ってしまうのがいいと思います。
復習
前回と同じように、シーンとオブジェクトの準備をします。今回はEmptyではなくCubeを作成してください。
そうしたなら、前回と同様に
Add Component>Udon Behaviorでコンポーネントを取り付け、New Program、Open Udon Graphをクリックしてください。
絶えず回転する純白の立方体
今回の内容は公式チュートリアルの1,2をもとにしたものです。
まずはこのUdonGraphに、Add Component>Fixed Updateと、Transform Rotateの2つのノードを追加します。
そしてこれらを図のようにつなぎ、axisの値を0,1,0、angleの値を1にします。
これを実行し、タブをSceneに切り替えてみましょう。すると……
回ります。回らなかった人は、ノードをちょっとだけ動かして再コンパイルしてみましょう。
2つのノードについて解説しますと、
- Fixed Update
- 毎フレーム実行します。処理落ちしている場合も必ず1秒間辺り既定の回数実行します。たとえば、昔のシューティングゲームは、FPSが低下すると弾の速度が落ちました。Fixed Updateの場合、処理落ちしているときも弾が遅くなりません(見た目はカクカクになります)。
- Transform.Rotate
-
instanceに指定されたTransformを、axisを軸として、angle度回転させます(ラジアンではありません)。Transformが何も参照していない場合、このオブジェクトの持つTransformを参照します
(参照について詳しくは次回説明します。ざっくり言うと、「このオブジェクトを回す」です)。
つまり、今回のUdonGraphは、**「毎フレーム、このオブジェクトを1度回転させる。回転軸はY方向(縦)」**という意味です。
コンポーネントって何さ
ここからは少し複雑な概念の話になるので、よくわからなかった場合は読み飛ばして進めてください。そして、気が向いたときに読みに戻ってきてください。
Transformの値を変更するとオブジェクトの位置、回転、拡縮が変わるのはご存じのとおりですが、これは、オブジェクトが「Transform」という名前の、「3D空間上に位置を持つ」という**要素(コンポーネント)**を持っているからです。
UdonBehaviourを追加したときに、「Add Component」というボタンを押しましたが、これは「要素を追加する」という意味合いだと思ってください。
たとえば、Box Colliderを持つオブジェクトは3D空間上に箱型の当たり判定を持ちます。
RigidBodyを持つオブジェクトは3D物理シミュレーションを行います。
Mesh RendererとMesh Filterを持つオブジェクトは3D空間上に描画されます。
コンポーネントやオブジェクトは**インスタンス(実体)**と言って、**メンバ変数(データ)とメソッド(機能)**を持ちます。
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(右)などにすればいい……
のですが、せっかくなので別の方法を使いましょう。
Vector3 get rightで検索すると一番上に出てくるノードをグラフに配置します。これは、「1,0,0」を意味します。入力欄に「1,0,0」と入れるより、あとで**「あ、右向きなんだなあ」**ってわかりやすいので、これが使えるときは積極的に使うことをお勧めします。
当然、Vector3 get upなら「0,1,0」を意味しますよ。
そして、これをaxisにつなげば……
あ、angleの値を上げると当然そのぶん高速回転します。
もちろん移動だってできる
そういえば先ほど、
Transformは、**Translate(動かす)や、今回使ったRotate(回転する)**などのメソッドを持ちます。
と言いました。では、実際にTranslateも使ってみましょう。
まあ、基本的にはここまでと同じで、まずFixed Update以外を消し、Transform Translateを追加してヌードルをつなぎます。
そして、translationのYに0.01くらいの値を入れましょう。
いや、まあ、ちゃんと値が入ってれば動くんだけどさあ……しょうがないので入力方法を変えましょう、Transform Translateの入力ピンの上のドロップダウンから**(float,float,float)**を選び直すと、入力欄が3行になります。
実行すると、こうなるはずです。
フワーッ!
このとおり、Udon(というかUnityの)プログラムは、メソッドを使って動かしてゆきます(メンバ変数を変更することもできます)。いっぱいあるメソッドを覚えるのは大変ですが、よく使うものだけ覚え、それ以外はUnity公式リファレンスで検索するか、人に聞くのがいいでしょう。
たとえば、前回使ったDebug.logは、Debugというクラス(概念)に含まれるlogというメソッドです。
まとめ
- オブジェクトはコンポーネント(要素)を持つ
- オブジェクトやコンポーネントはインスタンス(実体)といい、メンバ変数(データ)とメソッド(機能)を持つ
- メソッドに値を入れて実行ピンを繋ぐと動く
- メソッドの入力ピンの上のドロップダウンから入力の種類を変えられる
今回のポイントは上の4つです。前回も言いましたが、全部一気に理解する必要はないので、「そういうものらしい」となんとなく覚えておいて、そのうえで実際にUdonを打ちながら理解してください。経験が力です。
次回は、ミラーをオンオフするプログラムと、プログラムの肝である変数、避けては通れない難題の型の話をやります。