Unityでアクションゲームを作る場合、基本的にステージに合わせてプレイヤーを移動させますよね。
プレイヤーの移動やジャンプをさせるコードは簡単に実装することができるので、スクリプトの説明を合わせて紹介します。
もくじ
はじめに
プレイヤーを移動させるためには
- 移動用のスクリプト
- 移動中のアニメーション
- 画像
などが必要になるのですが、今回はアニメーションと画像の作成方法は省略します。
アニメーションを一緒に実装したい場合は各自で用意してください。
また、画像もなんでも良いので、動かせるものを用意しておきましょう。
では早速今回使うコードを紹介していきます。
コードを書いてみよう
プレイヤーを移動させたり、ジャンプさせたりするコードはとても簡単です。
以下のようなスクリプトを新規作成してください。
using UnityEngine;
using System.Collections;
public class Move : MonoBehaviour {
GameObject Player;
int horizon;
int vertical;
// Use this for initialization
void Start () {
Player = GameObject.Find ("Player");
}
// Update is called once per frame
void Update () {
if (Input.GetKey (KeyCode.RightArrow)) {
horizon = 10;
Player.GetComponent<RigidBody2D> ().velocity = new Vector3(horizon, Player.GetComponent<RigidBody2D>().velocity.y, 0);
} else if (Input.GetKey (KeyCode.LeftArrow)) {
horizon = 10;
Player.GetComponent<RigidBody2D> ().velocity = new Vector3(-horizon, Player.GetComponent<RigidBody2D>().velocity.y, 0);
}
if (Input.GetButtonDown ("Jump")) {
vertical = 100;
Player.GetComponent<RigidBody2D> ().velocity = new Vector3 (Player.GetComponent<RigidBody2D> ().velocity.x, vertical, 0);
}
}
}
ではこのスクリプトで使っているコードを1つずつ説明していきます。
まず前提として、
- 動かすオブジェクトが「Player」
- 横移動の速さが「horizon」
- ジャンプの高さが「vertical」
に設定してあります。
Start( ) {}
-> プレイヤーのGameObjectを取得しています。
(“XXX”)内は自由ですが、後で作成するプレイヤーのオブジェクトと同じ名前にしてください。
Input.GetKey
-> キーボードの○○を入力したら〜する。
という処理を実行させます。
Input.GetKey(KeyCode.RightArrow)にした場合は「→」を押した時
Input.GetKey(KeyCode.LeftArrow)の場合は「←」を押した時となっています。
他にもInput.GetButton(“XXX”)などもあるので、キーボードに合わせて取得できます。
horizon = 10;
-> キーボードの「→」が入力されたら「horizon」の値を10にします。
GetComponent<RigidBody2D>().velocity
-> プレイヤーの移動処理をしています。
velocity = new Vector3(xにかける値, yにかける値, zにかける値)をそれぞれ設定しましょう。
横移動はx軸を変更すれば良いので、xに「horizon」を指定しています。
yにPlayer.GetComponent<RigidBody2D>().velocity.yにしているのは、詳しくは後述するのですが0にしてしまうとジャンプ中に挙動が変わってしまいます。
Input.GetButtonDown("Jump")
-> スペースキーを押した時に処理を実行します。
先ほどInput.GetKeyでも説明したように○○を押した時に○○を実行するというものなのですが、「Down」をつけることによって「○○を押した時だけ」実行します。
Downが無い場合は、押し続けている間呼び続けます。
velocity
-> スペースキーを押したらジャンプさせるようになっています。
ジャンプは縦の移動なのでyにvelocityを指定してください。
こちらの「GetComponent<RigidBody2D>().velocity.x」についても後述します。
このようなコードを書くだけで簡単にプレイヤーを動かすことができますが、このコードで説明しているvelocityで注意する点があります。
velocityの注意点
GetComponent<RigidBody2D>().velocityを使う上で注意する点を説明します。
velocityは基本的に「プレイヤーなどのオブジェクトを移動させる」というような時に使います。
ただ左右に移動させるだけであれば、「GetComponent<RigidBody2D>().velocity = new Vector3(10, 0, 0);」にすれば良いのですが、左右移動だけというのはあまりありません。
前回の記事ではジャンプの処理を「GetComponent<RigidBody2D>().velocity = new Vector3(x, 100, y)」にしているので、左右とジャンプで両方ともvelocityを使っていました。
このコードのように「左右に移動しながらジャンプする」などの処理の場合、「new Vector3(10, 0, 0)」でyの値を0にしてしまっています。
すると左右の移動中にジャンプをした場合、せっかくyに100の値を入れたのにその直後に左右移動を呼び出しているので、yの値が0になってしまいます。
つまりジャンプ中にvelocityを0にしてしまうと、yにかけた力がなくなってしまうので結果的にジャンプが低くなってしまいます。
ではそのようにならないようにするためにはどのようにすれば良いか。
前回のコードを見てみてください。
GetComponent().velocity = new Vector3(10, GetComponent<RigidBody2D>().velocity.y, 0);
のようにすることで、現在のvelocity.yを入れることができます。
例えジャンプでyの値が変わったとしてもvelocity.yが変わるだけなので、ジャンプの挙動は変わらないというわけですね。
長くなりましたが、velocityを使う上での注意点は以上です。
同じようにしてジャンプのスクリプトにもvelocity.xを入れてあげてください。
オブジェクトを配置しよう
スクリプトが完成しプレイヤーを動かす準備ができたので、実際にUnity上で配置していきましょう。
必要になるのは
- 「プレイヤーの画像」
- 「足場」
- 「カメラ」
- 「前回のコード」
です。
プレイヤーオブジェクトには
- 「Collider2D」
- 「RigidBody2D」
- 「コード」
をそれぞれ追加してください。
同じように足場のオブジェクトにも「Collider2D」を追加しましょう。
※プレイヤーの名前はコード内で指定した名前と同じものにしてください。
続いて「RigidBody2D」の数値を変更していきます。
この値はジャンプ力、重力、オブジェクトのサイズなどによって変わってくるのですが、各自で調整してください。
(先ほどのコードがアタッチされているのを確認しましょう)
コードのvelocityを変更するか、重力を強くするかでジャンプ力を調整してください。
さらにこちらの記事で紹介している「カメラをプレイヤーと一緒に移動する」方法を使うことで、カメラ外にプレイヤーが出てしまう危険性は無くなります。
試してみてください。
まとめ
今回の方法を使えば簡単にプレイヤーを移動させることができるようになりました。
velocityはアクションゲームを作る上で、重要なコードになるので使い方やコードの形式を覚えておくと後々楽になるはず。
この移動に合わせてアニメーションを再生することで、より走っているように見せることができると思います。
ぜひ使ってみてください。
ではまた。