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