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);
}
}
良いですね。
おわり
こんな感じで、いくつかパラメータを変更してあげることで結構本家に近づいたと思います。
ただ、自分は作者じゃないので具体的なパラメータや、本当にそこをいじってるのかどうかとかは分かりません、、
ただ、漠然とした「こういう動きってどうやって作ってるんだろう?」のヒントになったら良いなって感じです。
お疲れ様でした。