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 プロパティも同じように動作します。
チャレンジ
簡単そりのスクリプトをコンパイルできるようにして、床の上にとどまり、壁の間から出ないようにしましょう。
transform.position.yと.xを設定する2行を、次のコピーに置き換えます:Vector3 p = transform.position;。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プレイグラウンド