Menu
CoddyTech

Vector3は構造体

CoddyのUnityジャーニー「Unityスクリプティングの基礎」セクションの一部。レッスン 22/67。

Vector3 は構造体です。これは、C# の学習では扱わなかった種類の型です。構造体は int のような値型で、代入すると全体がコピーされます。Vector3 b = a; b.x = 9; の後も、b は独立したコピーなので、a.x は変わりません。(クラスの場合は逆で、2 つの変数が同じオブジェクトを参照できます。)

transform.position はプロパティで、読み取ると位置のコピーが返されます。そのため、transform.position.x = 0; としても、すぐに破棄されるコピーが変更されるだけです。C# はこれをコンパイルエラーとして拒否します。error CS1612: Cannot modify the return value of 'Transform.position' because it is not a variable。修正するには、位置をコピーし、そのコピーを変更してから、元に代入し直します。このランナーは Space キーを押すと中央のレーンに戻ります。

if (Input.GetKeyDown(KeyCode.Space))
{
    Vector3 p = transform.position;   // コピーする
    p.x = 0;                          // コピーした値を変更する
    transform.position = p;           // 変更した値を代入し直す
}

最後の行を省略するとコードはコンパイルされますが、何も動きません。変わったのはコピーだけです。transform.localScale や、その他の Vector3 プロパティも同じように動作します。

challenge icon

チャレンジ

簡単

そりは毎秒 fall 単位の速さで落下し、矢印キーで x 軸に沿って移動します。2 行のコードで、そりが床の上(y が 0.5 未満にならない)かつ壁の間(x が -4 から 4 の範囲)にとどまるようにするはずですが、スクリプトがコンパイルできません。

Play を押してエラーを確認します。位置のコピーを使い、2 行のコードが行う処理を維持したまま修正してから、Check を押します。

自分で試してみよう

using UnityEngine;

public class Sled : MonoBehaviour
{
    public float speed = 4f;
    public float fall = 3f;

    void Update()
    {
        float h = Input.GetAxisRaw("Horizontal");
        transform.position += new Vector3(h * speed, -fall, 0) * Time.deltaTime;

        // そりが床の上かつ壁の間に収まるようにする。
        transform.position.y = Mathf.Max(transform.position.y, 0.5f);
        transform.position.x = Mathf.Clamp(transform.position.x, -4f, 4f);
    }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Unityスクリプティングの基礎のすべてのレッスン