【Unity】ScratchのブロックをUnityで再現しよう~動き⑤~

もし端に着いたら、跳ね返る ScratchからUnityへ
もし端に着いたら、跳ね返る

Scratch のブロックを Unity で再現するときに、どのような方法があるのかを紹介していきます。

ScratchのブロックをUnityで再現しよう

もし端に着いたら、跳ね返る

Scratch の「もし端に着いたら、跳ね返る」ブロックを Unity で作ってみましょう。

もし端に着いたら、跳ね返る
もし端に着いたら、跳ね返る

準備

「動き④」と同様に三角形を配置してMoveTriangleスクリプトを用意します。

x座標を10ずつ変える

それでは、MoveTriangleコンポーネントに C#プログラムを記述して、座標を動かしてみましょう。
座標の設定と更新をまとめて作成していきます。
プログラムを作成後、画面上部の再生ボタンを押すと、三角形が右上に動いていきます。

using UnityEngine;

public class MoveTriangle : MonoBehaviour {
    private float m_fMoveSpeedX = 1.5f;
    private float m_fMoveSpeedY = 1f;

    private void Start() {
        float fScreenPosX = 100f;
        float fScreenPosY = 50f;
        float fScreenPosZ = transform.position.z - Camera.main.transform.position.z;
        Vector3 vecWorldPos = Camera.main.ScreenToWorldPoint(new Vector3(fScreenPosX, fScreenPosY, fScreenPosZ));
        transform.position = vecWorldPos;
    }

    private void Update() {
        Vector3 vecWorldPos = transform.position;
        vecWorldPos.x += m_fMoveSpeedX * Time.deltaTime;
        vecWorldPos.y += m_fMoveSpeedY * Time.deltaTime;
        transform.position = vecWorldPos;
    }
}

もし端に着いたら、跳ね返る

次は、端に着いたら跳ね返るようにしましょう。

using UnityEngine;

public class MoveTriangle : MonoBehaviour {
    public float m_fMoveSpeed = 10f;

    private Rigidbody2D m_rRigidbody2D = null;

    void Start() {
        m_rRigidbody2D = GetComponent<Rigidbody2D>();
        // 最初の向きをランダムに決める.
        float fRotZ = Random.Range(0f, 360f);
        Quaternion rRot = Quaternion.Euler(0f, 0f, fRotZ);
        // 最初の速度を設定する.
        m_rRigidbody2D.velocity = rRot * Vector3.up * m_fMoveSpeed;
        // 向きを設定する.
        transform.rotation = rRot;
    }

    private void LateUpdate() {
        // スクリーン座標を取得する.
        Vector3 vecScreenPos = Camera.main.WorldToScreenPoint(transform.position);
        // 現在の速度を取得する.
        Vector3 vecVelocity = m_rRigidbody2D.velocity;
        if ((vecScreenPos.x < 0f && vecVelocity.x < 0f) || (vecScreenPos.x > Screen.width && vecVelocity.x > 0f)) {
            // 左右の端に着いたので、左右に跳ね返る.
            vecVelocity.x = -vecVelocity.x;
        }
        if ((vecScreenPos.y < 0f && vecVelocity.y < 0f) || (vecScreenPos.y > Screen.height && vecVelocity.y > 0f)) {
            // 上下の端に着いたので、上下に跳ね返る.
            vecVelocity.y = -vecVelocity.y;
        }
        // 現在の速度を更新する.
        m_rRigidbody2D.velocity = vecVelocity;
        // 向きを更新する.
        transform.rotation = Quaternion.FromToRotation(Vector3.up, vecVelocity);
    }
}

プログラムのちょこっと解説

今回は「もし端に着いたら、跳ね返る」ために、Rigidbody2Dを使ってみました。
Rigidbody2Dのvelocity(速度)を変更することで、移動する方向を制御することができます。

Rigidbody2D-velocity - Unity スクリプトリファレンス
Linear velocity of the Rigidbody in units per second.

まとめ

Scratch の「もし端に着いたら、跳ね返る」ブロックと同じ動きを Unityで作ってみました。
Scratch で簡単にできていたことも、Unity では少し工夫する必要があったりしますね。

Unity の機能を使い倒して、さらに面白いゲームを作れるようになりましょう。

コメント

タイトルとURLをコピーしました