Menu
CoddyTech

Vector3は構造体

CoddyのUnityジャーニー「Unityスクリプトの基礎」セクションの一部。レッスン 29/85。

Vector3 は構造体です。これは、まだ学んでいない種類の型です。構造体は int のような値です。代入すると、その全体がコピーされます。Vector3 b = a; b.x = 9; の後も、b は別個のコピーなので、a.x は変わりません。(クラスでは逆に、2つの変数が1つの共有オブジェクトを参照できます。)

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

チャレンジ

簡単

そりのスクリプトをコンパイルできるようにして、床の上にとどまり、壁の間から出ないようにしましょう。

  1. transform.position.y と .x を設定する2行を、次のコピーに置き換えます:Vector3 p = transform.position;。
  2. p.y = Mathf.Max(p.y, 0.5f); と p.x = Mathf.Clamp(p.x, -4f, 4f); を設定し、次に transform.position = p; とします。

「プレイ」を押します。そりが床に着地し、壁がそりを止めます。その後、「確認」を押します。

自分で試してみよう

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);
    }
}

Unityスクリプトの基礎のすべてのレッスン

自分で練習してみよう: Unityプレイグラウンド