yamada_yoshiki Posted by

おはようございます!こんにちは!こんばんは!おやすみなさい!
山田です。

次回に引き続きUnityを使用してゲームを作っていきたいと思います!!!

今回は物理エンジン使用して落下等の動きをつけていきます。

Rigidbody2Dを使ってみる

Unityでは物理エンジン(Physice)を使うことでオブジェクトを物理挙動にしたがって動かすことが出来ます。

Rigidbody重力などの力の計算で使用されるコンポーネントです。

ヒエラルキーウィンドウでキャラクターのオブジェクトを選択し、インスペクターウィンドウコンポーネントの追加→Physics2D(2D物理)→Rigidbody2D(2Dリジッドボディ)を選択して追加します。

追加してゲーム実行すると物理法則にしたがってキャラクターが落下すると思います。

物理エンジンオブジェクト落下・追突などリアルな挙動をさせることができる

Collider2Dを使ってみる

Collider当たり判定に使用されるコンポーネントです。

先ほどと同様にコンポーネントの追加→Physics2D(2D物理)→Collider2D(2Dボックスコライダー)を選択して追加すると画像のように緑の枠が出来るとおもいます、これが当たり範囲になります。

地面にも同様にコライダー(Collider)を追加して地面とキャラクターに当たり判定をつけることでキャラクターが落下しなくなります。

左右移動を滑らかに

左右ボタンを押した際の動きがカクカクしているので左右キーが押された時同様に滑らかな動きに変更します。

ソースコードの変更

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class player : MonoBehaviour
{
    Rigidbody2D rigid2D;        // 重力オブジェクト
    float jumpForce = 500.0f;   // ジャンプ力
    float walkForce = 30.0f;    // 移動速度
    float maxWalkSpeed = 20.0f; // 最大速度
    bool leftBtn = false;       // 左ボタン押下フラグ
    bool rightBtn = false;      // 右ボタン押下フラグ
    
    // 左ボタンが押されている時
    public void LButtonDown() {
        leftBtn = true;
    }
    // 左ボタンが押されていない時
    public void LButtonUp() {
        leftBtn = false;
    }
    // 右ボタンが押されている時
    public void RButtonDown() {
        rightBtn = true;
    }
    // 右ボタンが押されていない時
    public void RButtonUp() {
        rightBtn = false;
    }
    // Aボタンが押された時
    public void AButtonDown() {
        // 下に1動かす
        transform.Translate(0, -1, 0);
    }
    // Bボタンが押された時
    public void BButtonDown() {
        // 上にジャンプする
        this.rigid2D.AddForce(transform.up * this.jumpForce);
    }
    
    // スタートメソッド
    void Start() {
        this.rigid2D = GetComponent();
    }

    // アップデートメソッド
    void Update() {
        // 左矢印キー・左ボタンが押されている間
        if (Input.GetKey(KeyCode.LeftArrow) || leftBtn) {
            playerMove(-1);
        }
        
        // 右矢印キーが右ボタン押されている間
        if (Input.GetKey(KeyCode.RightArrow) || rightBtn) {
            playerMove(1);
        }

        // スペースキーが押された時
        if (Input.GetKeyDown(KeyCode.Space)) {
            // 上にジャンプする
            this.rigid2D.AddForce(transform.up * this.jumpForce);
        }
        
        // Bキーが押された時
        if (Input.GetKeyDown(KeyCode.B)) {
            // 下に1動かす
            transform.Translate(0, -1, 0);
        }
    }
    
    // プレイヤの移動
    public void playerMove(int key) {
         // プレイヤの速度
        float speedx = Mathf.Abs(this.rigid2D.velocity.x);
        
        // スピード制限
        if(speedx < this.maxWalkSpeed) {
            this.rigid2D.AddForce(transform.right * key * this.walkForce);
        }
        
        // 動く方向に反転
        if(key != 0) {
            transform.localScale = new Vector3(key*7, 5, 5);
        }
    }
}

左右のボタンが押されているかのフラグを追加し、移動の処理を変更しました。

オブジェクトとメソッドを関連付ける


前回作成したRButtonコンポーネントを追加→イベント→イベントトリガーを選択します。


イベントトリガー新しいイベントタイプを追加(Add New Event Type)→Pointer DownとPointer Upを選択


+ボタンを押してメソッドを追加します。


ヒエラルキーウィンドウからプレイヤーオブジェクトドラッグ&ドロップします。


新しく実装したメソッドと関連付けます。


以前追加したボタンスクリプトは必要なくなったので削除します。

最後に

今回は物理エンジンについて紹介しました。

今回のゲームも下記URLから動かすことが可能です。

http://takuan1019.tk/game3/