【Unity】オブジェクトの向きをスクリプトから取得する方法

オブジェクトの向きの取得 Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「オブジェクトの向きを取得する方法が知りたい!」

「オブジェクトの向きに合わせて処理を行いたい!」

というお悩みの方に向けた内容となっています。

Unityでは、現在のオブジェクトの向きをスクリプトから取得することができます。

オブジェクトの向きを取得する場合は、Transformコンポーネントの中で用意されている「forward」「right」「up」の3つの変数を使うことで、取得することができます。

このオブジェクトの向きを取得しておくことで、オブジェクトの向きに合わせた移動処理を行ったり発射処理を行うということが容易にできるようになります。

そこで、このページでは、Unityでスクリプトからオブジェクトの向きを取得する方法についてまとめていきます。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

オブジェクトの向きを取得する方法

それでは、Unityでオブジェクトの向きを取得する方法について紹介していきます。

オブジェクトの向きはベクトルで取得できる

まずオブジェクトの向きとは、そのオブジェクトにおける前後左右および上下の向きのことを指しています。

Unityでは、このそれぞれの向きを長さ1のベクトルとして取得することができます。

例えば、オブジェクトに対して右向きのベクトルや、

オブジェクトに対して上向きのベクトルを取得することができます。

また、この向きのベクトルを取得して、そのベクトルに力をかけ合わせることで、オブジェクトを指定した向きに移動させたりすることができるようになります。

オブジェクトの向きの取得方法

オブジェクトの向きを取得する場合は、Transformコンポーネントから以下の3つの変数を使って取得することができます。

  • Transform.forward ⇒ オブジェクトの前後の向き
  • Transform.right ⇒ オブジェクトの左右の向き
  • Transform.up ⇒ オブジェクトの上下の向き

Transform.forward(前後の向き)

オブジェクトの前後の向きを取得する場合は、Transformコンポーネントのforwardの変数から取得することができます。

シーン内に配置しているオブジェクトを選択した際に、青色の矢印(Z軸)が表示されている方向がオブジェクトの前方の向き、その反対方向がオブジェクトの後方の向きになります。

forwardを使うと、前方の向きに対して長さ1のベクトルを取得することができ、また負の符号(-)を付けてあげることで、後方の向きのベクトルを取得することができます。

例えば、配置しているオブジェクトに対して、以下のスクリプトをアタッチしてオブジェクトの前後の向きをコンソールウィンドウに表示させてみると、

using UnityEngine;

public class Test : MonoBehaviour
{
    void Start()
    {
        Vector3 front = transform.forward;  // オブジェクトの前向きのベクトルを取得
        Vector3 back = -transform.forward;  // オブジェクトの後ろ向きのベクトルを取得

        Debug.Log("前方の向きのベクトルは" + front);
        Debug.Log("後方の向きのベクトルは" + back);
    }
}

以下のように、前後の向きのベクトルを取得できているのが分かります。

Transform.right(左右の向き)

オブジェクトの左右の向きを取得する場合は、Transformコンポーネントのrightの変数から取得することができます。

オブジェクトの左右の向きは、赤色の矢印(X軸)が表示されている方向が右向きとなり、その反対方向が左向きとなります。

rightを使うと、右の向きに対して長さ1のベクトルを取得することができ、また負の符号(-)を付けてあげることで、左の向きのベクトルを取得することができます。

例えば、以下のスクリプトをアタッチしてオブジェクトの左右の向きをコンソールウィンドウに表示させてみると、

using UnityEngine;

public class Test : MonoBehaviour
{
    void Start()
    {
        Vector3 right = transform.right;  // オブジェクトの右向きのベクトルを取得
        Vector3 left = -transform.right;  // オブジェクトの左向きのベクトルを取得

        Debug.Log("右向きのベクトルは" + right);
        Debug.Log("左向きのベクトルは" + left);
    }
}

以下のように、左右の向きのベクトルを取得できているのが分かります。

Transform.up(上下の向き)

オブジェクトの上下の向きを取得する場合は、Transformコンポーネントのupの変数から取得することができます。

オブジェクトの上下の向きは、緑色の矢印(Y軸)が表示されている方向が上向きとなり、その反対方向が下向きとなります。

upを使うと、上の向きに対して長さ1のベクトルを取得することができ、また負の符号(-)を付けてあげることで、下の向きのベクトルを取得することができます。

例えば、以下のスクリプトをアタッチしてオブジェクトの上下の向きをコンソールウィンドウに表示させてみると、

using UnityEngine;

public class Test : MonoBehaviour
{
    void Start()
    {
        Vector3 top = transform.up;  // オブジェクトの上向きのベクトルを取得
        Vector3 bottom = -transform.up;  // オブジェクトの下向きのベクトルを取得

        Debug.Log("上向きのベクトルは" + top);
        Debug.Log("下向きのベクトルは" + bottom);
    }
}

以下のように、上下の向きのベクトルを取得できているのが分かります。

オブジェクトの向きを取得した移動処理

オブジェクトの向きを取得することで、オブジェクトの移動処理に活用することができます。

例えば、Rigidbodyの付いたオブジェクトの左右の移動処理を作りたい場合は、

using UnityEngine;

public class Test : MonoBehaviour
{
    Rigidbody rb;
    float force = 150f; // 移動で加える力を定義

    void Start()
    {
        rb = GetComponent<Rigidbody>(); // Rigidbodyコンポーネントを取得
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.D))
        {
            rb.AddForce(transform.right * force);   // 右向きの移動処理
        }
        else if (Input.GetKeyDown(KeyCode.A))
        {
            rb.AddForce(-transform.right * force);  // 左向きの移動処理
        }
    }
}

17行目と21行目の「Transform.right」で取得した左右の向きのベクトルに対して、AddForceメソッドで力をかけ合わせることでその向きに力を与えることができ、移動させることができます。

また、オブジェクトに対してジャンプする処理を作りたい場合は、

using UnityEngine;

public class Test : MonoBehaviour
{
    Rigidbody rb;
    float jumpForce = 300f; // ジャンプで加える力を定義

    void Start()
    {
        rb = GetComponent<Rigidbody>(); // Rigidbodyコンポーネントを取得
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space) && transform.position.y < 0.85f)
        {
            rb.AddForce(transform.up * jumpForce);  // 上向きのジャンプ処理
        }
    }
}

17行目の「Transform.up」で取得した上向きのベクトルに対して、同じくAddForceメソッドを使ってあげることで、上に力を加えてジャンプ処理を作ることができます。

このようにオブジェクトの向きを取得することで、様々な処理を作ることができます。

なお、オブジェクトが回転すると、ベクトルの向きが変わることになるので、移動処理などを記述する際は、オブジェクトが回転しないようにFreeze Rotationを使っておくとよいかもしれません。

まとめ

このページでは、Unityでオブジェクトの向きを取得する方法についてまとめていきましたが、いかがでしたでしょうか?

オブジェクトの向きを取得する場合は、Transformコンポーネントを使って、「forward」「right」「up」の3つから、ベクトルを取得することができます。

このベクトルに対して、AddForceメソッドなどを使ってあげることで、その向きに対して力が加わるようになります。

オブジェクトの移動処理やジャンプ処理などで使うことができるので、覚えておきましょう。

最後までお読みいただきまして、ありがとうございました!

コメント