目次
1.スクリプトを作成する
2.オブジェクトが回転する処理を書く
3.動作確認する
4.解説
5.ちょっとスクリプトを改変する
?.おまけ(deltaTimeについて)
VCCバージョン2.1.3、Unityバージョン2019.4時の状況で解説してます。
VCCの大規模アプデやSDK3→SDK4とかにならない限り大して変わらないと思います。
大きな変更あったら書き直します。
Udon Sharpの準備がまだの人は下記の記事を参考に下準備をしてみてください。
常日頃アバター改変をしている皆さんなら数分でできると思います。(分からない箇所あったらコメントしてください。気づいたら返します。)
1.スクリプトを作成する
Projectウィンドウで右クリック
→Create
→U# Script
を選択してください。
エクスプローラーが開きます。今回はファイル名はMoveObject
にしましょう。
保存を押して数秒待つとProjectウィンドウの中にMoveObject
という名前のファイルが2つ作成されていたらOKです。
2.オブジェクトが回転する処理を書く
2つある内、下の方のMoveObject
をダブルクリックで開きます。
中身はこうなっているはずです。
using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
using VRC.Udon;
public class MoveObject : UdonSharpBehaviour
{
void Start()
{
}
}
ここにオブジェクトを回転させる処理をぶち込んでいきます。
コピペで構いません。解説は後程。
using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
using VRC.Udon;
public class MoveObject : UdonSharpBehaviour
{
// 最初の一回だけ実行される
void Start()
{
}
// 毎フレーム実行される
private void Update()
{
// このオブジェクトをY軸回転させる
this.gameObject.transform.Rotate(0, 1, 0);
}
}
書き終わったら、Ctrl + Sキー
で内容を保存しましょう。絶対です。癖付けてください。
保存がおわったらUnityに戻ります。
数秒間硬直しますが問題ないです。待ちましょう。
3.動作確認する
回転させるオブジェクトを設置する
ヒエラルキーで右クリック
→3D Object
→Cube
でキューブを設置しましょう。
書いた処理をキューブに反映させる
Cube
を選択してインスペクターを確認します。
画像の赤枠で囲っている、Add Component
を押して、検索欄にUdon
と入れるとUdon Behaviuor
が出てくるので選択しましょう。
CubeのインスペクターにUdon Behaviour (Script)
が追加されました。
Projectウィンドウにあるもう一つのMoveObject
を、Udon Behaviour
のProgram Source
にドラッグ&ドロップでアタッチしましょう。
再生ボタンを押すと、キューブがY軸で回転し続けることが確認できると思います。
4.解説
コピペした内容を簡単に説明にしたいと思います。
// 毎フレーム実行される
private void Update()
{
// このオブジェクトをY軸回転させる
this.gameObject.transform.Rotate(0, 1, 0);
}
Update()の下にある{}内に書かれた内容は、毎フレーム実行されます。
transform.Rotate()は、X,Y,Z軸によりそのオブジェクトを回転させることができます。
つまり、Z軸で回転させたければ
// このオブジェクトをZ軸回転させる
this.gameObject.transform.Rotate(0, 0, 1);
逆回転させたかったらマイナスの値を入れます。
// このオブジェクトをZ軸回転させる
this.gameObject.transform.Rotate(0, 0, -1);
ちなみに、Rotate()はローカル軸を使って回転します。
ワールド軸で回転させたい人は「Unity Transform Rotate World軸」とかで検索かけてください。
transformには回転だけじゃなく移動できる関数もあります。
次の項目で追加してみます。
5.ちょっとスクリプトを改変する
回転に合わせて前進させる
追加するコードは1行です。
// 毎フレーム実行される
private void Update()
{
// このオブジェクトをY軸回転させる
this.gameObject.transform.Rotate(0, 1, 0);
// このオブジェクトを前進させる
this.gameObject.transform.Translate(0, 0, 0.1f);
}
小数点以下が含まれる値を入れる時は、値の最後にf
を入れます。
この値がfloat型であることをPCに教えてあげる必要がある為です。
詳しい説明は難しいので省きますが、どうしても気になる人は「float double 違い」などで検索してみてください。
Rotateと同じくTranslateもローカル軸で動くので、ちゃんと動けば 回転→前進→回転→前進→...と繰り返します。
コピペができたら、Ctrl + S
で保存してUnityに戻りましょう。癖付けてください。
実行してキューブが床の上をグルグルと回っていればOKです!
動かすオブジェクトを増やしたり、値を入れ替えてみたりして遊んでみてください。
今回の内容がもっと気になる人は、「Unity Transform」とかで検索したら収穫があるかも。
?.おまけ
Time.deltaTime
「4.解説」で、Update()の内容は毎フレーム
実行されると説明しました。
つまりVRC上で、60F出ているプレイヤーと30Fしか出ていないプレイヤーではUpdate()の実行数が違うので、オブジェクトの動くスピードに倍近くの差がうまれます。
これはあまりよろしくないです。
以下のような書き方をすることで、FPSに差があっても同じような動きをさせることができます。
// このオブジェクトをY軸回転させる
this.gameObject.transform.Rotate(0, 1 * Time.deltaTime, 0);
// このオブジェクトを前進させる
this.gameObject.transform.Translate(0, 0, 0.1f * Time.deltaTime);
このままコピペして実行すると、さきほどと比べてオブジェクトの動きがゆっっくりになりますが正常です。
数字とTime.deltatimeの間にある*
は掛け算を表しています。
角度と何かの時間を掛けた結果でオブジェクトを動かしています。
ではTime.deltaTime
とは何の時間かというと、前のフレームから今のフレームまでにかかった時間です。
FPSが低いほど、前のフレームから今のフレームまでにかかった時間は大きくなっていくので、その時間で計算してあげればFPSによる動作の違いを埋めることができます。