半ニートブログ

最低限の収入で生き永らえながら、人生の不安と向き合うブログです

Unity備忘録: Rigidbodyを使用した移動でプレイヤーの回転値を固定する方法

ほげぴよです。

今回から趣味で触っているUnityで気づいたことを記録していくことにしました。

 

 今回は2Dアクションゲーム等を制作するときによく引っかかってしまいそうな点(自分が引っかかっただけ)を紹介します。

 

まず、プレイヤーの移動処理を行うために下記のようなコードをプレイヤーに貼り付けました。

 

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    private Rigidbody2D rigidbody;

    private float x;

    [SerializeField]
    private float speed = 4.0f;


    // Use this for initialization
    void Start ()
    {
        rigidbody = this.GetComponent<Rigidbody2D>();
    }


    // Update is called once per frame
    void Update ()
    {
        x = Input.GetAxisRaw("Horizontal");
    }


    void FixedUpdate()
    {
        if(x != 0)
            rigidbody.velocity = new Vector2(x * speed, rigidbody.velocity.y);
    }
}

 

これでいざテストプレイしてみると…問題なく操作は‟できます。

ただ、移動してステージの端に差し掛かったりすると、プレイヤーが転がるという思わぬ動作になってしまいました。

 

 原因がしばらくわからなくて困っていましたが、色々調べたことでようやく突き止められました。

 

対処法は簡単で、InspectorのRigidbody2DコンポーネントからConstraintsをクリックし、中にあるFreeze Position Zにチェックを入れるだけです。

 

名前の通りですが、オブジェクトのZ軸回転を固定する機能です。(3DだとX, Y軸の固定項目もあります)これを使用することでプレイヤーが転がることはなくなります。

 

物理演算を売りにしたゲームでは回転してもよい思いますが、アクションゲームではストレスにしかならないと思ったので固定しました。

 

Unityは衝突判定や物理演算など、複雑な処理をツール側で行ってくれるので便利ですが、なんとなくで使っていた部分も多くこういった壁にぶち当たった時は非常に困りました。