0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

完走賞のQiitanぬいぐるみをお迎えするためにUnityでゲーム作ってみるAdvent Calendar 2023

Day 8

【Unity初歩】~Physicsを使ったプレイヤの移動~

Last updated at Posted at 2023-12-07

はじめに

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」に変更してみます。
image.png

設定する前よりもジャンプの位置が下がり、より重みを感じる現実的なジャンプになりました。

左右移動させるスクリプト

横移動ができるように、🦀オブジェクトにさらに以下のスクリプトを追加してみます。

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…速度ベクトル

動かしてみると…
なんか転がる…

image.png

🦀が転がらないように工夫する

やったことは2つです。

コライダの形を円から楕円に変える

Cicle Collider 2Dを選択していたので、Capsule Collider 2Dに変えて、形も🦀に近づくように少し整えました。

Freeze RotationのZにチェックをつける

Freeze Rotationは指定した軸まわりの回転を防止できます。
image.png

これで純粋な横移動ができるようになりました。

おわりに

転がった時は焦りましたが、横移動も無事にできました。
重力のかかり具合やらを考えながら作るのはやはり大変ですね。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?