読者です 読者をやめる 読者になる 読者になる

ことばアルバム

にわかエンジニアのにわか備忘録

FlappyBirdの重力世界を再現してみる

お久しぶりです。
ずっと、「FlappyBirdの重力の掛かり方って、デフォルトのやつとは何処か違うよなー」って思ってたのですが、どうやったら再現出来るか色々試してみました。


初期設定

こんな感じです

てきとーにオブジェクトを配置して、↓のてきとーなスクリプトを貼付けただけです。

using UnityEngine;
using System.Collections;

public class FlappyScript : MonoBehaviour {

  void Update()
  {
    if (Input.GetMouseButtonDown (0))
    {
      Jump ();
    }
  }

  private void Jump()
  {
    rigidbody.velocity = Vector3.zero;
    rigidbody.AddForce (0, 400.0f, 0);
  }
}

いまいち、どこかFlappy Birdではありません。
本家よりもフンワリとジャンプしてる印象です。
ここに手を加えて本家に近づけていきたいと思います。


Gravityの設定

Unityで物理演算用のパラメータとして、Physics.gravityというものがあります。
基本はPhysics.gravity = new Vector3(0, -9.8f, 0)というような値がセットされているようで、この右辺をいじってあげれば重力の強さが変更できるようです。
そこで、今回はnew Vector3(0, -20.0f, 0)をセットしてみます。

こんな感じです

using UnityEngine;
using System.Collections;

public class FlappyScript : MonoBehaviour {

  void Awake()
  {
    Physics.gravity = new Vector3(0, -20.0f, 0);
  }

  void Update()
  {
    if (Input.GetMouseButtonDown (0))
    {
      Jump ();
    }
  }

  private void Jump()
  {
    rigidbody.velocity = Vector3.zero;
    rigidbody.AddForce (0, 400.0f, 0);
  }
}

前回のよりもシュッとしてだんだんらしくなってきました。
ただ、まだジャンプした際の初速が遅いようなきがします。


ForceMode

今回、ジャンプさせるためにAddForce()というメソッドを使っていますが、これの引数にForceModeというものを設定することができます。
これを設定してあげることで、力の加え方を好きなように変更する事ができます。
今回は、ForceMode.VelocityChangeにしてみます。
これの効果としては、本家リファレンスには「Add an instant velocity change to the rigidbody, ignoring its mass.」と書いてあります。
たぶん、【それの質量を無視して即時に加速度を変化させる】という事です。

こんな感じです

using UnityEngine;
using System.Collections;

public class FlappyScript : MonoBehaviour {

  void Awake()
  {
    Physics.gravity = new Vector3(0, -20.0f, 0);
  }

  void Update()
  {
    if (Input.GetMouseButtonDown (0))
    {
      Jump ();
    }
  }

  private void Jump()
  {
    rigidbody.velocity = Vector3.zero;
    rigidbody.AddForce (0, 10.0f, 0, ForceMode.VelocityChange);
  }
}

だいぶらしくなってきました。
ただ、初速がシュっとした分、もうちょっとスッと落ちてほしくなってしまいました。


Mass

物体の重さの話です。
今までは軽すぎたためにフンワリ落ちていたのだろう、ということで、質量を増やしてあげます。
本当はインスペクタの方からいじった方が早いのですが、今回はソースコード上から設定します。
デフォルトが1なので、5000倍重くしてみました。

こんな感じです

using UnityEngine;
using System.Collections;

public class FlappyScript : MonoBehaviour {

  void Awake()
  {
    Physics.gravity = new Vector3(0, -20.0f, 0);
    rigidbody.mass = 5000.0f;
  }

  void Update()
  {
    if (Input.GetMouseButtonDown (0))
    {
      Jump ();
    }
  }

  private void Jump()
  {
    rigidbody.velocity = Vector3.zero;
    rigidbody.AddForce (0, 10.0f, 0, ForceMode.VelocityChange);
  }
}

すっげー良い感じになってきました。
いよいよ仕上げです。


FrameRate

実は、たぶんいままでのやつは全部30fpsで動いていました。
Unityのデフォルトの設定ではfpsは30に設定されているっぽいので、もっと滑らかに動かすために、fpsを60に変更します。

こんな感じです

using UnityEngine;
using System.Collections;

public class FlappyScript : MonoBehaviour {

  void Awake()
  {
    Application.targetFrameRate = 60;

    Physics.gravity = new Vector3(0, -20.0f, 0);
    rigidbody.mass = 5000.0f;
  }

  void Update()
  {
    if (Input.GetMouseButtonDown (0))
    {
      Jump ();
    }
  }

  private void Jump()
  {
    rigidbody.velocity = Vector3.zero;
    rigidbody.AddForce (0, 10.0f, 0, ForceMode.VelocityChange);
  }
}

良いですね。


おわり

こんな感じで、いくつかパラメータを変更してあげることで結構本家に近づいたと思います。
ただ、自分は作者じゃないので具体的なパラメータや、本当にそこをいじってるのかどうかとかは分かりません、、

ただ、漠然とした「こういう動きってどうやって作ってるんだろう?」のヒントになったら良いなって感じです。
お疲れ様でした。