Unityでの自機の基本的な移動方法

Unity 2Dのサンプルやチュートリアルを見ていると、何の説明もなくスクリプトでtransformなどを変更して自機を移動させる方法が出てきますが、実はあまりよく理解していなかったので、一番基本的なところから調べてみました。
まず、transformとは何か、というところですが、これはInspectorの一番上に表示される、Position,Rotation,Scaleの値をまとめて保持している変数です。アタッチしているスクリプト内でいきなり「transtform」と書くと、アタッチされているGameObjectのtransformの情報をすぐ取得することができます。
自機(に限らずGameObject全般)を移動させる方法として、まずtransformのpositionを直接書き換える方法があります。昔ながらのゲームを作る方法ですね。
注意点として、transform.position.xでX座標を取得することができますが、この値は読み取り専用なので、直接指定することができません。transform.positionにVector3型の変数を指定することにより位置が変化します。

void Update ()
{
	Vector3 v = new Vector3 (transform.position.x + 0.1f, transform.position.y, transform.position.z);
	transform.position = v;
}

これで、毎Update毎に、x座標が0.1増えていきます。
また、Unity得意の物理演算を使用した移動方法もあります。単純な移動だけでしたらばpositionを変更するのでもいいのですが、例えばアクションゲームなどでジャンプをして障害物にぶつかった時の挙動、など、複雑な条件で移動する場合には、物理演算を使用したほうが圧倒的に楽になります。
物理演算を行うには、Ridgidbody 2Dコンポーネントをアタッチして、それに対して命令を与えます。スプライトの位置そのものを変化させるわけではない、というのが大きな違いです。

void Update ()
{
	Rigidbody2D r = GetComponent<rigidbody2D>();
	r.velocity = Vector2.right * 1;
}

rigidbodyの取得方法は、Unity 5以前と書き方が変わり、GetComponentを使用します。
rigidbodyのvelocityはVector2型なので、Vector2で指定します。
上記では、Vector2.rightというのを使っていますが、これは常に(1,0)を返すベクトルです。似ているものに、transform.rightというものがあるのですが、これは、アタッチされているスプライトがもし回転していると、そのスプライトから見た右方向、という意味になるので、意味合いが異なってきます。(Vector2.up/transform.upも同様)
また、アクションゲームでジャンプするときや、何かを蹴っ飛ばして衝撃を加える、というときの移動方法として、velocityを直接変更するのではなく、AddForceを使ってRigidbody2Dに力を加える、という方法もあります。

void Update ()
{
	if (Input.GetKey(KeyCode.Space)) {
		Rigidbody2D r = GetComponent<rigidbody2D> ();
		r.AddForce (new Vector2 (1, 0));
	}
}

上記で、スペースキーを押している間だけ加速するような動きになります。
この方法だと、例えばスプライトの重量や、置いてある場所の摩擦係数などによっても実際の動きが変わってきますので、よりリアルな挙動を作ることができます(positionだけの変更で「氷の床」なんかを作るのは結構大変そうです)
以上、基本的なところでした。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク