はじめに
Pysicsをオブジェクトに適用させる方法を学んだので、Pysicsを使ったジャンプと横移動を実装してみます。
前回の記事
Pysicsを使ったオブジェクトの移動
最初に実装したオブジェクトの移動はオブジェクトの座標を更新するというものでした。
ですが、Pysicsを使ったオブジェクトの移動は、「オブジェクトに力を加える」ものになります。
ジャンプをさせるスクリプト
🦀オブジェクトに以下のスクリプトを追加してみます。
using UnityEngine;
public class PlayerController : MonoBehaviour
{
Rigidbody2D rigidBody2D;
float jumpForce = 680.0f;
// Start is called before the first frame update
void Start()
{
this.rigidBody2D = GetComponent<Rigidbody2D>();
}
// Update is called once per frame
void Update()
{
// ジャンプ
if (Input.GetKeyDown(KeyCode.Space))
{
this.rigidBody2D.AddForce(transform.up * this.jumpForce);
}
}
}
AddForce
…オブジェクトに力を加えられるメソッドです。(そのまんまですね、すみません。)
スクリプトがかけたらオブジェクトにアタッチします。
動かしてみると、ジャンプができました!
すごいジャンプ力でふわふわと帰ってきます。
重力の調整
Rigidbodyにかかる重力の大きさをGravity Scaleで調整できます。
数字が大きいほど重力が強くなります。ので、「3」に変更してみます。
設定する前よりもジャンプの位置が下がり、より重みを感じる現実的なジャンプになりました。
左右移動させるスクリプト
横移動ができるように、🦀オブジェクトにさらに以下のスクリプトを追加してみます。
using UnityEngine;
public class PlayerController : MonoBehaviour
{
Rigidbody2D rigidBody2D;
float jumpForce = 680.0f;
float walkForce = 30.0f;
float maxWalkSpeed = 2.0f;
// Start is called before the first frame update
void Start()
{
this.rigidBody2D = GetComponent<Rigidbody2D>();
}
// Update is called once per frame
void Update()
{
// ジャンプ
if (Input.GetKeyDown(KeyCode.Space))
{
this.rigidBody2D.AddForce(transform.up * this.jumpForce);
}
// 横移動
int key = 0;
if (Input.GetKey(KeyCode.RightArrow)) { key = 1; };
if (Input.GetKey(KeyCode.LeftArrow)) { key = -1; };
// 速度
float speed = Mathf.Abs(this.rigidBody2D.velocity.x);
// スピード上限
if (speed < this.maxWalkSpeed)
{
this.rigidBody2D.AddForce(transform.right * key * this.walkForce);
}
}
}
Mathf.Abs
…絶対値を返却する
velocity
…速度ベクトル
動かしてみると…
なんか転がる…
🦀が転がらないように工夫する
やったことは2つです。
コライダの形を円から楕円に変える
Cicle Collider 2Dを選択していたので、Capsule Collider 2Dに変えて、形も🦀に近づくように少し整えました。
Freeze RotationのZにチェックをつける
Freeze Rotationは指定した軸まわりの回転を防止できます。
これで純粋な横移動ができるようになりました。
おわりに
転がった時は焦りましたが、横移動も無事にできました。
重力のかかり具合やらを考えながら作るのはやはり大変ですね。