前回、Unityの基本的な操作をおさらいしたので、いよいよゲームっぽい動作、二段ジャンプの実装をしてみます。
プロジェクトは前回のものをそのまま流用します。
スクリプトの準備
- メインメニュー[Assets][Create][C# Script]を実行します。
- <Project>ウィンドウに”NewBehaviourScript”が追加されるので、名前を”Player Control”に変更しておきます。
- これを<Project>ウィンドウから<Hierarchy>ウィンドウのPlayerの上にドラッグ&ドロップします。
- <Inspector>でPlayerにPlayer Control(Script)が追加されているのを確認します。
これでスクリプトを書く準備が整いました。
ジャンプするコードを書く
<Inspector>でPlayerControlをダブルクリックすると、Unityのスクリプトエディタが起動します。初期状態では下記のようになっているはずです。
using UnityEngine;
using System.Collections;
public class PlayerControl : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
}
Unityはゲームフレーム毎に各オブジェクト(ここではPlayerControl)のUpdate関数を呼び出すので、Updateの中に任意のコードを追加することでPlayerを操ることができます。
Update関数を下記のように書き換えます。
// Update is called once per frame
void Update () {
// マウスをクリックするとジャンプする
if (Input.GetMouseButtonDown(0))
{
this.rigidbody.velocity = Vector3.up * 8.0f;
}
}
再生ボタンを押してから、ゲーム画面でマウスをクリックするとジャンプできるようになりました。
Playerが傾いてしまう問題の修正
ジャンプボタンを繰り返していると、Playerが傾いてきてしまう問題があることに気づきます。これを修正するために移動・回転をロックします。
<Inspector>RigidbodyのConstraintsから下記にチェックをつけます。
Freeze Position z
Freeze Rotation x, y, z
これでチェックを付けた軸の運動が無視されるようになりました。
何回でもジャンプできてしまう問題の修正
ジャンプの回数を覚えておく変数 restJumps を用意してジャンプの回数を管理します。
コードは下記のようになりました。
public class PlayerControl : MonoBehaviour
{
private int restJumps = 2;
※中略※
// Update is called once per frame
void Update ()
{
// マウスをクリックするとジャンプする
if (Input.GetMouseButtonDown(0))
{
if (restJumps > 0)
{
this.rigidbody.velocity = Vector3.up * 8.0f;
restJumps--;
}
}
}
}
ちなみにここでは、残りジャンプ回数で管理していますが、numJumpsなどジャンプした回数で管理してもいいと思います。
接地する度にジャンプ回数をリセットする
さて、まだ問題が残っています。
今度は2回しかジャンプできなくなってしまたったので、接地する度にジャンプ回数をリセットするようにします。
<Hierarchy>でFloorを選んで、<Inspector>上部のTagメニューから[Add Tag...]を実行します。つづいて、TagMangerでElement 0に”Floor”と入力します。
このタグを接地判定(当たり判定)の際の識別に使うことになります。
つづいてコードを修正して、下記の関数を追加します。
void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.tag == "Floor")
{
// ジャンプ回数をリセットする
restJumps = 2;
}
}
OnCollisionEnter関数はスクリプトに関連付けてあるオブジェクト(ここではPlayer)が他の物体と衝突すると呼ばれます。
最後に、Playerが空中にいるのもなんなので、座標をPosition(x, y, z) = 0, 0, 0にセットして今回の実装は終了です。