UnityでRigidbodyを使ってアスレチックアクションを作ろう

今回作るゲーム

移動やジャンプをして、ゴールを目指すシンプルなアクションゲームです

目次

今回やること

  • プレイヤーの移動
  • プレイヤーのジャンプ
  • アイテムを配置する
  • 制限時間を作る

パッケージのダウンロード

こちらよりパッケージをダウンロードしてプロジェクトに入れて下さい
一応元データも載せておきます
プロジェクトの入れ方はこちら

プレイヤーの移動の作成

プレイヤーの移動のプログラミング

C#の基本的なルールと構造の説明

C#にはいくつかルールがあります。

①スクリプトを作成した時につけた名前と、スクリプトの名前は一致させる
②何をどこに入力するのかエリアを理解する
③エリアとエリアは{}でとじる
④行の最後は;をつける

以上の点をしっかりおさえておきましょう!

スクリプトの作成

Create → C#Scriptをおします

スクリプトの名前はPlayerにします

1-2

プレイヤーの移動は
WS:前進後退、AD:方向転換、スペース:ジャンプにします
早速、Assets → ScriptsにあるPlayerスクリプトをダブルクリックして開きます

コードの入力

では実際に、コードを書いていきましょう。
Scratchで表すと、

というコードを打っていきます

表はこちらにあります。

❶このブロックは「ずっと」ではさまれているので、ゲーム開始後ずっと実行するエリア」に入力します。

❷「もし~なら」を入力していきます。表を見てみると、

if(getabako == 1){}


となっています。条件は違うので()の中は空欄にし、

if(){}

と入力しましょう。

❸条件は「Wキーが押されたら」です。

Input.GetKey(KeyCode.W)

なので、if(){}の()の中にいれます。

if(Input.GetKey(KeyCode.W)){}

となります。

④実行する内容は「10歩動かす」です。

transform.position += transform.TransformDirection(Vector3.forward * 10);

となっているので、

if(Input.GetKey(KeyCode.W))){}

の{}の中に、

transform.position += transform.TransformDirection(Vector3.forward * 10);

をいれます。

if(Input.GetKey(KeyCode.W)){
transform.position += transform.TransformDirection(Vector3.forward * 10);
}
となりました。

画面がこんな風になっていれば正解です。
13-1.png

入力したら、Unityに戻り、Playerスクリプトをプレイヤーにドラッグ&ドロップします

テストプレイをしてWキーをおしてみると…

早すぎて全部突き抜けていきましたね
なので、10の後に「 * Time.deltaTime」を追加で入力しましょう

14

Time.deltaTimeとは?

これを移動の後に入力すると処理の速度が一定になり、ちょうどいい感じになる

同様に他のブロックも入力してみましょう。

○度回すは

transform.Rotate(new Vector3(0, 15, 0));

です

入力したら答え合わせしましょう
20.png

再生ボタンを押してエラーがないか、確認しましょう。

22

プレイヤーの重力処理とジャンプの作成

UnityではRigidbodyというものがあり、これをつけると自動で重力がかかるようになります
まずはRigidbodyをつけ、その後、ジャンプのプログラミングをしていきます
プレイヤーを選択し、AddComponentをおし、検索欄に「ri」と入力し、Rigidbodyを選択します

Contraintsの横の▶︎をおし、FreezeRotationのチェックを全ていれます

画像のような内容のスクリプトを入力するのですが、少し難しい内容になります


以下のスクリプトをそのまま打ちましょう
説明については、コメントで記入してありますので、参考にしてください

入力するスクリプト

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

public class Player : MonoBehaviour
{
    private Rigidbody rb;// Rigidbodyの機能を使うためにrigidbodyという変数を作成
    private bool Grounded;// 地面についているかどうか

    // Use this for initialization
    void Start()
    {
         rb = GetComponent<Rigidbody>();// rbにRigidbodyを代入する
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKey(KeyCode.W))// Wキーがおされたら
        {
            transform.position += transform.TransformDirection(Vector3.forward * 10 * Time.deltaTime);// 前方に10 * 時間経過分動かす
        }
        if (Input.GetKey(KeyCode.S))// Sキーがおされたら
        {
            transform.position += transform.TransformDirection(Vector3.forward * -10 * Time.deltaTime);// 後方に10 * 時間経過分動かす
        }
        if (Input.GetKey(KeyCode.A))// Aキーがおされたら
        {
            transform.Rotate(new Vector3(0, -5, 0));//左回転する        
        }
        if (Input.GetKey(KeyCode.D))// Dキーがおされたら
        {
            transform.Rotate(new Vector3(0, 5, 0));//右回転する        
        }

        if (Grounded == true)// もし、地面に触れていたら、
        {
            if (Input.GetKey(KeyCode.Space))// もし、スペースキーがおされたら、
            {
                Grounded = false;// 地面に触れてないことにする
                rb.AddForce(Vector3.up * 400);// ジャンプする
            }
        }
    }

    void OnCollisionEnter(Collision other)//  地面に触れた時の処理
    {
        if (other.gameObject.tag == "Ground")// もしGroundというタグがついたオブジェクトに触れたら、
            {
                Grounded = true;// 地面に触れたことにする
            }
        }
    }

変数の説明

コードを見てみるとrbやGroundedという変数が使われています
変数についてはUnityでは沢山の種類があるので、詳しくは以下を参考にして下さい

#C#での変数の作り方

①図を参考にして変数を入力していきます。

図1.png

②変数はアクセス修飾子 型 変数名;と入力します。

アクセス修飾子については以下を参考にして下さい。

スライド1.PNG

型については以下を参考にして下さい。

スライド2.PNG

例えば他のオブジェクトでも使用可能なfloat型のgetabakoという変数を作る場合

public float getabako;

と入力します。

Rigidbodyなどのコンポーネントをプログラミングで使えるようにする

基本的にはどのコンポーネントもルールは同じです

①変数の部分に

private Rigidbody rb;

というようにprivate “コンポーネントの名前” “変数の名前”を入力します
②void Start(){}の中に

rb = GetComponent<Rigidbody>();

を入力する
③命令を実行する箇所に任意の命令を入れる

rb.AddForce(Vector3.up * 400);

今回はAddforceというRigidbodyに力をかける命令を与えています

物に触れた時の説明

①衝突処理を入力する箇所に入力します
②触れた時の処理は

void OnCollisionEnter(Collision other){}

の{}の中に記述します
③触れたオブジェクトが何かはオブジェクトの名前、またはオブジェクトについているタグで判断します

if (other.gameObject.tag == "Ground")

今回はGroundというタグがついていたら処理が実行されるようになっています
※タグは今回のチュートリアルでは予めつけてあります

テストプレイをしてみると

スペースキーでジャンプができるので、ゴールを目指しましょう

カメラがプレイヤーについていくようにする

MainCameraをプレイヤーにドラッグ&ドロップします

そうするとカメラがプレイヤーの子オブジェクトになり、プレイヤーについていくようになります

アイテムを配置する

Item → Prefabsにあるアイテムをドラッグ&ドロップします

32

座標を調整します。xは0、yとzは取りやすい位置にするのがオススメです

いっぱい置いてステージを豪華にしましょう。

お疲れ様でした♪

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次