スクリプトの修正
CharactorManagerスクリプトを以下のように修正します。
public class CharactorManager : MonoBehaviour {
private bool _isJumping;
public bool isJumping
{
get { return _isJumping; }
}
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
/// <summary>
/// 接触した(=着地)
/// </summary>
/// <param name="col"></param>
public void OnCollisionEnter2D(Collision2D col)
{
this._isJumping = false;
}
/// <summary>
/// 接触状態から離れた(=ジャンプ開始)
/// </summary>
/// <param name="col"></param>
public void OnCollisionExit2D(Collision2D col)
{
this._isJumping = true;
}
}
OnCollisionEnter2DとOnCollisionExit2Dという2つのメソッドが新しい要素として登場しました。
OnCollisionEnter2Dは、GameObject(今回の場合charactor)が別のGameObjectと接触した際に呼び出されます。OnCollisionExit2Dは、逆にキャラクターが離れた場合に呼び出されます。
別のGameObjectと接触した際(OnCollisionEnter2D)に床の上にいると判定し、_isJumpingプロパティをfalseに設定します。GameObjectから離れた際にジャンプ中と判断して_isJumpingをtrueに設定します。
GameManager側の修正
続いてGameManagerスクリプト側を以下のように修正します。
public class GameManager : MonoBehaviour {
private GameObject _charactor;
private CharactorManager _charactorScript;
// Use this for initialization
void Start () {
// キャラクターを取得する
this._charactor = GameObject.Find("charactor");
// キャラクターのスクリプトを取得する
this._charactorScript = this._charactor.GetComponent<CharactorManager>();
}
// Update is called once per frame
void Update () {
Debug.Log(this._charactorScript.isJumping);
// 左右のキーで左右に移動
float horizontal = Input.GetAxis("Horizontal");
this._moveCharactor(Vector2.right * 10f * horizontal);
// スペースキーでジャンプ
if (Input.GetKeyDown("space"))
{
this._moveCharactor(Vector2.up * 400f);
}
}
/// <summary>
/// キャラクターを移動させる
/// </summary>
/// <param name="force">移動させる方向と値</param>
private void _moveCharactor(Vector2 force)
{
this._charactor.rigidbody2D.AddForce(force);
}
}
キャラクターに関連づけたスクリプト(CharactorManager)はGetComponent<CharactorManager>();という呼び出しによってGameObjectから取得できます。
今回は値の確認にDebug.Logメソッドを利用しています。Debug.Logメソッドを利用すると、以下の画像のようにConsoleウィンドウに値を出力することができます。
最後に、ジャンプ時にはスペースキーを押しても上昇する力を加えないように、GameManagerスクリプトのUpdateメソッドを以下のように書き換えます。
void Update () {
// 左右のキーで左右に移動
float horizontal = Input.GetAxis("Horizontal");
this._moveCharactor(Vector2.right * 10f * horizontal);
// スペースキーでジャンプ
// ジャンプ中はスペースキーが押されてもさらに上昇しない
if (Input.GetKeyDown("space") && this._charactorScript.isJumping == false)
{
this._moveCharactor(Vector2.up * 400f);
}
}
これでキャラクターが思った通りにジャンプを行うようになりました。
まとめ
今回はキャラクターがキー入力を取得する方法と、ジャンプの判定、コンソールへのデバッグ出力の方法を紹介しました。
これで基本的なキャラクターの移動処理は実装できましたが、移動しても向きが変わらなかったり、ジャンプ中もキャラクターが同じ画像のままです。次回はキャラクターを動きに合わせてアニメーションさせる方法を紹介します。

