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 プロパティも同じように動作します。
チャレンジ
簡単そりは毎秒 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);
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。