1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

U#でオブジェクトを動かす

Last updated at Posted at 2023-10-04

目次
1.スクリプトを作成する
2.オブジェクトが回転する処理を書く
3.動作確認する
4.解説
5.ちょっとスクリプトを改変する
?.おまけ(deltaTimeについて)

VCCバージョン2.1.3、Unityバージョン2019.4時の状況で解説してます。
VCCの大規模アプデやSDK3→SDK4とかにならない限り大して変わらないと思います。
大きな変更あったら書き直します。

Udon Sharpの準備がまだの人は下記の記事を参考に下準備をしてみてください。
常日頃アバター改変をしている皆さんなら数分でできると思います。(分からない箇所あったらコメントしてください。気づいたら返します。)

1.スクリプトを作成する

Projectウィンドウで右クリックCreateU# Scriptを選択してください。
U#Create.png
エクスプローラーが開きます。今回はファイル名はMoveObjectにしましょう。
image.png
保存を押して数秒待つとProjectウィンドウの中にMoveObjectという名前のファイルが2つ作成されていたらOKです。
image.png

2.オブジェクトが回転する処理を書く

2つある内、下の方のMoveObjectをダブルクリックで開きます。

中身はこうなっているはずです。

MoveObject.cs
using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
using VRC.Udon;

public class MoveObject : UdonSharpBehaviour
{
    void Start()
    {
        
    }
}

ここにオブジェクトを回転させる処理をぶち込んでいきます。
コピペで構いません。解説は後程。

MoveObject.cs
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 ObjectCubeでキューブを設置しましょう。
image.png

書いた処理をキューブに反映させる

Cubeを選択してインスペクターを確認します。
AddComponent.png
画像の赤枠で囲っている、Add Componentを押して、検索欄にUdonと入れるとUdon Behaviuorが出てくるので選択しましょう。
image.png
CubeのインスペクターにUdon Behaviour (Script)が追加されました。
Projectウィンドウにあるもう一つのMoveObjectを、Udon BehaviourProgram Sourceにドラッグ&ドロップでアタッチしましょう。
ScriptAtach.png
再生ボタンを押すと、キューブが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による動作の違いを埋めることができます。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?