Tips

UnityのVector3について勘違いしていたこと

UnityのVector3について勘違いしていたこと

UnityのVector3について勘違いしていたこと


今回はコラム的な内容となります。
私自身がUnityのVector3構造体について勘違いしていたことについて書き綴っておきます。
[Unity_317×90]

Vector3構造体では、3次元座標系における各次元の成分を(X, Y, Z)としてベクトルを表現することができ、
Transformのpositionや、RigidbodyのvelocityなどUnity内の様々な個所で用いられています。

そしてこのTransform.positionなどは、以下のように各成分を直接変更することはできません。

1
2
3
4
5
6
7
8
void Start() {
    transform.position.x = 3.0f;        // ← コンパイルエラーとなる
    transform.position.y = 4.0f;        // ← コンパイルエラーとなる
    transform.position.z = 5.0f;        // ← コンパイルエラーとなる
 
    Debug.Log(transform.position.x);    // Readは可
 
}

Unity始めたての頃に、この仕様に引っかかった人も多いのではないでしょうか。
読み込みはできるのに、変更はできないのかよ!…的な感じで。

ちなみにこの場合、正攻法の例としては

1
2
3
void Start() {
    transform.position = new Vector3(3.0f, 4.0f, 5.0f);
}

上記の様に new キーワードを使用して、新たにVector3の構造体を生成すると同時に各成分に値をセットします。
一般の書籍でもこの記述を一番よく見かける気がします。

ここまで学習した段階で私は、「ああ、Vector3の各成分は直接変更できないんだな~」と思いました。
つい先日までずっとそう信じてました。(3人くらいに言っちゃった気もします。)

ええ、勘違いでした。

勘違いに気づいたきっかけは、Unity関連の記事で見かけた以下のような記述です。

1
2
3
4
5
6
7
8
9
void Start() {
    Vector3 myPositon;
 
    myPositon.x = 3.0f;
    myPositon.y = 4.0f;
    myPositon.z = 5.0f;
 
    transform.position = myPositon;
}

これを見たとき「コンパイルエラーになるんじゃ・・・?」と思いましたが、問題ないんですねコレ。
結構な衝撃でしたが、これを知らなかったから何か損をしていたかというと、別に。なのでいいのですが。

結論
Vector3の各成分は直接変更できる!
※ただし、コンポーネント内で使用されているVector3型はその限りではない!

以上、勘違いの話でした。

ゲーム制作関連のオススメ連載リンク

とっても手軽なゲーム制作体験!
Unityゲーム開発基礎

実際のリリースゲームを題材にしたハンズオンゲーム制作連載
実践unityゲーム開発

Recent News

Recent Tips

Tag Search